0

我在ORDER BY子句中使用了这种盲目的 SQL 注入:

(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], ...

您的第一个示例中的The(CASE WHEN 1 THEN col1 ELSE col2 END)有效,因为它是一个expression。但是,DESCandASC不是表达式的一部分,而是固定标记。

与此类似,LIMIT子句定义为:

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

同样,offsetrow_count也不是表达式,而只是数字:

LIMIT接受一个或两个数字参数,它们都必须是非负整数常量 […]

于 2013-04-28T10:53:57.663 回答