web-dev-qa-db-ja.com

継続的なSQLインジェクションテスト

機能的には十分にテストされた一連の内部Python/Django Webアプリケーションがありますが、ときどき脆弱性、特にSQLやその他のタイプのインジェクションが発生する可能性のある場所を発見します。現在、これはシステムの知識を必要とする非常に手動のプロセスです(ホワイトボックス)。

しかし、テスト中のアプリケーションのすべてのAPIエンドポイントの自動SQLインジェクションテストを行う方法はありますか?

私が今理解していないことがいくつかあると思います:これらのテストのロジックと例を実際に記述して、たとえば、Python unittest framework、または、エンドポイントと可能なパラメーターを指定し、セキュリティテストフレームワークに不正な入力を生成させ、SQLインジェクションを調査する方法がありますsqlmap?)(問題は、例に基づくテストか プロパティに基づくテスト )のどちらかであるという意味です

7
alecxe

この問題を別の視点から見ていきたいと思います。

アプリケーションのさまざまなAPIエンドポイントに多くのSQLIが見つかったとおっしゃいました。

そのような問題の修正/緩和策は正確には何でしたか?また、これを修正した後でも、同じアプリケーションの別のエンドポイントに別の問題が見つかった可能性はありますか?

アプリケーションはどの程度正確に構成されていますか?

私のアイデアは、すべてのAPIリクエストが最初に通過するトンネルのように構築し、文字列をexの文字のホワイトリストと照合することでした。それもかなりうまくできる図書館があると思います。

また、現在ほとんどのORMがこの作業を行っています。

アプリケーションのデータアクセス層がどのように構築されているかを正確に把握し、それをリファクタリングして、SQLisを軽減する際に OWASPチートシート に従うことも興味深いかもしれません。

自動テストの部分を無視することはお勧めしません。この問題が何度も修正された後もなぜこの問題がまだ存在するのか、もっと知りたいです。

また、そのような問題を完全に排除できるとは言えません。そのため、アプリケーション全体の汎用ソリューションを見つけた後でも、これらの自動テストが必要になる場合があります。

1
shawkyz1

サンプルベースのテストを簡単にスクリプト化できます。サンプルリクエストを使用すると、sqlmapが残りの処理を実行できます。デフォルトではそれがしない唯一のことはパスパラメータですが、それもスクリプトに組み込むことができます。これの問題は、単体テストの実行にかかる時間が飛躍的に増加することであり、そのため通常はこの方法で実行されません。追加された時間を許容できるかどうかを判断するのは、あなたと開発者の責任です。私の経験では、そうではありません。また、たとえば、何かがステージングにデプロイされたときにSQLマップを別のスレッドで起動し、何かが見つかった場合にセキュリティを警告する、何かを構築することもできます。これにより、ビルドがブロックされなくなります。例に基づくテストはあなたの質問への答えです。

2
joe

興味深い質問!

これを機能させるには、複数のプロセスを自動化する必要があります。これを行う魔法の製品(私が知っている)はありませんが、ここにアルゴリズムがあります。

  1. SQLアプリケーションを実行しているWebサーバーに関する情報を収集します。これはnmap -sS Host-range -oX output.xml -p 80,443,8080,1080で簡単に行えます

  2. これらの検出されたアプリケーションから、output.xmlファイルからPOST/GETパラメータを収集してテストします。これは、curlといくつかのbashスクリプト、またはpythonまたはcurlの助けを借りてwget XMLパーサーを介して行うことができます。

  3. 収集されたPOST/GETパラメータリクエストのリストを使用してSQLMapにフィードし、SQLインジェクションをテストします。このようなもの:

    リスト内のすべてのPOST/REQUESTに対して{SQLMap -u link_from_list --risk 3 --level 3をSQLインジェクションとしてフラグが立てられている場合に実行{report()}}

  4. レポートを調査します。誤検知を排除し、開発チームがパッチを適用するためのレポートを完成させる

  5. パッチ、パッチ、パッチ!

  6. ステップ[1]からやり直してください

1
AK_