김승현

[webhacking.kr] old-08 8번 문제 write up 본문

Web/webhacking.kr

[webhacking.kr] old-08 8번 문제 write up

kshind 2023. 3. 29. 00:19

접속하면 이렇게 hi guest라는 게 뜬다. 딱히 이 페이지의 소스를 보거나 해서는 얻을 힌트가 없는 것 같으니

view-source를 눌러 코드를 확인해보자.

view-source를 보면 이렇게 긴 코드를 볼 수 있다. 해석해보자.

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

$agent에 환경변수인 HTTP_USER_AGENT의 값을 공백없이 저장한다.

$ip에 웹사이트에 접속한 이용자의 IP를 받아서 저장한다.

preg_match의 경우 정규식을 검사하는 함수이다.

-만약 대소문자 구분없이 from이 $agent에 포함되어 있으면

Access Denied!가 뜨고,

특수문자 형태로 agent를 반환하고 종료해버린다.

$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);

db를 일단 연결한다.

$count_ck에 db를 연결하고 select count(id) from chall8을 저장한다.

만약 count_ck[0]이 70이상이면, 즉 70개 이상의 데이터가 저장되면 데이터를 지운다.

 

$result에 db를 연결 후 select id from chall8 where agent='"[서버에서 받아들인 HTTP_USER_AGENT에 \를 더한 값]"'를

저장한다.

$ck에  $result를 바탕으로 db를 저장한다.

if($ck){
  echo "hi <b>".htmlentities($ck[0])."</b><p>";
  if($ck[0]=="admin"){
    mysqli_query($db,"delete from chall8");
    solve(8);
  }
}

만약 $ck가 있다면

hi [html 엔티티]를 출력한다.

만약 $ck[0]이 admin이면 데이터들을 삭제하고 문제가 solve된다.

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

이건 사이트가 정보를 전달받은 양식이다.

values('{$agent}','{$ip}','guest') 이게 중요한 부분인 것 같다.

$agent에 전달할 값을 입력하고 ip는 임의의 ip 그리고 마지막 부분에 admin이 입력되게 해보자.

$agent에 test','1...1','admin'), ('x를 입력하면

values('test','1...1','admin'), ('x','{$ip}','guest')") 이렇게 admin을 입력할 수 있을 것 같다.

burp로 user_agent를 수정해서 보내보자.

버프를 잘 보면 User-Agent가 있는 걸 볼 수 있다. 여길 고쳐보자.

이렇게 위에서 작성했듯이 바꿔서 forword 해봤다.

그랬더니 test와 x라는 2개의 데이터가 들어간 걸 확인할 수 있다.

agent에 test를 전달해서 ck[0]에 admin이 저장되게 해보자.

이렇게 이번엔 User-Agent를 test로 바꿔서 forword 해줬다.