목표 : HTTP User Agent, SQLi
바로 소스부터 보자
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 8</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<br><br>
<center>
<?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)");
}
?>
<a href=./?view_source=1>view-source</a>
</body>
</html>
PHP
복사
solve부터 확인하면 $ck[0] 에 “admin”값이 들어가야된다.
http 프로토콜에 대한 이해가 필요한 몇 코드가 보인다.
$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();
}
PHP
복사
$agent는 http user agent 값을 받아오고 앞 뒤 공백을 제거 trim 해서 저장
$_SERVER['REMOTE_ADDR'] 는 현재 페이지를 보고 있는 사용자의 IP → 다시 사용되지 않는다.
만약 $agent 에 from 으로 공백을 포함한 from 형태로 DB를 부르는 명령어가 있을 경우 deny
User Agent 관련 설명 (클릭)
$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);
PHP
복사
db를 불러오고 count_ck[0] 에는 chall8 db의 id 열 내 데이터 수가 들어간다.
id 개수가 70개가 넘으면 DB에서 삭제한다.
ck, result 에는 현재 접속한 사용자의 HTTP USER AGENT와 같은 agent 값을 가지는 id를 출력한다.
if($ck){
echo "hi <b>".htmlentities($ck[0])."</b><p>";
if($ck[0]=="admin"){
mysqli_query($db,"delete from chall8");
solve(8);
}
}
PHP
복사
그 id 값이 “admin”이면 문제는 풀린다.
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)");
}
PHP
복사
만약 현재 접속 사용자의 Agent값과 같은 Agent를 가지는 내용이 DB에 없었다면 처음에 수집한 agent와 ip, id 값을 넣는다.
즉 다음이 핵심 쿼리문이다.
insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')
USER-AGENT 값은 Burp Suite 툴을 이용해 손 쉽게 조작이 가능하다.
$agent 값을 조정해 SQL injection으로 id 값에 ‘admin’을 넣으면 된다.
$agent 값에
aaa’,’1.1.1.1’,’admin’),values(’bbb
를 입력하면
values(’aaa’,’1.1.1.1’,’admin’),values(’bbb’,’{$ip}’,’guest)
가 된다.
Burp Suite를 통해 User-Agent 값을 바꿔주자
에러가 났다..음 문법이 틀렸나
들어갔다! 이제 User-Agent 값을 aaa로 설정하고 다시 들어가보자