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, (^^ゞ