事情起因#
ある内部テストのターゲットから、登録は公開されていないですが、バイトパルスのlation
さんに復元してもらい、学びの姿勢で再現してみました。ターゲットのアドレス
注入方法の探求#
ターゲットを開くと、以下のようになっています:
見た目は「簡単な」ログインボックスです。burp
を使ってrepeater
を開始して探求します。
見た目は普通で、username
とpasswd
の 2 つのフィールドしかありません。まずはユニバーサルパスワードを試してみましょう。
ログインに失敗しました。ここで小技を紹介しますが、burp
でパラメータを変更する際には、自分で追加した部分を選択してctrl+U
で URL エンコードを行うことをおすすめします。
admin
にシングルクォートを追加しても何の反応もありませんでした。後ろにand 1=1
やand 1=2
を追加しても何の反応もありませんでした。
passwd
フィールドにシングルクォートを追加しても何の反応もありませんでした。
エラーインジェクションを試してみます:
これも何の反応もありませんでした。ワイドバイトインジェクションを試してみます:
エラーが発生しました。エラーステートメントを閉じるために試してみます:
テストの結果、--+
の他にも#
と-- -
も閉じることができることがわかりました。
インジェクションデータ#
いつものように、列数をクエリします:
エラーが発生しましたが、エラーメッセージにnear 'der by 3
と表示されているので、私たちのor
が消えてしまったことがわかります。ダブルワイトで回避してみましょう:
order by 3
は問題ありませんが、order by 4
でエラーが発生しました。union select
でエコーフィールドを確認します:
直接エコーされるのは「ログイン成功、flag は flag1 テーブルにあり、列名は key1」と表示されます(ここでは少し重なって表示されています)。値を確認しましょう。
変化はありませんでした。
エラーインジェクションの場合、
information_schema
データベースへの読み取り権限が必要です。
information_schema
データベースへの読み取り権限がない場合、列名とテーブル名を推測する必要があります(難しいです)。
それでは、以前のエラーインジェクションを使用してデータをクエリしましょう:
注意:%df%27
の後ろには%
があります。
参考記事:
以上です。