Post

Webhacking.kr - web08

web08

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?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)");
}
?>

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
$agent 값에 따라 쿼리가 달라지고 있고, addslashes 함수가 사용되었음.
컬럼에는 agent, ip, id가 있고 id에는 guest가 고정되어 있으므로 이 부분을 admin으로 바꿔주면 됨.
문제를 해결하기 위해선 admin 아이디를 id 컬럼에 넣은 뒤 불러와야함.

$agent에는 'from'이 필터링 되어있음.

우선 admin 값을 넣어보는 쿼리를 해보면 다음과 같음.
$agent = index12332dsfag','1.2.3.4', 'admin'), ('asdf 이면 
insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest') 에서 
insert into chall8(agent,ip,id) values('index12332dsfag','{ip}', 'admin'), ('asdf','{$ip}','guest') 이 되어서
admin 값이 들어가게 될 것임. 

agent 값에 처음엔 원래의 agent 값 (Mozilla ~)을 넣었었는데 안되어서 구별가능한 값을 넣어서 하였음.
This post is licensed under CC BY 4.0 by the author.