從Web日志還原SQL注入拖走的數(shù)據(jù)
利用SQL注入漏洞拖庫,從而導(dǎo)致數(shù)據(jù)泄漏。一般的排查方式,我們可以使用關(guān)鍵字進行搜索,找到可疑的url嘗試進行漏洞復(fù)現(xiàn),通過Web訪問日志來還原攻擊路徑,從而確定問題的根源。
但是,有一個問題卻一直困擾著我,攻擊者通過SQL注入漏洞到底獲取了什么數(shù)據(jù)?是所有的數(shù)據(jù),還只是訪問了其中的一張表?
理論上,假設(shè)所有的url參數(shù)請求日志都記錄完整的話,只需要重放每一個請求,然后根據(jù)請求響應(yīng)的情況,就可以一步步還原出被攻擊者拖走的數(shù)據(jù)。為此,我們來搭建一個場景來做攻擊數(shù)據(jù)還原,驗證一下這個挺有意思的猜想。
01、構(gòu)建SQL注入場景
通過PHP+MySql構(gòu)建了一個GET請求的sql注入點,使用SQL注入自動化工具脫庫,在access.log產(chǎn)生訪問日志,我們以此作為分析源。
Union聯(lián)合注入日志記錄:
127.0.0.1 - - [04/Apr/2021:19:55:14 +0800] "GET /test.php?id=1+and+1%3D2+union+select+1%2C2%2Cconcat%280x7177657E%2Cschema_name%2C0x7E717765%29+from+information_schema.schemata HTTP/1.1" 200 329127.0.0.1 - - [04/Apr/2021:19:55:17 +0800] "GET /test.php?id=1++union+select+1%2C2%2Cconcat%280x7177657E%2Ctable_name%2C0x7E717765%29+from+information_schema.tables+where+table_schema%3D%27test%27 HTTP/1.1" 200 219127.0.0.1 - - [04/Apr/2021:19:55:21 +0800] "GET /test.php?id=1++union+select+1%2C2%2Cconcat%280x7177657E%2Ccolumn_name%2C0x7E717765%29+from+information_schema.columns+where+table_name%3D%27admin%27 HTTP/1.1" 200 247
這里的三個請求,依次是Union聯(lián)合查詢數(shù)據(jù)庫庫名、表名以及表的列名的請求。
02、簡單自動化實現(xiàn)
大致實現(xiàn)的思路:讀取access.log文件,獲取url_path,拼接成完整的url,重放HTTP請求,匹配請求響應(yīng)的內(nèi)容,得到被攻擊者拖走的數(shù)據(jù)。
為此,我自己動手嘗試實現(xiàn)了一個小demo來實現(xiàn)自動化。部分demo代碼,如下:
def sql_log_analysis(path,pattern):com = re.compile(pattern,re.I)keys = com.findall(unquote(path))a = keys[0][0].replace("0x","").decode('hex')b = keys[0][2].replace("0x","").decode('hex')url = domain_name+pathresponse = requests.get(url)pattern = a+r"(.*?)"+bcom2= re.compile(pattern)find_list=com2.findall(response.content)if len(find_list)>0:return keys,find_list
代碼運行截圖:

以上,就是一個簡單的自動化實現(xiàn)的過程,通過重放請求,反向還原SQL注入的過程,我們可以進一步了解到攻擊者到底動了哪些數(shù)據(jù)庫和表,甚至更詳細的數(shù)據(jù)字段。
03、存在的幾個問題
事實上,大部分的Web日志只記錄了GET類型的參數(shù)請求,而無法詳盡的記錄POST請求,這個給Web日志還原攻擊數(shù)據(jù)帶來極大的局限性。另外,不同的SQL注入類型,不同的SQL注入自動化工具,所構(gòu)造的SQL語句變化很多,這也會加大自動化實現(xiàn)的難度。
基于以上,這種方式的應(yīng)用場景,可能更適用于小范圍內(nèi)特定的攻擊者請求日志,可以編寫腳本重放請求,還原攻擊者的SQL注入過程,獲悉被拖走的數(shù)據(jù)。
