在学习报错注入的过程中,对于extractvalue()这个函数的报错注入始终抱有一个疑问,为什么再concat连接语句时始终要有个0x7e在前面呢?
extractvalue(null, concat(0x7e, database()));
上面这个语句为什么会报错?首先讲下extractvalue()这个函数的作用。
ExtractValue(xml_frag, xpath_expr)
ExtractValue()
接受两个字符串参数,一个XML标记片段 xml_frag和一个XPath表达式 xpath_expr(也称为 定位器); 它返回CDATA
第一个文本节点的text(),该节点是XPath表达式匹配的元素的子元素。第一个参数可以传入目标xml文档,第二个参数是用Xpath路径法表示的查找路径
如何让extractvalue()这个函数产设错误并报告?那么自然需要在使用过程中有语法错误,怎么去创造这个语法错误使得这个错误变得万能呢?就是使用这个语法中本身不含有或者不支持的字符。
例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b');
就是寻找前一段xml文档内容中的a节点下的b节点,这里如果Xpath格式语法书写错误的话,就会报错。这里就是利用这个特性来获得我们想要知道的内容。
在ASCII码表中,0x7e这个十六进制数代表符号~,~这个符号在xpath语法中是不存在的,因此总能报错。同理,肯定也有其他字符是XPATH语法不支持的。 ! 也是不支持的,因此也可以使用。