본문 바로가기

워게임

Lord of SQL Injection - 17번 문제풀이

[17번 문제 - zombie assassin]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php 
  include "./config.php"
  login_chk(); 
  $db = dbconnect();
  $_GET['id'= strrev(addslashes($_GET['id']));
  $_GET['pw'= strrev(addslashes($_GET['pw']));
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) solve("zombie_assassin"); 
  highlight_file(__FILE__); 
?>
cs

이번 문제는 꽤나 시간을 잡아먹었던 문제다.. 거의 2~3일 정도 걸렸다.. 포기하고 답안을 볼까 말까도 엄청나게 고민했다..

해당 문제는 addslashes 함수의 우회법은 알고 있었으나, strrev 함수 때문에 꽤 골치가 아팠다.

 

addslashes 함수는 싱글쿼터('), 더블쿼터("), 백슬래쉬(\), NULL 문자 앞에 백슬래쉬를 추가로 붙여서 이스케이프 시키는 함수이다.

strrev 함수는 문자열을 반대로 바꿔주는 함수로 예를 들면 "admin"을 넣을 경우 "nimda"로 출력이 된다.

 

내가 삽질했던 방법들을 순서대로 한 번 적어보겠다.

 

1. id 파라미터에 싱글쿼터 입력 후 SQL 인젝션 시도

id 파라미터에 싱글쿼터를 입력했을 경우에 select id from prob_zombie_assassin where id=''\ ~~~ 의 쿼리문이 완성되는데 싱글쿼터 뒤의 백슬래쉬를 처리할 방법을 도저히 찾지 못해서 포기했다 주석을 집어넣는 등의 여러가지 삽질들을 해봤다.

 

2. id 파라미터에 싱글쿼터 입력 후 따라오는 백슬래쉬에 't','n','r' 등을 넣어 SQL 인젝션 시도

이 방법은 꽤 머리아프게 고민하다 생각난 방법인데 생각하자마자 이거다!! 하면서 했지만 실패했다..

일단 방법을 요약하자면 id 파라미터에 싱글쿼터를 입력했을 때 따라오는 백슬래쉬 바로 뒤에 't' 문자를 넣어서 수평 탭으로 이어서 백슬래쉬를 문자가 아니라 연결하는 스페이스처럼 사용할려 했다.

select id from prob_zombie_assassin where id=''\t ~~~  -> 이렇게 하면 \t가 수평탭으로 작용할 줄 알았으나 URL에서는 '\'와 't' 따로의 문자로 보기 때문에 실패했었다.

DB에서 직접 실행하면 수평탭으로 작용을 해서 진짜 될 줄만 알았는데, URL에서는 수평탭의 아스키코드값인 %09로 되어야 수평탭으로 작동한다.

 

3. id 파라미터에 addslashes 함수에 영향받는 문자들을 넣어보다 성공!!

2번째 방법까지 하다 진짜 도저히 못 풀거 같아서 포기할려던 찰나에 문득 addslashes 함수에 영향받는 문자들(', ", \, NULL)을 넣어보다 갑자기 문제가 풀렸다는 문구가 떴다..

일단 succubus 문제처럼 id 파라미터엔 addslashes 함수에 영향받는 문자들을 하나씩 넣었고, pw 파라미터에 무조건 참인 조건을 만들어 놨었다.

답을 보니 아.. 이렇게도 작동을 하는구나를 처음 알았다.

 

문제 풀이로 가자면 id 파라미터에 NULL 문자를 입력할 경우 아래와 같이 결과가 나오는데

select id from prob_zombie_assassin where id='0\' and pw='

따라오는 백슬래쉬가 뒤의 싱글쿼터를 이스케이프 시켜주면서 색칠된 부분을 문자열로 만들어주게 된다.

이후에 pw 파라미터엔 or 1=1 # 의 문구를 반대로 입력해주면 해당 문제를 풀 수 있다.

 

[문제 풀이 구문]

https://los.rubiya.kr/chall/zombie_assassin_eac7521e07fe5f298301a44b61ffeec0.php?id=%00&pw=%20%23%201=1%20ro%20