SQL Injection
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON は スペイン で最も重要なサイバーセキュリティイベントであり、ヨーロッパ で最も重要なイベントの一つです。技術的知識の促進を使命とし、この会議はあらゆる分野の技術とサイバーセキュリティの専門家が集まる熱い交流の場です。
SQLインジェクションとは?
SQLインジェクション は、攻撃者がアプリケーションのデータベースクエリに干渉することを可能にするセキュリティの欠陥です。この脆弱性により、攻撃者は他のユーザーの情報やアプリケーションがアクセスできる任意のデータを表示、変更、または削除することができます。このような行為は、アプリケーションの機能やコンテンツに永続的な変更をもたらしたり、サーバーの侵害やサービスの拒否を引き起こす可能性があります。
エントリーポイントの検出
サイトがSQLインジェクション(SQLi)に脆弱であるように見える場合、SQLi関連の入力に対する異常なサーバー応答があるとき、最初のステップはクエリを中断することなくデータを注入する方法を理解することです。これには、現在のコンテキストから効果的に脱出する方法を特定する必要があります。これらは役立ついくつかの例です:
次に、エラーが発生しないようにクエリを修正する方法を知っておく必要があります。クエリを修正するには、データを入力して前のクエリが新しいデータを受け入れるようにするか、単にデータを入力して最後にコメント記号を追加することができます。
エラーメッセージが表示される場合や、クエリが正常に動作しているときとそうでないときの違いを見つけることができる場合、このフェーズはより簡単になります。
コメント
論理演算による確認
SQLインジェクションの脆弱性を確認する信頼できる方法は、論理演算を実行し、期待される結果を観察することです。例えば、?username=Peter
というGETパラメータが?username=Peter' or '1'='1
に変更しても同じ内容が得られる場合、SQLインジェクションの脆弱性が示唆されます。
同様に、数学演算の適用も効果的な確認技術として機能します。例えば、?id=1
と?id=2-1
にアクセスして同じ結果が得られる場合、SQLインジェクションを示しています。
論理演算確認を示す例:
この単語リストは、提案された方法でSQLインジェクションを確認するために作成されました:
タイミングによる確認
場合によっては、テストしているページに変化が見られないことがあります。したがって、ブラインドSQLインジェクションを発見する良い方法は、DBにアクションを実行させ、ページの読み込みにかかる時間に影響を与えることです。 したがって、SQLクエリに完了するのに多くの時間がかかる操作を連結します:
場合によっては、sleep関数が許可されないことがあります。その場合、これらの関数を使用する代わりに、クエリを複雑な操作を実行させることができ、数秒かかるようにすることができます。これらの技術の例は、各技術ごとに別々にコメントされる予定です(もしあれば)。
バックエンドの特定
バックエンドを特定する最良の方法は、異なるバックエンドの関数を実行しようとすることです。前のセクションの_sleep_ 関数や、これらの関数を使用することができます(payloadsallthethingsの表):
また、クエリの出力にアクセスできる場合は、データベースのバージョンを表示させることができます。
続いて、異なる種類のSQLインジェクションを悪用するためのさまざまな方法について説明します。MySQLを例として使用します。
PortSwiggerを使用した識別
ユニオンベースの悪用
カラム数の検出
クエリの出力が見える場合、これは悪用するための最良の方法です。 まず最初に、初期リクエストが返すカラムの数を特定する必要があります。これは、両方のクエリが同じ数のカラムを返す必要があるためです。 この目的のために通常使用される2つの方法があります:
ORDER BY / GROUP BY
クエリのカラム数を特定するには、ORDER BYまたはGROUP BY句で使用される数を段階的に調整し、誤った応答が返されるまで続けます。SQL内のGROUP BYとORDER BYの異なる機能にもかかわらず、両方はクエリのカラム数を確認するために同様に利用できます。
UNION SELECT
クエリが正しくなるまで、より多くのNULL値を選択します:
null
値を使用するべきです。なぜなら、クエリの両側のカラムの型が同じでなければならない場合があり、nullはすべてのケースで有効だからです。
データベース名、テーブル名、カラム名の抽出
次の例では、すべてのデータベースの名前、データベースのテーブル名、テーブルのカラム名を取得します:
異なるデータベースごとにこのデータを発見する方法は異なりますが、常に同じ方法論です。
隠れたユニオンベースの悪用
クエリの出力が表示されているが、ユニオンベースのインジェクションが達成できない場合、それは隠れたユニオンベースのインジェクションの存在を示しています。このシナリオはしばしばブラインドインジェクションの状況につながります。ブラインドインジェクションをユニオンベースのものに変換するには、バックエンドでの実行クエリを特定する必要があります。
これは、ブラインドインジェクション技術とターゲットのデータベース管理システム(DBMS)に特有のデフォルトテーブルを使用することで達成できます。これらのデフォルトテーブルを理解するためには、ターゲットDBMSのドキュメントを参照することをお勧めします。
クエリが抽出されたら、元のクエリを安全に閉じるようにペイロードを調整する必要があります。その後、ユニオンクエリをペイロードに追加し、新たにアクセス可能なユニオンベースのインジェクションを悪用できるようにします。
より包括的な洞察については、Healing Blind Injectionsで利用可能な完全な記事を参照してください。
エラーベースの悪用
何らかの理由でクエリの出力を見ることができないが、エラーメッセージは見ることができる場合、これらのエラーメッセージを使用してデータベースからデータをエクスフィルトレートすることができます。 ユニオンベースの悪用と同様の流れに従って、DBをダンプすることができるかもしれません。
Blind SQLiの悪用
この場合、クエリの結果やエラーを見ることはできませんが、クエリがtrueまたはfalseの応答を返すときに、ページ上の異なる内容によって区別することができます。 この場合、その動作を悪用してデータベースを文字ごとにダンプすることができます:
Exploiting Error Blind SQLi
これは以前と同じケースですが、クエリからの真偽応答を区別する代わりに、SQLクエリのエラーがあるかどうかを区別することができます(おそらくHTTPサーバーがクラッシュするため)。したがって、この場合、正しく文字を推測するたびにSQLエラーを強制することができます:
時間ベースのSQLiの悪用
この場合、ページのコンテキストに基づいてクエリの応答を区別する方法はありません。しかし、推測した文字が正しい場合、ページが読み込むのに時間がかかるようにすることができます。この技術は、タイミングで確認するために以前に使用されているのを見たことがあります。
スタッククエリ
スタッククエリを使用して、複数のクエリを連続して実行できます。後続のクエリが実行される間、結果はアプリケーションに返されません。したがって、この技術は主にブラインド脆弱性に関連して使用され、2番目のクエリを使用してDNSルックアップ、条件付きエラー、または時間遅延をトリガーできます。
Oracleはスタッククエリをサポートしていません。MySQL、Microsoft、およびPostgreSQLはそれをサポートしています: QUERY-1-HERE; QUERY-2-HERE
バンド外の悪用
他の悪用方法が機能しなかった場合、データベースが情報をあなたが制御する外部ホストに流出させるように試みることができます。たとえば、DNSクエリを介して:
XXEを介したアウトオブバンドデータ流出
自動化された悪用
SQLMap チートシートを確認して、sqlmapを使用してSQLi脆弱性を悪用してください。
技術特有の情報
SQLインジェクション脆弱性を悪用する方法についてはすでに議論しました。この本では、データベース技術に依存するいくつかのトリックを見つけてください:
また、MySQL、PostgreSQL、Oracle、MSSQL、SQLite、HQLに関する多くのトリックが https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injectionにあります。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCONは、スペインで最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパで最も重要なイベントの一つです。技術知識の促進を使命として、この会議はあらゆる分野の技術とサイバーセキュリティの専門家の熱い交流の場です。
認証バイパス
ログイン機能をバイパスするために試すリスト:
Login bypass List生のハッシュ認証バイパス
このクエリは、認証チェックで生の出力に対してtrueを使用した場合にMD5が脆弱性を示すことを示しています。これにより、システムはSQLインジェクションに対して脆弱になります。攻撃者は、ハッシュ化されたときに予期しないSQLコマンドの一部を生成する入力を作成することでこれを悪用し、不正アクセスを引き起こすことができます。
注入されたハッシュ認証バイパス
推奨リスト:
各行のリストをユーザー名として使用し、パスワードは常に: Pass1234. (このペイロードは、このセクションの最初で言及された大きなリストにも含まれています)
GBK 認証バイパス
IF ' がエスケープされている場合は %A8%27 を使用でき、' がエスケープされると次のように作成されます: 0xA80x5c0x27 (╘')
Pythonスクリプト:
ポリグロットインジェクション(マルチコンテキスト)
Insert Statement
既存のオブジェクト/ユーザーのパスワードを変更する
そのためには、「マスターオブジェクト」と名付けられた新しいオブジェクトを作成する(おそらくadminの場合)ために何かを修正する必要があります:
名前をAdMIn(大文字と小文字の組み合わせ)としてユーザーを作成する
名前を**admin=**としてユーザーを作成する
SQLトランケーション攻撃(ユーザー名やメールに長さ制限がある場合) --> 名前をadmin [たくさんのスペース] aとしてユーザーを作成する
SQLトランケーション攻撃
データベースが脆弱で、ユーザー名の最大文字数が例えば30の場合、ユーザーadminを偽装したい場合は、"admin [30スペース] a"というユーザー名を作成してみてください。
データベースは、入力されたユーザー名がデータベース内に存在するかを確認します。もし存在しなければ、ユーザー名を最大許可文字数(この場合は"admin [25スペース]")に切り詰め、その後、データベース内でユーザー「admin」を新しいパスワードで更新する際に、末尾のすべてのスペースを自動的に削除します(エラーが表示される可能性がありますが、これは成功しなかったことを意味しません)。**
詳細情報: https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html & https://resources.infosecinstitute.com/sql-truncation-attack/#gref
注: この攻撃は、最新のMySQLインストールでは上記のようには機能しなくなります。比較はデフォルトで末尾の空白を無視しますが、フィールドの長さよりも長い文字列を挿入しようとするとエラーが発生し、挿入は失敗します。このチェックに関する詳細情報: https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation
MySQL挿入時間ベースのチェック
','',''
をできるだけ追加して、VALUESステートメントを終了させると考えます。遅延が実行される場合、SQLインジェクションがあります。
ON DUPLICATE KEY UPDATE
MySQLのON DUPLICATE KEY UPDATE
句は、UNIQUEインデックスまたはPRIMARY KEYで重複する値が発生する行を挿入しようとしたときに、データベースが取るべきアクションを指定するために使用されます。以下の例は、この機能がどのように悪用されて管理者アカウントのパスワードを変更するかを示しています。
Example Payload Injection:
注入ペイロードは次のように作成される可能性があり、users
テーブルに2行を挿入しようとしています。最初の行はおとりで、2番目の行は既存の管理者のメールアドレスをターゲットにしてパスワードを更新する意図があります:
以下のように機能します:
クエリは、
generic_user@example.com
用の1行と、admin_generic@example.com
用の別の1行を挿入しようとします。admin_generic@example.com
用の行がすでに存在する場合、ON DUPLICATE KEY UPDATE
句がトリガーされ、MySQLに既存の行のpassword
フィールドを「bcrypt_hash_of_newpassword」に更新するよう指示します。その結果、
admin_generic@example.com
を使用して、bcryptハッシュに対応するパスワードで認証を試みることができます(「bcrypt_hash_of_newpassword」は新しいパスワードのbcryptハッシュを表し、実際のパスワードのハッシュに置き換える必要があります)。
情報を抽出する
同時に2つのアカウントを作成する
新しいユーザーを作成しようとする際には、ユーザー名、パスワード、メールが必要です:
10進数または16進数の使用
この技術を使用すると、1つのアカウントを作成するだけで情報を抽出できます。コメントをする必要はないことに注意してください。
hex2dec と substr を使用して:
テキストを取得するには、次のようにします:
hex と replace (および substr) を使用して:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON は スペイン で最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパ で最も重要なイベントの一つです。 技術的知識の促進 を使命とし、この会議はあらゆる分野の技術とサイバーセキュリティの専門家が集まる熱い交流の場です。
Routed SQL injection
Routed SQL injection は、注入可能なクエリが出力を生成するものではなく、注入可能なクエリの出力が出力を生成するクエリに送られる状況です。 (From Paper)
Example:
WAF バイパス
スペースなしバイパス
スペースなし (%20) - ホワイトスペースの代替を使用してバイパス
No Whitespace - コメントを使用してバイパス
No Whitespace - 括弧を使用してバイパス
No commas bypass
No Comma - OFFSET、FROM、JOINを使用したバイパス
一般的なバイパス
キーワードを使用したブラックリスト - 大文字/小文字を使用してバイパス
キーワードを無視してブラックリスト - 同等の演算子を使用してバイパス
Scientific Notation WAF bypass
このトリックの詳細な説明はgosecure blogで見つけることができます。 基本的に、WAFをバイパスするために科学的表記を予期しない方法で使用できます:
カラム名制限のバイパス
まず第一に、元のクエリとフラグを抽出したいテーブルが同じ数のカラムを持っている場合、単に次のようにすることができます: 0 UNION SELECT * FROM flag
テーブルの名前を使用せずに第三カラムにアクセスすることが可能で、次のようなクエリを使用します: SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;
したがって、sqlinjectionでは次のようになります:
または カンマバイパス を使用します:
このトリックはhttps://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/から取られました。
WAFバイパスサジェスターツール
その他のガイド
ブルートフォース検出リスト
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCONは、スペインで最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパで最も重要なイベントの一つです。技術知識の促進を使命とし、この会議はあらゆる分野の技術とサイバーセキュリティの専門家の熱い交流の場です。
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated