본문 바로가기

워게임

Lord of SQL Injection - 19번 문제풀이

[19번 문제 - xavis]

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

이번 문제는 이제 익숙한 Blind SQL Injection 문제이다.

많이 해왔던 방식으로 SQL Injection을 시도했으므로 공격 방법은 따로 적지 않고, 핵심만 정리하겠다.

 

ascii 함수와 mid 함수를 사용해서 참인 조건을 만들어 쉽게 풀리겠거니 했는데 ascii 함수를 사용해서는 Hello admin 글자가 출력되지 않고, ord 함수를 사용했을때만 출력되는 것이였다.

 

문제에서는 따로 필터를 걸었다거나 그런것도 없었는데 이상하다.. 생각했는데 ord 함수를 이용해서 값을 넣어보는데 100을 넘어도 참인 조건이 나오고 150이 넘어도 어라..? 이럴 수가 있나 생각이 들어서 계속 값을 올려서 50864가 나왔다.

 

값을 검색해보니 pw의 첫 글자가 '우'라는 한글이였다!!

이어서 2번째와 3번째 자리 글자수까지 다 한글로 맞춰서 문제를 풀 수 있었다.

ascii 함수로 값이 안나온 이유는 ascii 함수의 최대값이 127이라 한글 아스키코드까지는 표현이 되지 않고, ord 함수를 이용해야만 한다.

 

[문제 풀이 구문]

https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php?pw=우왕굳