1. 문제분석
<?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)");
}
?>
문제는 요청의 USER_AGENT를 기반으로 사용자를 구분한다.
이 때 해당 USER_AGENT에 해당하는 데이터가 없으면 insert 구문을 통해 새로 데이터를 생성한다.
2. 풀이
해당 문제는 간단한 SQLI 문제이다.
ip 변수에 대입되는 $_SERVER['REMOTE_ADDR] 부분은 수정할 수 없으므로 HTTP_USER_AGENT 부분을 변경해주어야 한다.
따라서 insert 구문을 진행할 때 $agent부분에 다음과 같이 들어가도록 요청 내 user-agent를 변경해 요청해준다.
rootable','1','admin'),('123
이후 useragent를 rootable로 변경하여 접근해주면 문제가 풀린다.
(참고)
user-agent에서 #은 URL encoding 없이 그대로 들어가므로 %23이 아니라 #이라고 그대로 작성해주어야 한다.
즉, User-agnet 부분에 [ rootable','1','admin')# ] 과 같이 입력해주어도 정상적으로 insert되고 문제를 solve할 수 있다.
'Solve Problem > Webhacking.kr' 카테고리의 다른 글
webhacking.kr old-22 writeup (0) | 2020.04.23 |
---|---|
webhacking.kr old-13 writeup (0) | 2020.04.22 |
webhacking.kr old-07 writeup (0) | 2020.04.21 |
webhacking.kr old-06 writeup (0) | 2020.04.21 |
webhacking.kr old-02 writeup (0) | 2020.04.21 |