- Web代碼安全漏洞深度剖析
- 曹玉杰 王樂 李家輝 孔韜循編著
- 1514字
- 2021-09-26 16:05:22
4.1 SQL注入的原理及審計思路
SQL注入漏洞是非常常見的Web漏洞類型,也是迄今為止破壞性最大的漏洞類型之一。產(chǎn)生SQL注入漏洞的原因是Web代碼中可控的參數(shù)沒有進行過濾或沒有進行有效的過濾,與程序中原有的SQL語句拼接,被帶入SQL模板中編譯執(zhí)行,造成了漏洞,漏洞點就在與數(shù)據(jù)庫的交互處。
SQL注入漏洞造成的危害大小,主要取決于攻擊目標(biāo)的權(quán)限。危害大的可獲取WebShell,乃至執(zhí)行系統(tǒng)命令,服務(wù)器提權(quán),進入內(nèi)網(wǎng),獲取數(shù)據(jù)庫的所有數(shù)據(jù),刪除數(shù)據(jù)庫中數(shù)據(jù)甚至刪除整個庫等操作;危害小的則獲取數(shù)據(jù)庫版本信息、賬號登錄、篡改小范圍數(shù)據(jù)等。
4.1.1 產(chǎn)生SQL注入的條件
產(chǎn)生SQL注入的條件有如下幾點。
1)可控參數(shù)。在業(yè)務(wù)應(yīng)用系統(tǒng)中,有很多功能是需要前端和后端交互的,軟件工程師要定義交互過程的數(shù)據(jù)傳輸參數(shù),在沒經(jīng)過安全測試的狀態(tài)下,存在安全隱患的概率是很大的。例如,/index.php/artcle?id=1,id=1表明是當(dāng)前網(wǎng)站的第1頁,如果換成id=2就會變成網(wǎng)站的第2頁,以此類推。我們很容易明白該id參數(shù)與后面數(shù)字的作用。那么在測試過程當(dāng)中就可以嘗試加入其他SQL語句,例如and 1=2。
2)參數(shù)未過濾或過濾不嚴(yán)謹(jǐn)。交互必然要經(jīng)過后端,如果沒有經(jīng)過“危險內(nèi)容”過濾,會大概率導(dǎo)致SQL注入漏洞的產(chǎn)生,過濾“危險內(nèi)容”不嚴(yán)謹(jǐn)也會造成安全隱患。
3)可控參數(shù)能夠與數(shù)據(jù)庫交互,且與原有的SQL語句拼接。數(shù)據(jù)經(jīng)過服務(wù)端必然要根據(jù)業(yè)務(wù)系統(tǒng)設(shè)計者所需要的需求操作數(shù)據(jù)庫,這個過程最容易與原有SQL拼接。一旦被執(zhí)行,就會造成安全隱患。
4.1.2 SQL注入漏洞類型
SQL注入漏洞可以按以下三種方式進行分類。
●根據(jù)注入的可控參數(shù)的類型,可分為數(shù)字型注入和字符型注入。
●根據(jù)注入產(chǎn)生的位置,可分為GET注入、POST注入、cookie注入、header頭注入等。
●根據(jù)攻擊的手法,可分為普通注入、延時注入、盲注、報錯注入、寬字節(jié)注入、二次注入等。
下面介紹幾個常見的SQL注入漏洞發(fā)生場景。
●GET請求。一般對應(yīng)的程序功能是查詢搜索、列表、詳情等,尤其是在多字段查詢的情況下,要認真查看參數(shù)有沒有進行過濾行為,或使用預(yù)編譯的占位符進行參數(shù)綁定。列表、詳情功能中可能存在數(shù)字型注入或者字符型注入。
●POST請求。一般對應(yīng)的程序功能是提交、更新、查詢,如登錄、忘記密碼找回處,驗證用戶名是否存在等功能。按照GET請求搜尋SQL注入漏洞的方式進行判斷。
●Header頭。比如cookie注入、IP偽造注入等。一般注冊、登錄處會有IP獲取,后端一般是采用HTTP_CLIENT_IP或者X-FORWARD-FOR(也就是XFF)進行獲取,而這種是可以偽造的。若此處沒有過濾,就有可能出現(xiàn)多次注入。在搜尋此處位置漏洞的時候一定要查看是否進行標(biāo)準(zhǔn)IP類型過濾。
●$_SERVER。如果目標(biāo)程序使用GPC轉(zhuǎn)義的話,是不會對$_SERVER的值進行轉(zhuǎn)義的,所以在$_SERVER與數(shù)據(jù)庫交互的時候,也要檢查是否進行過濾(按照GET請求方式檢測)。
4.1.3 審計思路
涉及SQL注入的功能太多,從數(shù)據(jù)庫里獲取數(shù)據(jù)顯示、驗證數(shù)據(jù)、寫入數(shù)據(jù)、修改數(shù)據(jù)、刪除數(shù)據(jù)的功能點等,都可能存在SQL注入。換句話說,只要跟數(shù)據(jù)庫進行交互,SQL注入漏洞就有可能存在。在審計SQL注入漏洞是否存在之前,最好先查看一下是否有防御SQL注入的方法。
4.1.4 防御建議
一般采用預(yù)編譯機制來防御SQL注入。
1)用參數(shù)值規(guī)則防御。參數(shù)傳遞時要設(shè)置參數(shù)值的規(guī)則,例如用戶名,檢查其程序是否有命名規(guī)則,如果有則按命名規(guī)則進行防御,比如用戶名只能為字母或者有長度限制。如傳遞時間參數(shù)的形式為“2018-09-12 21:21:21”,那就可以使用針對此種寫法的正則去防御。檢查用正則的時候是否用^$來匹配字符串的開始與結(jié)束位置,如果沒有則可能會出現(xiàn)注入漏洞。
2)危險關(guān)鍵詞防御,也就是設(shè)置黑名單。這種防御方法、防御類庫在網(wǎng)上都有很多優(yōu)秀的示例,防御機制主要是攔截可控參數(shù)中帶有select、union、updatexml等惡意關(guān)鍵詞的傳參。
3)預(yù)編譯機制。對于搜索等功能,可以使用預(yù)編譯機制,進行參數(shù)綁定來攔截非法傳參。
下面用案例剖析SQL注入漏洞。
- 網(wǎng)絡(luò)安全與管理
- 黑客大曝光:無線網(wǎng)絡(luò)安全(原書第3版)
- 計算機網(wǎng)絡(luò)安全技術(shù)(第6版·慕課版)
- 大型互聯(lián)網(wǎng)企業(yè)安全架構(gòu)
- API攻防:Web API安全指南
- 從0到1:CTFer成長之路
- 云原生安全技術(shù)實踐指南
- Advanced Penetration Testing for Highly:Secured Environments(Second Edition)
- 安全防御入門手冊
- Mastering Reverse Engineering
- 華為Anti-DDoS技術(shù)漫談
- 功能型密碼算法設(shè)計與分析
- Practical Internet of Things Security
- 黑客攻防入門
- Web前端黑客技術(shù)揭秘