Blind SQL injection with time delays and information retrieval
はじめに
「Blind SQL injection with time delays and information retrieval」のWriteupです。
Summary
- 評価式がtrueの時だけwaitが発生するようなペイロードを投げることで、パスワード長や文字列を識別する
- Burpの基本機能だけでもレスポンスにかかった時間をログに表示することができそうだが、未だ情報が見つからず
Writeup
TrackingId
の末尾に以下の文字列を追加してリクエストを送信したところ、前回同様 ' || pg_sleep(10)--
が刺さりました。
' || dbms_pipe.receive_message(('a'),10)--
(Oracle)' + WAITOFOR DELAY '0:0:10'--
(Microsoft SQL)' || pg_sleep(10)--
(PostgreSQL)' || sleep(10)--
(MySQL)
また、以下の文字列を追加することで、評価式の結果によってwaitの発生を制御できることが分かりました。Blind SQL injectionが成立します。
' || (SELECT CASE WHEN 1=1 THEN pg_sleep(10) ELSE pg_sleep(0) END)--
今回はBurp Suiteのみを使って解いてみました。はじめIntruderを使ってcrafted payloadを投げることを考えましたが、Intruderのログにレスポンスにかかった時間を表示する方法が分からず、代わりにTurbo IntruderというExtensionを使いました。
Proxyから「Send to turbo intruder」して、ペイロードを差し込みたいところに %s
を入れます。
pg_sleep
によるスリープの影響を各ペイロードに限定するため、 concurrentConnections
はを1にします(Intruderでやるときは、OptionsのNumber of threadsを1にする)。まずはパスワードの長さを確認しました。20文字のようです。Turbo Intruderのタイムアウトはデフォルト5秒みたいで、pg_sleep(5)
としたところ、Statusが0になっています。
同様に、パスワードの文字列を探します。本来であれば、IntruderをCluster bombで使うなどしてやるところですね。Turbo Intruderであればプログラマブルな制御ができるので、もしかしたら「ステータスコードが0だったらbreakして文字数を進める」みたいなことができるかもしれませんが、方法が分からず結局愚直にやりました。※ range(20)
芸をかましたので、20文字目だけ別途確認しました
administrator
/ 5wk2zjvz2b4djd75o8dr
でログインできました。