webhacking.kr 8번 문제풀이 Write Up 입니다.
접속했더니 뜬금없이 뭐가 완료되었다고 합니다.
새로고침을 했더니 hi guest라는 글자가 있습니다.
(처음 접속 시 상황에 따라 [그림 2]가 먼저 나올 수도 있습니다.)
view-source를 눌러보면 [그림 3]과 같은 코드가 나옵니다.
<?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)");
}
?>
php부분만 따로 가져왔습니다.
소스코드를 분석해보면 이렇습니다.
1. 브라우저 정보와 IP를 각각 $agent, $ip에 저장하는데, agent의 경우 preg_match로 특정 문자열을 filtering합니다.
2. $count_ck 쪽 영역은 SQL문 결과가 70개가 넘어가면 해당 테이블의 값을 삭제합니다.
3. $result의 SQL문을 실행시켜 결과가 있는 경우 결과 출력, 그렇지 않을 경우 테이블에 새로 항목을 추가합니다.
[그림 2]의 hi guest는 echo "hi <b>".htmlentities($ck[0])."</b><p>"; 코드로 인해 나오는 것임을 알 수 있습니다.
$result SQL문의 결과가 guest였다는 것인데, 이게 admin이 되면 solve()가 작동됩니다.
[그림 1]의 done!이 나온 이유는 $result의 결과가 나오지 않아 새로 등록을 하고 나온 메시지임을 알 수 있습니다.
새로 등록 할 때 사용된 SQL문은 insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest') 입니다.
agent, ip, id를 등록하는데, id값은 guest로 고정이 된 것을 확인할 수 있습니다.
이 id를 SQL Injection을 통해 admin으로 바꿔 보겠습니다.
insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest') 문에서 값을 수정할 수 있는 변수는 $agent입니다.
해당 변수를 이용하여 Injection 해보겠습니다.
insert into chall8(agent,ip,id) values('asdf','0.0.0.0','admin')#','{$ip}','guest')
이렇게 바꿔보겠습니다.
이렇게 되면 agent는 asdf, ip는 0.0.0.0, id는 admin이 됩니다.
Chrome 기준으로 개발자 도구 Network conditions 탭에서 agent 변경이 가능합니다.
query error 없이 등록이 완료된 것 같습니다.
이제 방금 등록한 값을 불러와야 합니다.
$result의 구문은 select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'인데,
방금 등록한 agent의 값을 SQL문에 넣으면 결과가 admin이 나올 것입니다.
방금 등록했던 agent 값으로 변경합니다.
새로고침 후 정상적으로 결과가 admin이 나오면 정답처리 됩니다.
'CTF > webhacking.kr' 카테고리의 다른 글
[CTF] webhacking.kr 11번 Write-Up (0) | 2022.10.14 |
---|---|
[CTF] webhacking.kr 10번 Write-Up (0) | 2022.10.14 |
[CTF] webhacking.kr 7번 Write-Up (1) | 2022.10.11 |
[CTF] webhacking.kr 6번 Write-Up (0) | 2022.10.11 |
[CTF] webhacking.kr 5번 Write-Up (0) | 2022.10.11 |
댓글