簡介
sql注入一般分類如下:
- 基於時間注入
- 基於報錯注入
- 基於聯合查詢注入
- 基於布爾注入
基於報錯注入也是一種sql注入漏洞,漏洞原因是後端在處理用戶輸入時直接拼接進sql語句中進行執行,從而產生了正常業務之外的邏輯。其實本質上和xss這種代碼注入類似,核心是沒有區分開代碼和用戶輸入的數據。
基於報錯注入特點是頁面會直接顯示回顯sql語句執行的報錯信息,這樣我們其實可以通過故意構造錯誤的sql語句,將我們想要執行的攻擊sql語句的執行結果直接在頁面上回顯出來。
常見函數
mysql中最常見的利用函數就是extractvalue和updatexml這兩個了,以extractvalue爲例,看下它原始的用法:
ExtractValue(xml_str , Xpath) 函數,使用Xpath表示法從XML格式的字符串中提取一個值
函數利用
以上講的是extractvalue函數的正常使用情況,但是如果我們構造了不符合規定的Xpath,mysql就會報語法錯誤,並顯示XPath的內容,攻擊者也是利用這一特性,將想要執行的攻擊sql語句結果帶出來。
-
.XPATH語法的報錯條件是遇到特殊字符就會報錯,如
~
、{
等。以~
爲例,18進製爲0x7e,mysql本地執行可以帶出user()執行結果。
-
找個例子,可以通過extractvalue函數,成功查出當前user,可以看到並非是root權限。
payload:) and 1=(extractvalue(1,concat(0x7e,user(),0x7e))) and 1=1;
-
updatexml函數類似,如下:
payload:) and 1=(updatexml(1,concat(0x7e,user(),0x7e),1)) and 1=1;
-
另外有一點需要注意的是,報錯內容不可能不限制長,其實是有一定長度限制的,報錯內容大約是32個字符:
總結
在此小記下mysql基於報錯注入的利用。對於互聯網行業,此類注入一般比較少,最多的還是基於時間的注入。