web-dev-qa-db-ja.com

SQLインジェクションClean / Rest URLを挿入する方法

私があなたが私を助けてくれることを望んでいる質問がありますか?

不潔なURL:

http://example.com/index.php?page=foo
http://example.com/products?category=2&pid=25
http://example.com/index.php?mod=profiles&id=193
http://example.com/kb/index.php?cat=8&id=41

クリーンなURL(「クリーンアップ」された後の同等のURL):

http://example.com/foo
http://example.com/products/2/25
http://example.com/profiles/193
http://example.com/kb/8/41

クリーン/アンクリーンURLの説明 ここ

私の質問:

上記のuncleanおよびclean urlの例でわかるように、これらは明らかに少し異なります。

不明瞭なURLを使用すると、URLの末尾にアポストロフィ( ')を追加するなどして、SQLインジェクションの潜在的な脆弱性をテストできます。

例えば ​​http://example.com/products?category=2&pid=25'次に、返される応答の長さを調べます。

clean/rest urlを使用しても、SQLインジェクションに対する脆弱性が低くなることはないことを認識しています、主にSEO、ユーザビリティなどに使用されます(ただし、自動化されたSQLインジェクションツールではさらに困難になります)。 、しかし、これらのタイプのURLをどのように注入するのでしょうか。また、使用する特定の優先/最良の方法はありますか?

たとえば、次のようにすると、アポストロフィを使用してクリーンなURLを挿入できますか?

http://example.com/kb/8'/41

または

http://example.com/products/2'/25

または

http://example.com/services/legal/patents'

など...または推奨/より良い方法があります。

この質問へのご協力をよろしくお願いいたします。

9
yonetpkbji

私の意見では、ペンテスターがクリーンなURLを使用するWebアプリケーションに直面したときの主な問題は、URLのどの部分がリソースであり、どの部分がパラメーターであるかを識別することです。

この場合、すべての部分がパラメーターであると想定して、URLのすべての部分をテストするのが最良のオプションだと思います。

http://example.com/kb'/8/41
http://example.com/kb/8'/41
http://example.com/kb/8/41'

目盛りは単なる例であり、ケースはすべての部分(リソースであるはずであるがパラメーターでもある可能性があるKBを含む)です。

ブラックボックステストのリソースとパラメーターを区別する方法がある場合は、それを知りたいと思います。

4
kinunt

SQLインジェクションをテストするための魔法のテストはありません。一部のアプリケーションは、特定のアプローチを使用する場合に脆弱であり、他のアプリケーションは別のアプローチを使用する場合に脆弱になる可能性があります。

http://example.com/kb/8 '/ 41は、アポストロフィがIPSによってブロックされているため機能しない可能性がありますが、 http://example.com/ kb/7%2B/41http://example.com/kb/8/41 と同じ結果を表示し、これにより問題が発生しているという情報が得られます。

引用符でテストするだけの場合は、まったくテストしない場合より少し優れていますが、セキュリティ評価としてラベル付けすることはできません。このようなプロセスには、アプリケーションのすべての可能なエントリポイント(パラメーター、Cookie、ヘッダーなど)の複雑な評価と、他のいくつかのより複雑なテストが含まれます。

可能性がある場合、最良の解決策はホワイトボックスアプローチを使用し、コードを確認することです。これにより、特定のパラメーターが適切にサニタイズされているかどうかを明確に確認できます。

5
Dinu

クリーンURLは異なる方法で実装できるため、使用されるシステムによって異なります。たとえば、Webサーバーで書き換えルールを使用する場合:

url.rewrite-final = (
  "^/system/test/(.*)$" => "/index.php?q=system/test/$1",
  "^/([^.?]*)\?(.*)$" => "/index.php?q=$1&$2",
  "^/([^.?]*)$" => "/index.php?q=$1",
   "^/rss.xml" => "/index.php?q=rss.xml"
)

ご覧のとおり、この正規表現(.*)'または"にも一致し、phpスクリプトがこの入力を正しく処理しない場合、SQLインジェクションに対して脆弱になる可能性があります。

クリーンURLがWebアプリケーション自体に実装されている別の例を次に示します(この場合はpython WebFrameworkDjango):

urlpatterns = patterns('',
    (r'^articles/2003/$', 'news.views.special_case_2003'),
    (r'^articles/(\d{4})/$', 'news.views.year_archive'),
    (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
    (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
)

ここに見られるように、開発者は(\d{4})などの式を使用しました。これは、123420011995などの4つのディジェットに一致しますが、12には一致しません。または12345-したがって、12'も含まれません。

TL; DR これは、開発者が適切な表現を使用しなかった場合、non cleanURLのように挿入できることを意味します。 =

編集:クリーンURLのどの部分が値であり、どれがキーであるかを知ることができないため、理由を付けてそれらを識別するか、単にそれらもテストする必要があります。

3
samuirai