Shikata Ga Nai

Private? There is no such things.

Blind Boolean Based SQLi By Manipulating URLをまとめてみた

Hello there, ('ω')ノ

 

脆弱性:

 SQLインジェクション

 

記事:

 https://medium.com/@zatikyan.sevada/blind-boolean-based-sqli-by-manipulating-url-96e1e086378c

 

この記事では、URLを操作することによって発見されたブラインドブール型のSQLインジェクションについて語られています。

 

現代のウェブアプリケーションがリンク自体から情報を取得できることが指摘されており、特にGETリクエストのパラメーターではなく、URL内の数字を抽出してSQLクエリを実行するバックエンドの正規表現に焦点を当てています。

 

具体的な例として、`x.com/resume/doesntmatterwhathere-76541`のようなリンクが挙げられています。

 

このURLの数字の前にあるテキストはSQLインジェクションの可能性を示唆する簡単なテストによって、実際には重要ではないことが示されました。

 

例えば、`x.com/resume/-76541'`というURLをテストしたところ、エラー404が返され、JavaScriptの`window.location`を使用したリダイレクトが発生しました。

 

さらに、`x.com/resume/-76541'%20OR%20'`というより単純なインジェクションを試したところ、実際の人物の履歴書が返され、SQLがtrueを返したことが示されました。

 

この発見に基づき、著者はsqlmapを使用してデータを取得しようとしましたが、通常とは異なるケースであったため、404エラーコードが常に返され、SQLステートメントがfalseを返した場合にのみ異なるHTMLレスポンスが得られました。

 

この問題を解決するために、著者は`--code`、`--string`、`--not-string`などのsqlmapのオプションを使用しました。

 

また、ユーザーエージェントをランダムに変更する`--random-agent`オプションや、必要に応じてクッキーを使用することも検討されました。

 

SQLインジェクションの脆弱性を手動で発見しなければ、sqlmapでは見つけられなかったであろうと指摘しています。

 

具体的なペイロードとして、`76541' ORDER BY 38 #`などが使用され、列の数を推測し、`UNION`ステートメントを使用してその正確さを証明しました。

 

最終的に、38列が存在することを確認し、脆弱性を報告しました。

 

この記事は、ウェブアプリケーションのセキュリティに関心がある人々にとって非常に有益です。

 

SQLインジェクションの検出と防御に関する実践的な知識を提供し、セキュリティ研究者や開発者が自身のアプリケーションをより安全にするための手法を理解するのに役立ちます。

 

記事内で試されたコードやコマンドには以下のようなものがあります。

1. 基本的なSQLインジェクションテスト
   - テストURL: `x.com/resume/-76541'`
     - このURLはエラー404を返し、JavaScriptによるリダイレクトが発生しました。

 

2. 単純なインジェクションで真偽値をテスト
   - テストURL: `x.com/resume/-76541'%20OR%20'`
     - このURLは実際の人物の履歴書を返し、SQLがtrueを返したことを示しました。

 

3. sqlmapを使用したデータ取得の試み
   - 使用されたオプション:
     - `--code`: 期待されるステータスコードを指定します。
     - `--string` / `--not-string`: SQLステートメントがfalseを返したときに確認する具体的なレスポンスを指定します。
     - `--random-agent`: ユーザーエージェントをランダムに変更します。
   - コマンド例は具体的に記載されていませんが、上記のオプションを含むsqlmapの実行方法に関するヒントが提供されています。

 

4. 手動でのペイロードテスト
   - 列数の推測:
     - ペイロード: `76541' ORDER BY 38 #`
     - URLエンコードされたペイロード: `76541'%20ORDER%20BY%2038%20%23`
   - `UNION`を使用した列数の確認:
     - フルペイロード: `x.com/76541'%20UNION%20SELECT%201,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1%20%23`
     - このペイロードは38個の`1`を含み、1つ多くまたは少なくするとエラーが返されることで、列数が38であることを確認しました。

 

Best regards, (^^ゞ