# 定義:
二次注入是指已存儲(數據庫,文件等)的用戶輸入被讀取后再次進入到SQL查詢語句中導致注入。可能每一次注入都不構成漏洞,但是如果一起用就可能造成注入。
# 成因:
本質上是信任問題。
開發者可能不信任直接來自于用戶的數據,對其進行嚴格的過濾后存儲。但是對于已存儲的數據就不會進行過濾,轉義,取出后直接放入SQL語句中,可能導致注入。
# 危害:
* SQL注入的危害
* 隱蔽性好,不易被發現,更危險
* 數量少
* 攻擊位存在于DB上,DB上的操作有限
# 二次注入漏洞與普通注入漏洞的區別:
* 二次注入是sql注入的一種,但是比普通sql注入難利用,利用門檻高
* 普通注入數據直接進入到SQL查詢中
* 二次注入是輸入數據經處理后存儲,取出后,再次進入到SQL查詢
* 滲透過程越復雜,不確定因素越多,成功率越低。如果二次注入必須由管理員在后臺來被動觸發,更加難以實現
* 二次注入漏洞只能靠人工,需要對應用有一個完整的理解
# 二次注入漏洞挖掘:
* 需要理解+細心+耐心;要注意敏感函數是否在使用
* 在回溯數據輸入是,需要考慮來自數據庫,文件等的輸入。回溯這些輸入的初始來源,進一步判斷是否可控
* 跨語言的應用,容易導致問題。比如前臺PHP,后臺java
* 在查詢函數上打點,斷點,或者log都可以。然后回溯代碼,觀察log
# 防御:
* 預處理+數據綁定
* 對所有的輸入一視同仁,不論輸入來自用戶還是存儲,在進入SQL查詢前都對其進行過濾,轉義
* 代碼審查的時候,禁止開發用拼接的方式執行sql
# 易出現二次注入漏洞的功能:
* 日志相關:存日志時,讀取了一些數據庫里的信息,比如用戶名等,然后又存儲了一次
* 跨程序的數據傳遞:程序A處理完后存儲到數據庫,程序B去讀取,未進行過濾