代码之家  ›  专栏  ›  技术社区  ›  MyUsername112358

意外的MYSQL联合和提取值行为

  •  0
  • MyUsername112358  · 技术社区  · 6 年前

    我在尝试基于错误的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语句的列数不同

    现在,第二个结果是预期的,因为我的users表有3列。第一个例子是我不明白的。

    在5.7.23-0ubuntu0上测试。16.04.1

    1 回复  |  直到 6 年前
        1
  •  1
  •   Troncoso    6 年前

    从我对它的处理中可以看出,因为您使用的是子查询,所以表达式的求值顺序不同。如果你这样做:

    SELECT some_col FROM users WHERE username = '' union SELECT extractvalue(rand(),concat(0x3a,(SELECT 1 FROM users LIMIT 1)));
    

    基本上解决了“不同列数”的异常,我认为您将再次得到与第一行相同的错误。至少在我的测试中,情况就是这样。我想这与子查询的计算时间有关,因为这必须在extractvalue()调用完成之前发生。

    我也很确定mysql不会将“SELECT 1”作为子查询来读取,而是完全放弃了“SELECT”。