728x90
<?php
$agent=trim(getenv("HTTP_USER_AGENT"));
$ip=$_SERVER['REMOTE_ADDR'];
if(preg_match("/from/i",$agent)){
echo("<br>Access Denied!<br><br>");
echo(htmlspecialchars($agent));
exit();
}
$db = dbconnect();
$count_ck = mysqli_fetch_array(mysqli_query($db,"select count(id) from chall8"));
if($count_ck[0] >= 70){ mysqli_query($db,"delete from chall8"); }
$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");
$ck = mysqli_fetch_array($result);
if($ck){
echo "hi <b>".htmlentities($ck[0])."</b><p>";
if($ck[0]=="admin"){
mysqli_query($db,"delete from chall8");
solve(8);
}
}
if(!$ck){
$q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
echo("<br><br>done! ({$count_ck[0]}/70)");
}
?>
HTTP 메시지의 헤더에 보면 HTTP_USER_AGENT가 있다. 클라이언트의 브라우저 정보를 담고 있다.
HTTP_USER_AGENT를 가지고 db에서 id를 조회 후 admin이면 문제가 풀린다.
db에 없는 HTTP_USER_AGENT 정보라면 insert 문을 실행한다.
admin을 insert 후 조회한다면 문제가 풀릴 것이다.
Burp Suite를 이용해 메시지를 가로챈 후 User-Agent를 수정한다.
a', '1','admin'), ('b 를 입력하면 insert 문은 다음과 같이 완성된다.
insert into chall8(agent,ip,id) values('a','1','admin'),('b','내 ip','guest')
하나의 insert 문으로 두 개의 정보를 삽입한다. 그리고 나서 a라는 user-agent 정보를 이용해 조회하면 admin이 반환된다.
새롭게 메시지를 가로채고 User-Agent를 a로 바꾸어 전송한다.
728x90