shinobe179の日記

@shinobe179 の技術メモ・やらかし録

Blind SQL injection with time delays and information retrieval

はじめに

「Blind SQL injection with time delays and information retrieval」のWriteupです。

portswigger.net

Summary

  • 評価式がtrueの時だけwaitが発生するようなペイロードを投げることで、パスワード長や文字列を識別する
  • Burpの基本機能だけでもレスポンスにかかった時間をログに表示することができそうだが、未だ情報が見つからず

Writeup

TrackingId の末尾に以下の文字列を追加してリクエストを送信したところ、前回同様 ' || pg_sleep(10)-- が刺さりました。

また、以下の文字列を追加することで、評価式の結果によって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を使いました。

github.com

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になっています。

f:id:befs_anne:20210418142221p:plain

同様に、パスワードの文字列を探します。本来であれば、IntruderをCluster bombで使うなどしてやるところですね。Turbo Intruderであればプログラマブルな制御ができるので、もしかしたら「ステータスコードが0だったらbreakして文字数を進める」みたいなことができるかもしれませんが、方法が分からず結局愚直にやりました。※ range(20) 芸をかましたので、20文字目だけ別途確認しました

f:id:befs_anne:20210418142257p:plain

administrator / 5wk2zjvz2b4djd75o8dr でログインできました。

f:id:befs_anne:20210418142521p:plain