SQL Injection
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/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の応答を返すときに区別することができます。なぜなら、ページ上の内容が異なるからです。 この場合、その動作を悪用してデータベースを文字ごとにダンプすることができます:
エラー盲目的SQLiの悪用
これは以前と同じケースですが、クエリからの真/偽の応答を区別する代わりに、SQLクエリのエラーがあるかどうかを区別することができます(おそらくHTTPサーバーがクラッシュするため)。したがって、この場合、正しく文字を推測するたびにSQLエラーを強制することができます:
時間ベースのSQLiの悪用
この場合、ページのコンテキストに基づいてクエリの応答を区別する方法はありません。しかし、推測した文字が正しい場合、ページが読み込むのに時間がかかるようにすることができます。この技術は、タイミングでの確認のために以前に使用されているのを見たことがあります。
スタッククエリ
スタッククエリを使用して、複数のクエリを連続して実行できます。後続のクエリが実行される間、結果はアプリケーションに返されません。したがって、この技術は主にブラインド脆弱性に関連して使用され、2番目のクエリを使用してDNSルックアップ、条件付きエラー、または時間遅延をトリガーできます。
Oracleはスタッククエリをサポートしていません。MySQL、Microsoft、およびPostgreSQLはそれをサポートしています: QUERY-1-HERE; QUERY-2-HERE
バンド外の悪用
他の悪用方法が機能しなかった場合、データベースが情報をあなたが制御する外部ホストに流出させるように試みることができます。たとえば、DNSクエリを介して:
XXEによるアウトオブバンドデータ流出
自動化された悪用
SQLMap Cheatsheetを確認して、sqlmapを使用してSQLi脆弱性を悪用してください。
技術特有の情報
SQLインジェクション脆弱性を悪用する方法についてはすでに議論しました。この本では、データベース技術に依存するいくつかのトリックを見つけてください:
また、MySQL、PostgreSQL、Oracle、MSSQL、SQLite、HQLに関する多くのトリックが https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injectionにあります。
RootedCONは、スペインで最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパで最も重要なイベントの一つです。技術知識の促進を使命として、この会議はあらゆる分野の技術とサイバーセキュリティの専門家の熱い交流の場です。
認証バイパス
ログイン機能をバイパスするために試すリスト:
生のハッシュ認証バイパス
このクエリは、認証チェックで生の出力に対して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番目の行は既存の管理者のメールアドレスをターゲットにしてパスワードを更新する意図があります:
Here's how it works:
クエリは2つの行を挿入しようとします:1つは
generic_user@example.com
用、もう1つはadmin_generic@example.com
用です。もし
admin_generic@example.com
の行がすでに存在する場合、ON DUPLICATE KEY UPDATE
句がトリガーされ、MySQLに既存の行のpassword
フィールドを "bcrypt_hash_of_newpassword" に更新するよう指示します。その結果、
admin_generic@example.com
を使用して、bcryptハッシュに対応するパスワードで認証を試みることができます("bcrypt_hash_of_newpassword" は新しいパスワードのbcryptハッシュを表し、実際のパスワードのハッシュに置き換える必要があります)。
Extract information
Creating 2 accounts at the same time
新しいユーザーを作成しようとする際には、ユーザー名、パスワード、メールが必要です:
Using decimal or hexadecimal
この技術を使用すると、1つのアカウントを作成するだけで情報を抽出できます。コメントを追加する必要はないことに注意してください。
Using hex2dec and substr:
テキストを取得するには、次のようにします:
hex と replace (および substr) を使用して:
RootedCON は スペイン で最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパ で最も重要なイベントの一つです。技術的知識の促進を使命とし、この会議はあらゆる分野の技術とサイバーセキュリティの専門家が集まる熱い交流の場です。
Routed SQL injection
Routed SQL injection は、注入可能なクエリが出力を生成するものではなく、注入可能なクエリの出力が出力を生成するクエリに送られる状況です。 (From Paper)
Example:
WAF バイパス
スペースなしバイパス
スペースなし (%20) - ホワイトスペースの代替を使用してバイパス
No Whitespace - コメントを使用してバイパス
No Whitespace - 括弧を使用してバイパス
No commas bypass
No Comma - OFFSET、FROM、JOINを使用したバイパス
Generic Bypasses
キーワードを使用したブラックリスト - 大文字/小文字を使用してバイパス
キーワードを無視してブラックリスト - 同等の演算子を使用してバイパス
科学的表記法 WAF バイパス
このトリックの詳細な説明は 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バイパスサジェスターツール
その他のガイド
ブルートフォース検出リスト
RootedCONは、スペインで最も関連性の高いサイバーセキュリティイベントであり、ヨーロッパで最も重要なイベントの一つです。技術的知識の促進を使命とし、この会議はあらゆる分野の技術とサイバーセキュリティの専門家の熱い交流の場です。
Last updated