報錯注入:extractvalue、updatexml報錯原理
MySQL 5.1.5版本中添加了對XML文檔進行查詢和修改的兩個函數:extractvalue、updatexml
名稱 | 描述 |
---|---|
ExtractValue() |
使用XPath表示法從XML字符串中提取值 |
UpdateXML() |
返回替換的XML片段 |
通過這兩個函數可以完成報錯注入
一、extractvalue函數
ExtractValue(xml_frag, xpath_expr)
ExtractValue()
接受兩個字符串參數,一個XML標記片段 xml_frag和一個XPath表達式 xpath_expr(也稱為 定位器); 它返回CDATA
第一個文本節點的text(),該節點是XPath表達式匹配的元素的子元素。
第一個參數可以傳入目標xml文檔,第二個參數是用Xpath路徑法表示的查找路徑
例如:SELECT ExtractValue('<a><b><b/></a>', '/a/b');
就是尋找前一段xml文檔內容中的a節點下的b節點,這里如果Xpath格式語法書寫錯誤的話,就會報錯。這里就是利用這個特性來獲得我們想要知道的內容。
(這里我們是為了學習報錯注入,所以不需要太詳細的知道該函數具體原理)
利用concat函數將想要獲得的數據庫內容拼接到第二個參數中,報錯時作為內容輸出。
二、updatexml函數
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target:: 需要操作的xml片段
xpath_expr: 需要更新的xml路徑(Xpath格式)
new_xml: 更新后的內容
此函數用來更新選定XML片段的內容,將XML標記的給定片段的單個部分替換為 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替換的部分 與xpath_expr 用戶提供的XPath表達式匹配。
如果未xpath_expr找到表達式匹配 ,或者找到多個匹配項,則該函數返回原始 xml_targetXML片段。所有三個參數都應該是字符串。使用方式如下:
mysql> SELECT
-> UpdateXML('<a><b>ccc</b><d></d></a>', '/a', '<e>fff</e>') AS val1,
-> UpdateXML('<a><b>ccc</b><d></d></a>', '/b', '<e>fff</e>') AS val2,
-> UpdateXML('<a><b>ccc</b><d></d></a>', '//b', '<e>fff</e>') AS val3,
-> UpdateXML('<a><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val4,
-> UpdateXML('<a><d></d><b>ccc</b><d></d></a>', '/a/d', '<e>fff</e>') AS val5
-> \G
***********結果**************
val1: <e>fff</e>
val2: <a><b>ccc</b><d></d></a>
val3: <a><e>fff</e><d></d></a>
val4: <a><b>ccc</b><e>fff</e></a>
val5: <a><d></d><b>ccc</b><d></d></a>
這里和上面的extractvalue函數一樣,當Xpath路徑語法錯誤時,就會報錯,報錯內容含有錯誤的路徑內容:
參考鏈接:
https://blog.csdn.net/zpy1998zpy/article/details/80631036
https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html