본문 바로가기
CTF/webhacking.kr

[CTF] webhacking.kr 8번 Write-Up

by spareone 2022. 10. 14.

webhacking.kr 8번 문제풀이 Write Up 입니다.

[그림 1] Level 8 페이지

접속했더니 뜬금없이 뭐가 완료되었다고 합니다.

[그림 2] 새로고침 한 모습

새로고침을 했더니 hi guest라는 글자가 있습니다.

(처음 접속 시 상황에 따라 [그림 2]가 먼저 나올 수도 있습니다.)

[그림 3] Level 3 소스코드

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이 됩니다.

[그림 4] User agent를 변경하는 모습

Chrome 기준으로 개발자 도구 Network conditions 탭에서 agent 변경이 가능합니다.

[그림 5] 등록이 완료된 모습

query error 없이 등록이 완료된 것 같습니다.

 

이제 방금 등록한 값을 불러와야 합니다.

$result의 구문은 select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'인데,

방금 등록한 agent의 값을 SQL문에 넣으면 결과가 admin이 나올 것입니다.

[그림 6] 등록한 대로 User agent를 변경하는 모습

방금 등록했던 agent 값으로 변경합니다.

[그림 7, 8] 문제 해결 완료 메시지

새로고침 후 정상적으로 결과가 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

댓글