当我发现无法解释的奇怪行为时,我正在尝试基于错误的sql注入。这是一个简单的示例:
SELECT * FROM users WHERE username = '' union SELECT extractvalue(rand(),concat(0x3a,(SELECT 1)));
输出:错误1105(HY000):XPATH语法错误:':1'
但是...
SELECT * FROM users WHERE username = '' union SELECT extractvalue(rand(),concat(0x3a,(SELECT 1 FROM users)));
输出:错误1222(21000):使用的SELECT语句具有不同的列数
现在第二个结果是预期的,因为我的用户表有3列。第一个例子是我不理解的例子。
在5.7.23-0ubuntu0.16.04.1上测试
答案 0 :(得分:1)
从我弄乱它的结果可以看出,由于您使用的是子查询,因此表达式的计算顺序不同。如果您这样做:
SELECT some_col FROM users WHERE username = '' union SELECT extractvalue(rand(),concat(0x3a,(SELECT 1 FROM users LIMIT 1)));
从本质上解决“列数不同”的异常,我认为您将再次获得与第一行相同的错误。至少在我的测试中,就是这样。我想这与评估子查询的时间有关,原因是必须在完成extractvalue()调用之前发生。
我也很确定mysql不会将“ SELECT 1”作为子查询读取,而是可能完全放弃了“ SELECT”。