web安全漏洞加固方案简析
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
????本文比較粗糙,作用是引領(lǐng)大家認(rèn)識(shí)web安全漏洞并根據(jù)自己參與的安全加固工作提供一些解決思路。
開(kāi)始——安全掃描報(bào)告
? ? Web應(yīng)用的安全加固是從安全掃描報(bào)告(當(dāng)然有經(jīng)驗(yàn)的架構(gòu)師和軟件工程師可以在架構(gòu)和編碼時(shí)將漏洞消滅于萌芽),加固人員通常根據(jù)報(bào)告的內(nèi)容針對(duì)性的完善程序漏洞。
????目前一下是見(jiàn)過(guò)IBM Relational AppScan、Fortity、Acunetix Website Audit的安全掃描報(bào)告(由于涉及漏洞信息,具體的內(nèi)容就不展示了)。
IBM Relational AppScan
?
Fortity
Acunetix Website Audit報(bào)告
????如果能使用安全掃描工具進(jìn)行掃描,那就更好了,畢竟報(bào)告是掃描工具生成的,掃描工具的結(jié)果更詳細(xì),更具參考性。如IBM Relational AppScan。
IBM Relational AppScan掃描結(jié)果
消滅漏洞——安全漏洞分析
????以IBM Relational AppScan的漏洞結(jié)果為例,我們常見(jiàn)的漏洞如下,大致分4個(gè)級(jí)別
????????Microsoft Windows MHTML 跨站點(diǎn)腳本編制【級(jí)別-高】
????????SQL 盲注【級(jí)別-高】
????????已解密的登錄請(qǐng)求【級(jí)別-高】
????????跨站點(diǎn)請(qǐng)求偽造【級(jí)別-中】
????????鏈接注入【級(jí)別-中】
????????通過(guò)框架釣魚(yú)【級(jí)別-中】
????????Autocomplete HTML Attribute Not Disabled for Password Field【級(jí)別-低】
????????Internal IP Disclosure Pattern Found in Parameter Value【級(jí)別-低】
????????檢測(cè)到文件替代版本【級(jí)別-低】
????????臨時(shí)文件下載【級(jí)別-低】
????????HTML敏感信息泄露【級(jí)別-參考】
????????發(fā)現(xiàn)電子郵件地址模式【級(jí)別-參考】
????????發(fā)現(xiàn)內(nèi)部IP泄露模式【級(jí)別-參考】
????????潛在的文件上載【級(jí)別-參考】
?
注:為避免信息泄漏,請(qǐng)求中很多無(wú)關(guān)信息進(jìn)行了修改,關(guān)鍵部分不會(huì)變更
Microsoft Windows MHTML 跨站點(diǎn)腳本編制【級(jí)別-高】
攻擊請(qǐng)求示例?
/demo/page/city/cityAction.do?method=cityTree&uid=1378952840737&id=Content-Type:%20multipart/related;%20boundary=_AppScan%0d%0a--_AppScan%0d%0aContent-Location:foo%0d%0aContent-Transfer-Encoding:base64%0d%0a%0d%0aPGh0bWw%2bPHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD48L2h0bWw%2b%0d%0a&a_dhx_rSeed=1378952840737
攻擊結(jié)果
<?xml?version='1.0'?encoding='utf-8'?> <tree?id="Content-Type:?multipart/related;?boundary=_AppScan --_AppScan Content-Location:foo Content-Transfer-Encoding:base64PGh0bWw+PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD48L2h0bWw+ "></tree>攻擊說(shuō)明
??? 通俗的講,這個(gè)漏洞就是攻擊者將一段惡意腳本已參數(shù)的形式發(fā)往后臺(tái),若web應(yīng)用沒(méi)有進(jìn)行防御將腳本返回前臺(tái),HTML將會(huì)將惡意代碼嵌入頁(yè)面,之后用戶(hù)信息將暴漏給攻擊者。
????以上面的漏洞為例,這個(gè)請(qǐng)求是JavaScript控件生成的,請(qǐng)求將根據(jù)一個(gè)id查詢(xún)其子節(jié)點(diǎn)數(shù)據(jù)并返回,由于樹(shù)形控件需要將數(shù)據(jù)返回前臺(tái)并拼接樹(shù),所以id屬性會(huì)返回前臺(tái)。
????當(dāng)攻擊者使用HTTP請(qǐng)求分析工具(如HttpWatch、瀏覽器自帶的開(kāi)發(fā)人員工具)獲取該請(qǐng)求地址后,可以修改id的屬性。如果后臺(tái)沒(méi)有對(duì)id屬性進(jìn)行校驗(yàn),那么攻擊腳本將會(huì)顯示在頁(yè)面,用戶(hù)的后續(xù)操作將暴漏給攻擊者。
?
建議加固方案
啟動(dòng)校驗(yàn)框架,對(duì)請(qǐng)求參數(shù)進(jìn)行校驗(yàn),比對(duì)使用正則表達(dá)式對(duì)id的值進(jìn)行校驗(yàn)——只能是字母和數(shù)組。
目前主流的框架如struts、spring都提供了豐富、靈活的校驗(yàn)框架,加上正則表達(dá)式的支持,安全加固工作可以快速的開(kāi)展。
?
額外說(shuō)明
a) 這個(gè)已經(jīng)到http請(qǐng)求級(jí)別,javascript的校驗(yàn)框架早已跳過(guò)(不得不說(shuō)javascript校驗(yàn)是紙老虎,限制一下合法用戶(hù)的輸入)
b) 有人會(huì)說(shuō)我輸入合法的id信息,但是不是這用戶(hù)有權(quán)限管理的id,這個(gè)怎么處理?首先,這個(gè)不是安全漏洞,應(yīng)當(dāng)算作業(yè)務(wù)漏洞,說(shuō)明程序在鑒權(quán)模塊的設(shè)計(jì)不夠完善;其次,安全漏洞不應(yīng)當(dāng)嵌入業(yè)務(wù)邏輯中進(jìn)行,進(jìn)行加固的最佳位置的進(jìn)入“控制層”之前(所有的框架都是這樣做的),進(jìn)行業(yè)務(wù)校驗(yàn)的最佳位置是“業(yè)務(wù)層”之前(簡(jiǎn)單系統(tǒng)建議使用AOP的方式在業(yè)務(wù)代理層中實(shí)現(xiàn))。
?
SQL 盲注【級(jí)別-高】
攻擊請(qǐng)求示例
POST /demo/page/reportgroup/ReportGroupUpdate.do?method=add&name=1234%2F**%2Fand%2F**%2F7659%3D7659&parentId=&parentName=1234&addUserGroup=&delUserGroup=&delReportGroup=&reportList=&description=1234
?
攻擊說(shuō)明
??? 非嚴(yán)謹(jǐn)?shù)慕忉尵褪枪粽邔阂獯a已請(qǐng)求參數(shù)的形式傳入后臺(tái),若后臺(tái)進(jìn)行數(shù)據(jù)庫(kù)查詢(xún),惡意代碼嵌入到SQL語(yǔ)句,使攻擊者可以獲得額外信息。假設(shè)原SQL是select * from t_user t where t.id = ?,若攻擊者注入* and 1=1,那么sql將是select * from t_user t where t.id = * and 1=1,這樣攻擊者就能看到所有用戶(hù)的信息。
??? 實(shí)際業(yè)務(wù)中的SQL遠(yuǎn)比以上復(fù)雜,但是攻擊者的攻擊方式也不是這么簡(jiǎn)單,因此要抓住要點(diǎn)進(jìn)行防御。
建議加固方案
1. 使用PrepareStatement。預(yù)編譯的SQL可以有效防御攻擊者的腳本,如果你使用了ORM框架,不用擔(dān)心,通常ORM框架都提供了類(lèi)似Preparestatement的支持,比如ibatis/mybatis中,SQL中使用##進(jìn)行參數(shù)站位將使用preparestatement。
2. 使用存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程轉(zhuǎn)入?yún)?shù)時(shí)將會(huì)進(jìn)行合法性校驗(yàn),惡意SQL通常會(huì)視為異常參數(shù)而無(wú)法處理。
3. 啟動(dòng)校驗(yàn)框架,對(duì)請(qǐng)求參數(shù)進(jìn)行校驗(yàn),這個(gè)可以更加通用,更加高效的攔截惡意SQL。
已解密的登錄請(qǐng)求【級(jí)別-高】
攻擊請(qǐng)求示例
POST /demo/page/user/editUser.jsp?userType=1&sccAdminName=1234&sccAdminPwd=1234&confirmSccAdminPwd=Acme-Hackme+Corp.&systemAdminName=1234&systemAdminPwd=1234&confirmSystemAdminPwd=Acme-Hackme+Corp.&description=1234
?
攻擊說(shuō)明
很好理解,你的請(qǐng)求中包含了明文密碼。由于抓去http請(qǐng)求非常簡(jiǎn)單,將用戶(hù)密碼明文傳輸基本就是告訴攻擊者我的密碼是多少。處理密碼,以下信息也需要進(jìn)行加密處理:
- 用戶(hù)名
- 密碼
- 社會(huì)保險(xiǎn)號(hào)碼
- 信用卡號(hào)碼
- 駕照號(hào)碼
- 電子郵件地址
- 電話號(hào)碼
- 郵政編碼
?
?
建議加固方案
1. 前端加密,后臺(tái)直接使用加密后的密碼進(jìn)行匹配。目前主流的方式是前段使用MD5加密,后臺(tái)直接使用密文密碼進(jìn)行匹配。
2. 有些業(yè)務(wù)比較特別,可能需要明文密碼進(jìn)行處理,這時(shí)候設(shè)計(jì)前段加密,后端解密的處理,可是由于加密鹽可能被JS暴漏,這個(gè)方案不是最好的選擇。
?
跨站點(diǎn)請(qǐng)求偽造【級(jí)別-中】
攻擊請(qǐng)求示例
POST /demo/checkkeystore.do HTTP/1.0
Cookie: JSESSIONID=00e66855f6cb368a2f543053af46; SSO=eG9YZStrSUV5U21GYUFuL2JqNjBLa3Zic2QyMXZHU0ZLNW81Z3VrdWZiNG5mbmJ3Mi91QmFjclF2SW5aOGFOWUZpL1V3UTRKQk1MQgpNNW1xY2dHaG5qd0tWQXdVQTNZeng0TW43Y0ZMVUFxZDlENGJPcEVWcTl5clIyV0NnTzRnZjFuSmRxdGhzZG89
Content-Length: 34
Accept: */*
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)
Host: 192.168.106.79:8080
Content-Type: application/x-www-form-urlencoded
Referer: http://bogus.referer.ibm.com
?
攻擊說(shuō)明
關(guān)于Referer:
HTTP Referer是header的一部分,當(dāng)瀏覽器向web服務(wù)器發(fā)送請(qǐng)求的時(shí)候,一般會(huì)帶上Referer,告訴服務(wù)器我是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的,服務(wù)器籍此可以獲得一些信息用于處理。
?
攻擊者可以竊取或操縱客戶(hù)會(huì)話和 cookie,它們可能用于模仿合法用戶(hù),從而使攻擊者能夠以該用戶(hù)身份查看或變更用戶(hù)記錄以及執(zhí)行事務(wù)。
?
建議加固方案
??? 使用filter對(duì)header的referer信息進(jìn)行校驗(yàn),referer信息可以為空、當(dāng)前web應(yīng)用以及信任地址。
?
鏈接注入【級(jí)別-中】
攻擊請(qǐng)求示例
GET /demo/page/grade/gradeAction.do?method=userGroupTree&authz=true&nodeType=province&fullId=ha&provinceId=ha&uid=1378952847091&id="'><A%20HREF="/WF_XSRF.html">Injected%20Link</A>&a_dhx_rSeed=1378952847091
?
攻擊說(shuō)明
???????? 和“跨站點(diǎn)腳本編制”類(lèi)似,只是請(qǐng)求注入了<a>標(biāo)簽,參數(shù)返回頁(yè)面時(shí)將在頁(yè)面生成可以非法的連接。由于這個(gè)相對(duì)“跨站點(diǎn)腳本編制”比較明顯,因此級(jí)別是中。
?
建議加固方案
啟動(dòng)校驗(yàn)框架,對(duì)請(qǐng)求參數(shù)進(jìn)行校驗(yàn),比對(duì)使用正則表達(dá)式對(duì)參數(shù)的值進(jìn)行校驗(yàn)——重點(diǎn)過(guò)濾<和>。
?
通過(guò)框架釣魚(yú)【級(jí)別-中】
攻擊請(qǐng)求示例
GET /demo/ city/cityAction.do?method=cityTree&uid=1378952840737&id=ha"/>%3cabc+xmlns%3axyz%3d'http%3a%2f%2fwww.w3.org%2f1999%2fxhtml'%3e%3cxyz%3aiframe+src%3d'http%3a%2f%2fdemo.testfire.net'%2f%3e%3c%2fabc%3e&a_dhx_rSeed=1378952840737
?
攻擊說(shuō)明
???????? 和“跨站點(diǎn)腳本編制”和“鏈接注入“類(lèi)似,只是請(qǐng)求注入了<iframe>或<frame>標(biāo)簽,參數(shù)返回頁(yè)面時(shí)將在頁(yè)面生成一個(gè)非法的嵌套頁(yè)面。
?
建議加固方案
啟動(dòng)校驗(yàn)框架,對(duì)請(qǐng)求參數(shù)進(jìn)行校驗(yàn),比對(duì)使用正則表達(dá)式對(duì)參數(shù)的值進(jìn)行校驗(yàn)——重點(diǎn)過(guò)濾<和>。
?
Autocomplete HTML Attribute Not Disabled for Password Field【級(jí)別-低】
攻擊說(shuō)明
??? HTML5中添加了新屬性Autocomplete,該屬性可以可以讓用戶(hù)在輸入框中找到歷史填寫(xiě)信息。若密碼輸入框(<input type="password" />)沒(méi)有關(guān)系該屬性,攻擊者可能會(huì)繞開(kāi) Web 應(yīng)用程序的認(rèn)證機(jī)制。
?
建議加固方案
??? 在開(kāi)發(fā)和修改時(shí),遇到密碼輸入框,關(guān)閉Autocomplete屬性。
<input?type="password"?autocomplete="off"?/>?
Internal IP Disclosure Pattern Found in Parameter Value【級(jí)別-低】
攻擊請(qǐng)求示例
POST /demo/authn/authAction.do?method=add&forwardUrl=http%3A%2F%2F192.168.11.93%3A80%2Chttp%3A%2F%2Fwww.baidu.com%3A80&resCode=IAM111&resKey=5OlwlhzHNn8%3D&from=iam&targetAction=%2FloginAction%21authByIAM.action
?
攻擊說(shuō)明
??? 參數(shù)值中發(fā)現(xiàn)了內(nèi)部IP,攻擊者可能會(huì)收集有關(guān) Web 應(yīng)用程序的敏感信息,如用戶(hù)名、密碼、機(jī)器名和/或敏感文件位置。
?
建議加固方案
??? 這個(gè)安全級(jí)別是低,由于IP地址被攻擊者獲取到后可能展開(kāi)后續(xù)針對(duì)服務(wù)器的攻擊,而不是直接攻擊當(dāng)前應(yīng)用程序,因此可參考修復(fù)。
?
檢測(cè)到文件替代版本【級(jí)別-低】
攻擊請(qǐng)求示例
GET /demo/_userAction.do
?
攻擊結(jié)果
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=01853c86546b44cb00af12e425e8; path=/demo
Content-Length: 2120
Server: TongWeb Server
P3P: CP="CAO PSA OUR"
Content-Type: text/html;charset=UTF-8
Date: Thu, 12 Sep 2013 02:55:31 GMT
Connection: close
?
攻擊說(shuō)明
??? 漏洞掃描工具嘗試在正確請(qǐng)求前添加下劃線“_”等符號(hào),判斷服務(wù)器上是否有舊版本或無(wú)用文件。
?
建議加固方案
??? 即時(shí)清理服務(wù)器上的舊版本或無(wú)用文件。
?
臨時(shí)文件下載【級(jí)別-低】
攻擊請(qǐng)求示例
GET /demo/Copy%20of%20userAction.do
?
攻擊結(jié)果
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=01850ed7359fdce3604aedd9dac9; path=/demo
Content-Length: 2120
Server: TongWeb Server
P3P: CP="CAO PSA OUR"
Content-Type: text/html;charset=UTF-8
Date: Thu, 12 Sep 2013 02:55:30 GMT
Connection: close
?
攻擊說(shuō)明
??? 漏洞掃描工具嘗試訪問(wèn)Copy of userAction.do,從而判斷服務(wù)器上是否遺留有備份文件。
?
建議加固方案
??? 即時(shí)清理服務(wù)器上的備份或無(wú)用文件。
?
參考級(jí)別的漏洞
參考級(jí)別不再一一介紹,參考級(jí)別可以說(shuō)不是漏洞,甚至有些時(shí)候就是正常的業(yè)務(wù)。
????HTML敏感信息泄露【級(jí)別-參考】
????????HTML中有有注釋信息,可供攻擊者參考
????發(fā)現(xiàn)電子郵件地址模式【級(jí)別-參考】
????????HTML中有郵件地址,攻擊者可以獲取目標(biāo)用戶(hù)的郵箱。
????發(fā)現(xiàn)內(nèi)部IP泄露模式【級(jí)別-參考】
????????頁(yè)面存在填寫(xiě)IP信息的輸入框,攻擊者可以抓去ip地址
????潛在的文件上載【級(jí)別-參考】
????????存在上傳功能,上傳功能可能導(dǎo)致攻擊者上傳惡意腳本。
?
總結(jié)
啟用校驗(yàn)框架
很多漏洞都可以通過(guò)校驗(yàn)框架實(shí)現(xiàn)加固,如Microsoft Windows MHTML 跨站點(diǎn)腳本編制【級(jí)別-高】、SQL 盲注【級(jí)別-高】、鏈接注入【級(jí)別-中】、通過(guò)框架釣魚(yú)【級(jí)別-中】。
不開(kāi)啟檢驗(yàn)框架是一個(gè)重大的錯(cuò)誤。
?
Header信息校驗(yàn)
雖然有些瀏覽器不支持header信息,但是這里依舊是攻擊的重點(diǎn)區(qū)域,需要對(duì)header信息進(jìn)行統(tǒng)一的管理。
?
安全報(bào)告不一定準(zhǔn)確
???????? 工具畢竟不是人,程序在判斷漏洞的時(shí)候有一些硬性條件,比如:返回200狀態(tài)、頁(yè)面顯示了某些數(shù)據(jù)等。
???????? 這些結(jié)果也許是錯(cuò)誤的:假設(shè)我的web應(yīng)用攔截并處理的攻擊,但是我需要在頁(yè)面提示,由于服務(wù)器響應(yīng)的這次攻擊請(qǐng)求,漏掃軟件依舊認(rèn)為web被攻擊了。
?
區(qū)分業(yè)務(wù)校驗(yàn)和安全漏洞
輸入非權(quán)限管理范圍的信息能夠查詢(xún)到數(shù)據(jù),這類(lèi)操作是程序的鑒權(quán)模塊不完善導(dǎo)致的,不能算作安全漏洞。
同時(shí),安全的加固通常在進(jìn)入控制層之前完成,如filter或是校驗(yàn)框架。鑒權(quán)通常在業(yè)務(wù)層之前完成,如service的代理類(lèi)中。兩者混淆將導(dǎo)致程序復(fù)雜度的增加。
?
千里之堤毀于蟻穴
????平時(shí)的代碼開(kāi)發(fā)中就應(yīng)當(dāng)考慮安全編碼,在漏洞爆發(fā)后再修復(fù)所帶來(lái)的損失將是不可估量的。
????不積跬步無(wú)以至千里,加強(qiáng)安全編碼是一項(xiàng)長(zhǎng)期的工作,需要每一位開(kāi)發(fā)者重視。
轉(zhuǎn)載于:https://my.oschina.net/SEyanlei/blog/264307
總結(jié)
以上是生活随笔為你收集整理的web安全漏洞加固方案简析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 对List中对象的去重
- 下一篇: tcl中的string trim使用时需