安全小課堂第113期【二次注入漏洞挖掘】
Web應用程式已經從上世紀簡單的指令碼演變成了如今的單頁應用。然而,隨著Web應用程式的不斷複雜化不同型別的安全漏洞也隨之而來。其中有一種被稱之為二次注入的漏洞,該漏洞是一種在Web應用程式中廣泛存在的安全漏洞形式。相對於一次注入漏洞而言,二次注入漏洞更難以被發現,但是它卻具有與一次注入攻擊漏洞相同的攻擊威力。
JSRC 安全小課堂第113期,邀請到Cr0w作為講師就二次注入漏洞挖掘為大家進行分享。同時感謝各位小夥伴們的精彩討論
京安小妹:什麼是二次注入漏洞
Cr0w:
二次SQL%E6%B3%A8%E5%85%A5/">SQL注入,也稱為二階SQL注入,其原理和一階SQL注入(普通SQL注入)相同,均通過精心構造的網路請求(sql語句)獲取資料庫返回結果,二次注入是利用儲存在資料庫中的合法內容,追加構造SQL查詢語句,達到SQL注入攻擊的目的。
京安小妹:二次注入漏洞的危害
Cr0w :
普通SQL注入通過HTTP等網路互動的過程中,很容易被WAF、安全策略、前端JS檢測到,雖然利用工具普及,語句的構造方法眾多,但大多都在攻擊過程中被轉義或攔截,甚至被記錄了攻擊源遭到反滲透。而二次注入攻擊,可以一定程度上繞過前端策略的攔截,利用已構造好並存入資料庫中的合法內容,通過正規流程/系統去修改無許可權的內容,如別人的賬號密碼。另外,也可以避免一些簡單的單引號、雙引號、反斜線等轉義攔截對構造語句的影響。二次注入攻擊,除了在攻擊邏輯和尋找利用點有一些難度以外,其攻擊成本更低,利用方式更加多變,較難檢測。
京安小妹:二次注入漏洞的攻擊原理是什麼
Cr0w:
二次SQL注入漏洞原理與常規SQL注入原理一樣,通過構造特殊的輸入內容傳給服務端或資料庫達到欺騙伺服器執行惡意的SQL命令。因為其利用方式比較獨特,需要提前在資料庫中插入已經構造好的內容,並利用已有內容進行語句組合提交,方可成功利用,所以稱其為二次注入或二階注入。
京安小妹:二次注入漏洞例項分析
Cr0w :
因為平時工作比較忙,沒來得及去找例項,這部分內容,簡單闡述下。
現在大部分的CTF比賽,上面的SQL注入漏洞,都不再是常規的普通注入和繞過利用。
舉個例子:
$content=addslashes($_POST['title']); $insert="INSERT INTO A(title,desc)VALUES('$title', '$desc')";
很簡單的一個插入語句,伺服器在插入文章title的過程中使用addsashes進行轉義,雙引號、單引號、反斜槓、空格都會被新增一個反斜槓,乍一看是不太好實現SQL注入的,但是如果查詢頁面是這樣
$id= addslashes($_GET['id']); $select_sql="SELECT *FROM A WHERE title='$id'";
雖然也被轉義,但是在第一步的時候,通過addslashes轉義的內容()不會插入到資料庫中,那我們可以釋出一篇文章,title構造成aaa’ union select user(),database()到資料庫中,在通過第二段的訪問頁面找到文章對應的id,訪問,便可看到user()和database()資訊。
例子:
$sql = "UPDATE users set PASSWORD=’$passwd’WHERE USERNAME=’$username’ AND OLD_PASS = ‘$oldpass’";
很簡單的一句sql,能看出就是一條修改密碼的語句,邏輯和內容上都沒有問題,那麼對於二次注入,問題就從這個$username開始,好多起名字的地方,沒有進行嚴格的暱稱校驗,導致任何內容都可以寫,那麼如果系統中存在admin賬戶,而我們又不知道密碼怎麼辦?新建一個使用者,命名為admin’--,admin和admin’--在建立時系統會把它識別為不同使用者,可以建立通過,但是在查詢的過程中,單引號”’”則為閉合,”--”則為註釋,那麼查詢語句就變成了
$sql = "UPDATE users set PASSWORD=’$passwd’WHERE USERNAME=’admin’--’ AND OLD_PASS = ‘$oldpass’";
後面的歷史密碼校驗,完全被註釋掉,這樣,我們就可以通過admin’--使用者實現修改admin使用者的密碼,整個邏輯均屬於正常流程。
京安小妹:二次注入漏洞挖掘思路有哪些
Cr0w:
(1)資料庫儲存未轉義,大多來說,儲存到資料庫中的東西只是做了表面的轉義,實質上庫裡儲存的還是原始狀態的內容,在多數讀取未校驗的情況下,可輸入特殊字元並在頁面上完整顯示的部分,有可能存在二次注入的可能。
(2)強互動部分,SQL注入是需要與資料庫聯動的,但往往在登入、修改內容、釋出內容等功能上忽略了歷史資料這一點,所以在遇到有修改賬戶密碼、釋出留言、釋出內容的部分,大家不妨去試試註冊一個test或者admin’--或者admin賬號,然後在測試回覆的內容或者修改的內容是否達到預期。如果與預期不符,那麼有可能就存在二次注入,此時在精心構造sql語句即可。
(3)防禦繞過,有些地方明視訊記憶體在異常,但是又做了一些限制,比如年齡,限制了欄位為is_numeric,那麼我們可以通過轉換進位制,16進位制等方式將其錄入,查詢時的效果是一樣的,遇到其他的限制,跟xss繞過原理一樣,大家可以腦洞大開,搞一些資料庫可以解析的編碼進去。
(4)多錄入異常內容,多觀察返回結果,凡是與自己錄入的內容不一致的地方,就可以去看看是否存在二次注入。
京安小妹:二次注入漏洞防禦手段
Cr0w:
於普通SQL注入防禦內容基本一致
過濾、轉義。雖然程式碼規範寫的很好,但人為敲程式碼過程是不可控的,有時候即使轉義了,覆蓋的介面也不全,即使過濾了,覆蓋的內容也不全。
有能力的開發者或者企業,建立一個統一的sql查詢api,在api上做統一個防禦策略,包括過濾和轉義,效果會好很多。這樣程式碼層無論如何呼叫,通過api的內容完全可以保障其有效性和真實性。
對於普通SQL注入防禦的內容就不在闡述了。