wargame/los.rubiya.kr

5번 wolfman

NTART 2019. 11. 16. 21:04
<?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__); 
?>

5번의 wolfman 코드이다.

쿼리는 guest로 날리지만, 문제를 해결하려면 admin으로 로그인하여야 한다.

그리고 preg_match 정규식함수에 띄어쓰기를 못하도록 필터링 하였다.

 

white space filtering으로 구글링하면,

%20%0a %0b %0c %0d %09 등으로 우회하여 sql injection을 하는 것을 알 수 있다.

 

아스키 표에서 %0A를 보면 linefeed로 되어있다. 이는 \n과 같은 개행의 기호인데 

html에서는 줄 넘김도 띄어쓰기 한칸으로 인식하기 때문에 띄어쓰기와 같은 용도로 사용이 가능하여 우회가 가능하다.

 

띄어쓰기(%20)대신 %0a를 넣어 sql injection을 하면 쉽게 성공할 수 있다!