在學習報錯注入的過程中,對於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語法不支持的。 ! 也是不支持的,因此也可以使用。