Wargame/webhacking.kr

[미완] Challenge old 8 (350)

마띠(쥔장) 2020. 1. 19. 08:35

<?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)");
}
?>

먼저, 생소한 함수가 많아서 정리부터!

trim(): 문자열 앞 뒤의 여백 제거

getenv(): 환경변수 얻기

htmlspecialchars(): 각각의 HTML 특수 문자들을 일반 문자열로 인식할 수 있도록 변환

ex) & -> &amp; "(더블쿼터) -> &quot, '(싱글쿼터) -> &#039, < -> &lt

addslashes(): DB에서 오류로 들어갈 수 있는 싱글쿼터를 예외처리 함

ex) I'm -> I\'m

htmlentities(): 주어진 모든 문자를 엔티티로 반환한다

ex) <b>, </b> 등 그대로 출력

 

$ck[0] 변수가 "admin"이 될 경우 문제가 풀릴 것으로 예상된다

그런데 마지막 if문을 보면, 변수 $ck[0]가 없을 경우 쿼리를 insert한다고 나와있다!

(HTTP_USER_AGENT에 들어간 변수값이 정상적인 쿼리가 아니라서 $ck가 존재할 수 없다고 한다)

 

자세히 보면 아래와 같다

 $q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");

 

위의 코드에서 SQL 인젝션을 활용하여, ID가 admin인 계정으로 사이트에 접속해보자

프록시 툴인 burp suite를 사용해서 잡아봤다

User-Agent 부분이 Chrome 브라우저의 정보로 되어 있다

이제 여기서, ip, id는 수정을 못하지만 내가 수정할 수 있는 agent를 통해 쿼리를 변조해보자

 

위의 코드인  

$q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error"); 에서,

해당 $agent를 말하는 것이다

 

그럼 이 대신에,

agent -> agent1', 'ip1', 'id1'), ('agent2의 형태로 변조해보면

values('{$agent1}', 'ip1', 'id1'), ('agent2,'{$ip}','guest')")가 된다

 

이 때 id1를 admin!으로 맞춰야 하기 때문에

matiii', '123', 'admin'), ('agent2

로 변조해보자

 

그런데 forward를 아무리 눌러도 아무 일도 일어나지 않았다..

저 70을 다 채우면 되려나..

728x90