WARGAME/Lord of sql injection

LORD OF SQL INJECTION WOLF MAN 풀이

msh1307 2022. 5. 13. 13:29

소스 코드


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[pw])) exit("No Hack ~_~"); 
  if(preg_match('/ /i'$_GET[pw])) exit("No whitespace ~_~"); 
  $query = "select id from prob_wolfman where id='guest' 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>"
  if($result['id'== 'admin') solve("wolfman"); 
  highlight_file(__FILE__); 
?>
 
cs

풀이


pw만 파라미터로 받아주고 id는 guest로 고정되어있다.

쿼리를 보내서 id가 admin인 결과가 반환되면 문제가 풀린다. 

여기서 pw에 공백과 _나 .같은 문자들은 필터링이 되어있는 것을 확인해줄 수 있다.

공백을 사용할 수 없어서 and나 or같은 논리 연산자들은 사용할 수 없다.

주석도 --를 사용할 수 없다.

공백을 사용할 수 없기 때문에 and대신 && or대신 ||를 사용하고, 주석은 #를 사용할 것이다.

?pw=%27||id=%27admin%27%23를 파라미터로 넘겨주면 풀 수 있다.

#을 %23으로 따로 인코딩을 해줘야한다. #은 url에서 fragment로 인식된다.

최종적으로 쿼리문은 select id from prob_wolfman where id='guest' and pw=''||id='admin'#가 되게 된다. 

and가 먼저 연산되고 id가 admin을 긁어오면 된다.