0

このブラインドSQLインジェクションをORDER BY節で使用しました:

(CASE WHEN 1 THEN col1 ELSE col2 END)

次のようなクエリが生成されます。

SELECT x FROM y ORDER BY (CASE WHEN 1 THEN col1 ELSE col2 END) ASC

このインジェクションは成功し、ORDER BY 句のすべての列名をホワイト リストに登録しました。

他のエンドフィールドでは同様の注入を使用できませんでした。それが可能かどうか、またそれらのフィールドにもホワイトリストが必要かどうか疑問に思いました.

私はこの種の注射を試みましたが、成功しませんでした:

SELECT x FROM y ORDER BY col1 (CASE WHEN 1 THEN DESC ELSE ASC END)
SELECT x FROM y ORDER BY col1 DESC LIMIT (CASE WHEN 1 THEN 1 ELSE 0 END), 0
SELECT x FROM y ORDER BY col1 DESC LIMIT 0, CAST((CASE WHEN 1 THEN 1 ELSE 0 END) AS SIGNED)

DESC/ASC安全のために、フィールドとLIMIT変数をホワイトリストに登録するか、列挙する必要がありますか? 私はMySQLを使用しています。これらのインジェクションは、他の DBMS でも可能でしょうか?

4

1 に答える 1

1

SELECTこれは、構文定義を見ることで答えることができます。このORDER BY節は次のように定義されます。

ORDER BY {col_name | expr | position} [ASC | DESC], ...

あなたの(CASE WHEN 1 THEN col1 ELSE col2 END)最初の例では、それがであるため機能します。ただし、DESCandASCは式の一部ではなく、固定トークンです。

それと同様に、LIMIT句は次のように定義されます。

LIMIT {[offset,] row_count | row_count OFFSET offset}

ここでも、offsetrow_countは式ではなく、数値のみです。

LIMIT1 つまたは 2 つの数値引数を取りますが、どちらも非負の整数定数でなければなりません […]

于 2013-04-28T10:53:57.663 に答える