이제 다짜고짜 틀렸다고 하는건 놀랍지도 않다. index.phps를 보자.
<hr>
Challenge 33-1<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
if($_GET[get]=="hehe")
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>
사실 뭘 위한 문젠지 진짜 모르겠는데..
$_SERVER의 PHP_SELF는 자기 자신을 가리키는 것이다.
저대로 출력하면 이런 모양이 나온다.
<script>document.write("<a href=http://webhacking.kr/challenge/bonus/bonus-6/index.phps>/challenge/bonus/bonus-6/index.phps</a>");</script>
좀 보기에도 이상하긴한데... 문제가 나타나는건 get인자로 hehe를 받으면 된다고 한다.
그러면 그냥.. 현재 경로에 ?get=hehe 를 적어주면 Next로 넘어갈 수 있다. 이러면 클리어인줄 알았는데, next를 누르니 다음 문제가 나왔다.
진짜 놀랠뻔했다. 이렇게 끝나면 안되는게 맞지 암
<hr>
Challenge 33-2<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
if($_POST[post]=="hehe" && $_POST[post2]=="hehe2")
{
echo("<a href=##>Next</a>");
}
else
{
echo("Wrong");
}
?>
옳거니 이 문제는 get 과 post를 단디 알고 있나 보려고 낸 문제인가보다.
POST값은 브라우저로 보내기 참 거시기하므로 디버거 도구를 사용하기로 한다.
대강 이런 모양이다.
POST http://webhacking.kr/challenge/bonus/bonus-6/lv2.php HTTP/1.1
Host: webhacking.kr
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID={}; kk=1
post=hehe&post2=hehe2
그러면 주소가 또 하나 뜬다. 또 index.phps를 봐야한다.
<hr>
Challenge 33-3<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
if($_GET[myip]==$_SERVER[REMOTE_ADDR])
{
echo("<a href=##.php>Next</a>");
}
else
{
echo("Wrong");
}
?>
내 아이피를 myip에 넣어서 적어주면 될 것 같다.
근데 그럼 또 나온다.
<hr>
Challenge 33-4<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
if($_GET[password]==md5(time()))
{
echo("<a href=###>Next</a>");
}
else
{
echo("hint : ".time());
}
?>
타임스탬프를 찍어주는데 여기서 잠깐 멈칫했다.
time은 계속 변하는데 어떻게 맞추나. 근데 잘생각해보면 그냥 몇십초 땡겨서 새로고침 하고 있으면 되는거였다. 허무...
md5(time()+10) 을 해줘서 얻은값으로 새로고침하고 있으면 또 Next가 나온다.
<hr>
Challenge 33-5<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
if($_GET[imget] && $_POST[impost] && $_COOKIE[imcookie])
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>
POST, GET, COOKIE다 있어야 통과 시켜준다고 한다
POST http://webhacking.kr/challenge/bonus/bonus-6/md555.php?imget=1 HTTP/1.1
Host: webhacking.kr
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID={}; kk=1;imcookie=hi
impost=1
요렇게 하면 3종을 한방에 넘길 수 있다. 또 Next...
<hr>
Challenge 33-6<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
if($_COOKIE[test]==md5("$_SERVER[REMOTE_ADDR]") && $_POST[kk]==md5("$_SERVER[HTTP_USER_AGENT]"))
{
echo("<a href=###>Next</a>");
}
else
{
echo("hint : $_SERVER[HTTP_USER_AGENT]");
}
?>
cookie의 test값에 나의 아이피를 md5,
post값으로 md5화한 나의 http user agent를 실어 보내면 된다.
이제 끝날때좀 됐다고 생각하지만 안끝났다. 아직있다
<hr>
Challenge 33-7<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
$_SERVER[REMOTE_ADDR]=str_replace(".","",$_SERVER[REMOTE_ADDR]);
if($_GET[$_SERVER[REMOTE_ADDR]]==$_SERVER[REMOTE_ADDR])
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong<br>".$_GET[$_SERVER[REMOTE_ADDR]]);
}
?>
아이피에서 .을 빼고 변수에 넣는데 얘를 변수명으로 쓰고 싶은 모양이다.
요즘은 $_SERVER에 들어가는 변수값은 다시 할당 해줄 수 있다는게 포인트다. 결국 변한건 고대로 변하기때문에, if에서 원하는 값은 전부 똑같은 값이다. 아이피니까 따로 올리진 않겠다..
<hr>
Challenge 33-8<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
extract($_GET);
if(!$_GET[addr]) $addr=$_SERVER[REMOTE_ADDR];
if($addr=="127.0.0.1")
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>
extract는 전에도 한번 나왔지만 그냥 변수로 쓰겠다는거라 큰 의미는 없다.
$_GET[addr]에 값이 할당되어 있지 않으면 $addr에 원격 아이피, 즉 내 아이피를 넣는다고 말하고 있으므로
$_GET[addr] = 127.0.0.1; 해주어 패스하자
<hr>
Challenge 33-9<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
for($i=97;$i<=122;$i=$i+2)
{
$ch=chr($i);
$answer.=$ch;
}
if($_GET[ans]==$answer)
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>
97부터 122까지의 아스키코드를 출력하라는건데 요 아스키코드들은 왠만하면 다 알것 같다. 바로 알파벳 소문자다.
근데 2씩 뛰고 있다. 2씩 뛰면 이런 모양이 되겠지?
acegikmoqsuwy
넣어주고 넘어간다. 벌써 10번.. 이제 끝나겠지 하는 막연한 생각을 가져본다.
<hr>
Challenge 33-10<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
<?
$ip=$_SERVER[REMOTE_ADDR];
for($i=0;$i<=strlen($ip);$i++)
{
$ip=str_replace($i,ord($i),$ip);
}
$ip=str_replace(".","",$ip);
$ip=substr($ip,0,10);
@mkdir("answerip/$ip");
$answer=$ip*2;
$answer=$ip/2;
$answer=str_replace(".","",$answer);
$pw="###";
$f=fopen("answerip/$ip/$answer.$ip","w");
fwrite($f,"Password is $pw\n\nclear ip : $_SERVER[REMOTE_ADDR]");
fclose($f);
?>
좀 읽어야되는 길이가 나와싸.
ip길이만큼 돌면서 해당하는 숫자를 ord해주고 .을 없애는둥 여러 공정을 거치는데 요대로 폴더가 만들어지는것 같고.
구해지는데로 그냥 경로를 넣어주면된다. 내가 매번 말하지만 요런걸 일일히 다 하고 있을 필요가 없다. PHP는 깔기 쉬우니 그냥 해보는게 시간을 절약하는 길이다... ㅠㅠ
어쨌든 넣으면 끝난다. 쓸데없이 길고 점수도 짠... 문제..