意外的MYSQL UNION和extractvalue行为

时间:2018-09-21 20:19:06

标签: mysql

当我发现无法解释的奇怪行为时,我正在尝试基于错误的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上测试

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”。

相关问题