반응형

1. 문제분석


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


문제는 요청의 USER_AGENT를 기반으로 사용자를 구분한다.

이 때 해당 USER_AGENT에 해당하는 데이터가 없으면 insert 구문을 통해 새로 데이터를 생성한다.


2. 풀이

해당 문제는 간단한 SQLI 문제이다.


ip 변수에 대입되는 $_SERVER['REMOTE_ADDR] 부분은 수정할 수 없으므로 HTTP_USER_AGENT 부분을 변경해주어야 한다.

따라서 insert 구문을 진행할 때 $agent부분에 다음과 같이 들어가도록 요청 내 user-agent를 변경해 요청해준다.

rootable','1','admin'),('123


이후 useragent를 rootable로 변경하여 접근해주면 문제가 풀린다.


(참고)

user-agent에서 #은 URL encoding 없이 그대로 들어가므로 %23이 아니라 #이라고 그대로 작성해주어야 한다.

즉, User-agnet 부분에 [ rootable','1','admin')# ] 과 같이 입력해주어도 정상적으로 insert되고 문제를 solve할 수 있다.


반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

webhacking.kr old-22 writeup  (0) 2020.04.23
webhacking.kr old-13 writeup  (0) 2020.04.22
webhacking.kr old-07 writeup  (0) 2020.04.21
webhacking.kr old-06 writeup  (0) 2020.04.21
webhacking.kr old-02 writeup  (0) 2020.04.21
블로그 이미지

rootable

,