web-dev-qa-db-ja.com

SQLインジェクション:攻撃先のURLを見つける方法

私が読んだ最後の日SQL injectionおよび私が目にするほとんどのurlの例は次のようになります。

get_int_filtered.php?id=1
get_int_groupby.php?id=1
get_int_having.php?id=1
get_int_img.php?id=1
get_int_inline.php?id=SELECT+name+FROM+users

(上記は以下に含まれる小さな例です: sqlmapproject/testenv

攻撃するURLを誰かが発見する方法の一部が欠けています。手作業ですか?たとえば、ブラウザー開発者ツールをチェックして、バックエンドへの呼び出しを確認することで、/ REST Webサイトのapiですか?WebサイトをスキャンしてurlsおよびHTTP methods(次のステップとして)を試してみますか?

6
tgogos

SQLインジェクション:SQLインジェクション攻撃に弱いURLを見つける方法。

まず、SQLiのさまざまなタイプ here を理解する必要があります。

ここでは、古典的なインバンド注入についてお話します。 2つのタイプに分かれています:

  • エラーベースのSQLi
  • UNIONベースのSQLi

エラーベースのSQLI

目標:ターゲットWebサイトにSQLエラーを表示してデータベース構造情報を収集します。場合によっては、それらを使用してデータベース全体を列挙できます。

脆弱なURLの検索:Googleドックの使用。はい、Googleは弱いURLを見つけるのに役立ちます。

  • 例:inurl:"product.php?id=" site:.ru

ここでは、URLにproduct.php?id=を含むロシアのサイトをリストするようGoogleに要求しています。

なぜ?

データベースと直接通信しているページを見つけたいからです。ほとんどの場合、これらのパターンを検索する必要があります:*.php?parameter=n

申し分ありませんが、このURLがSQLiに弱いことをどうやって確認しますか?

パラメータの番号の直後に'または%27を置き、Enterキーを押す必要があります。

  • http[:]//w34ksite.com/product.php?id=1'

SQLエラーが表示される場合は、このWebサイトが挿入可能である可能性があります。


UNIONベースのSQLI

目標:UNION SQL演算子を利用して、2つ以上のSELECTステートメントの結果を1つの結果に結合します。

次のブロックは、私がinfoSecの学生のために書いた資料です(攻撃的なセキュリティクラス)

弱いサイト:

http://w34ksite.com

最初のステップ

次のように、SQLクエリを送信する可能性のあるURLを見つけます。

http://w34ksite.com/products.php?category=1このURLは1という名前のカテゴリに再グループ化された製品をリストします

* ? * = *で終わるURLは、ほとんどの場合、SQLデータベースと通信することを忘れないでください。これを利用したいと考えています。

2番目のステップ

URLのproducts.php?category=1部分をSQLクエリに変換します。はい、このシナリオ(および運用中の多くのWebサイト)では、このURLの断片は偽装されたSQLクエリです。

products.php?category = 1-> SELECT * FROM products WHERE category=1

3番目のステップ

カテゴリパラメータを挿入できますか?たとえば、ORDER BY nを追加して製品リストを並べ替えてみましょう。

http://w34ksite.com/products.php?category=1 ORDER BY 1何も変わりません。

http://w34ksite.com/products.php?category=1 ORDER BY 2すごい!製品の注文が変更されました!私たちはおそらく物を注入することができます!

ORDER BY nn番号は、出力をソートするテーブルの列番号を示します(この場合、productのテーブル列2 )。では、少し待ってください。テーブルの最大数を超える数を入力するとどうなりますか?試してみましょう。

http://w34ksite.com/products.php?category=1 ORDER BY 3注文が再度変更されました。

http://w34ksite.com/products.php?category=1 ORDER BY 4すごい!空白ページ!製品のテーブルに3列があると推定できます。この情報は、SQLUNION ALL演算子を使用するために重要です。

4番目のステップ

攻撃の計画。したがって、たとえば、このデータベースに書き込まれたメールアドレスをダンプしたいとします。そしてもちろん、電子メールのエントリは製品テーブルにありません。それらは別の場所にあるはずです...SQLエラーがWebページに直接表示されるときはテーブルの名前などを推測できますが、今回は運が悪く、SQLエラーはw34ksite.comに表示されません。それでは、これがこのCMSのデフォルトのメールのテーブル名であることを知っているため、メールのテーブルの名前がemailであると仮定しましょう。

SELECT * FROM email-> http://w34ksite.com/email.php?もちろん違います。データベースの電子メールをリストするPHPページを作成するのに十分夢中になるのは誰ですか?なぜpassword.phpではないのですか?

products.php?category=1は、データベースと通信してデータを注入するための鍵であることを忘れないでください。このキーはデータベースドアを開きます。一般的な考え方は、このkeyを使用して電子メールテーブルのコンテンツを表示することです。それでは、製品テーブルのコンテンツ(products.php?category = 1)を表示しないのはなぜですか?はい、これが私たちがすることです。 NION ALL演算子を使用する。

UNION ALLは非常に便利です。これを使用すると、別のSQL要求に参加できます。たとえば、このURLの部分をSQLに再度変換してみましょう。

products.php?category = 1-> SELECT * FROM products WHERE category=1よろしいですか?

次に、UNION ALL演算子を使用して新しいクエリを追加し、電子メールテーブルをフェッチします。

SELECT * FROM products WHERE category=1 AND UNION ALL SELECT *, NULL, NULL FROM email

このようなものが必要です:

http://w34ksite.com/products.php?category=1 UNION ALL SELECT *, NULL, NULL FROM email

待って、*、NULL、NULLとは何ですか?

注入できるかどうかをテストするためにhttp://w34ksite.com/products.php?category=1 ORDER BY 4を覚えていますか?製品のテーブルにあるcolumnの数という非常に貴重な情報が得られます。 UNION ALL演算子を使用する場合、テーブルの列番号は同じでなければなりません。

  • NULL:空の列を偽造します。
  • ,:列を別の列から分離します
  • *:この列のエントリを表示します

何も起こらない場合は、*を次のように移動してみてください。

http://w34ksite.com/products.php?category=1 UNION ALL SELECT *, NULL, NULL FROM email

http://w34ksite.com/products.php?category=1 UNION ALL SELECT NULL, *, NULL FROM email

http://w34ksite.com/products.php?category=1 UNION ALL SELECT NULL, NULL, * FROM email

11
Baptiste