はまやんはまやんはまやん

hamayanhamayan's blog

goblin [LORD OF SQLINJECTION]

Lord of SQLInjection

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

特徴は以下。

  • noに数値で入れる
  • noに'"が入っているとダメ
  • SQL評価結果としてadminが帰ってくればいい

前回の問題同様に、union selectを使ってadminを返せばいいが、クオート系が使えない。
noに0 union select 'admin'としたい。
文字列表現をCHARを使って代用しよう。
adminはCHAR(0x61,0x64,0x6d,0x69,0x6e)と表現することができる。
0 union select CHAR(0x61,0x64,0x6d,0x69,0x6e)