問題
解いてみた
通信先として書かれている以下にアクセスしてみます。
対話できるやつです。
歌手と曲を登録したり、ランダムに歌手を選んだりできるシステムのようです。
そして、添付ファイルをダウンロードして開いてみます。
Pythonのファイルでした。
内容を見る限り、さっきの接続先に置かれているPythonファイルっぽいので、このソースから脆弱な部分を見つけてflagをgetするという流れになりそうです。
ソースを見るとoauth_tokenというファイルに書かれているflagをoauth_tokensというテーブルに書き込んでいます。
歌手と曲はmediaというテーブルに書き込んだり読み出したりしているようです。
SQLインジェクションをどうやってやるかというところが問題な気がします。
SQL文を見てみます。
2や3が一番手っ取り早そうですが、「'」を空に置換している処理があることがわかりました。
なので
' or 1 = 1 --
のようなことができないということです。
よく見ると1も置換しているものの「'」は置換していないことが分かります。
そして4を見ると歌手をselectして、その文字列でさらにselectしていることが分かります。
ということはやりたいことは以下の流れでしょうか。
- 1でSQLインジェクションできる文字列を歌手としてDBに保存する
- 4でその歌手をselectして、SQLインジェクションをして、flagをgetする。
音楽テーブルとflagのテーブルが異なるのでunionを使用する必要がありそうです。
テーブルのカラムについてはCREATE TABLEのところを見れば書いてあるのでわかりました。
まとめますとどのようなSQLを投げたいかというと
SELECT artist, song FROM media WHERE artist = '' union SELECT 1, oauth_token FROM oauth_tokens --
というような感じでしょうか。
実際にやってみます。
できました。