背景
說(shuō)來(lái)慚愧菜职,6 年的 web 編程生涯,一直沒(méi)有真正系統(tǒng)的學(xué)習(xí) web 安全知識(shí)(認(rèn)證和授權(quán)除外),這個(gè)月看了一本《Web 安全設(shè)計(jì)之道》汉额,書(shū)中的內(nèi)容多是從微軟官方文檔翻譯而來(lái),這本書(shū)的含金量不高榨汤,不過(guò)也不能說(shuō)沒(méi)有收獲蠕搜,本文簡(jiǎn)單記錄一下我學(xué)習(xí) Web 安全方面的筆記。
本文不涉及 IIS件余、Windows 和 SqlServer 的安全管理與配置讥脐,盡量只談編程相關(guān)的安全問(wèn)題遭居。
最簡(jiǎn)單的 Web 物理架構(gòu)
您必須了解 HTTP 協(xié)議啼器,可以閱讀這篇文章:HTTP 協(xié)議詳解,簡(jiǎn)單總結(jié)如下:
瀏覽器和服務(wù)器的通信采用無(wú)狀態(tài)的 HTTP 協(xié)議俱萍。
通過(guò)控制 HTTP 的請(qǐng)求頭端壳,可以控制:客戶端緩存、Cookie枪蘑、請(qǐng)求編碼损谦、相應(yīng)編碼等。
請(qǐng)求內(nèi)容向服務(wù)器提交數(shù)據(jù)(POST 和 GET)岳颇,響應(yīng)內(nèi)容向?yàn)g覽器發(fā)送數(shù)據(jù)照捡。
Cookie 包含在每個(gè)請(qǐng)求和響應(yīng)中,因此客戶端和服務(wù)器都可以訪問(wèn)到话侧。
一般使用 Cookie 來(lái)維護(hù)一個(gè)瀏覽器會(huì)話(也有其他方式)栗精。
攻擊方式總覽
這里有一個(gè)一般性的介紹:網(wǎng)站安全。
Web 軟件安全攻擊防護(hù)
瀏覽器安全攻擊
Cookie 假冒
定義
非期望的修改 Cookie 的值瞻鹏。
場(chǎng)景
服務(wù)器將用戶的授權(quán)信息存儲(chǔ)在 Cookie 中悲立,然后客戶端用這些 Cookie 決定導(dǎo)航的顯示與否。如果有程序惡意的修改了Cookie新博,會(huì)導(dǎo)致權(quán)限提升薪夕。
攻擊方式
注入的 Javascript 代碼。
使用瀏覽器調(diào)試工具赫悄。
本機(jī)病毒等原献。
防護(hù)措施
盡量將 Cookie 設(shè)置為 HttpOnly,瀏覽器偽造不了這種 Cookie埂淮。
防止 Javascript 注入姑隅。
隱藏變量修改
定義
非期望的修改隱藏變量。
場(chǎng)景
訂單的折扣計(jì)算完全依賴客戶端的某個(gè)變量同诫,這個(gè)變量是從服務(wù)器生成的粤策,所有邏輯都在客戶端計(jì)算,服務(wù)器只是接受最后的計(jì)算結(jié)果误窖。如果有程序惡意的修改了變量叮盘,會(huì)繞過(guò)某些業(yè)務(wù)邏輯秩贰。
攻擊方式
注入的 Javascript 代碼。
使用瀏覽器調(diào)試工具柔吼。
保護(hù)措施
防止 Javascript 注入毒费。
關(guān)鍵的功能不要依靠客戶端控制,要采用服務(wù)器控制愈魏。
跨站腳本攻擊
定義
惡意的提交 Javascript 代碼觅玻。
場(chǎng)景
在博客的評(píng)論功能中,如果用戶惡意的提交 Javascript 代碼培漏,假如這些 Javascript 沒(méi)有被過(guò)濾溪厘,極端的情況下,這些代碼會(huì)劫持所有訪問(wèn)此頁(yè)面用戶的會(huì)話牌柄,訪問(wèn)和修改任意數(shù)據(jù)畸悬。
攻擊方式
注入的 Javascript 代碼。
使用瀏覽器調(diào)試工具珊佣。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過(guò)濾惡意輸入蹋宦。
開(kāi)啟?ValidateRequest="true"。
對(duì)輸出使用?this.Server.HtmlEncode咒锻。
服務(wù)器安全攻擊
緩沖區(qū)溢出
定義
某些可能輸入會(huì)導(dǎo)致服務(wù)器堆棧溢出冷冗,這直接致使服務(wù)器不可用。
場(chǎng)景
程序提供了某項(xiàng)計(jì)算密集型的功能惑艇,此功能沒(méi)有限制用戶輸入蒿辙,用戶在有意或無(wú)意之間輸入了一個(gè)非法的值,導(dǎo)致了緩沖區(qū)溢出敦捧。
攻擊方式
非法輸入须板。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過(guò)濾惡意輸入。
采用防偽式編程兢卵。
認(rèn)證逃避
定義
某些 URL 沒(méi)有出現(xiàn)在主頁(yè)導(dǎo)航界面习瑰,系統(tǒng)只對(duì)導(dǎo)航頁(yè)面進(jìn)行了認(rèn)證和授權(quán)管理,這些沒(méi)有出現(xiàn)在導(dǎo)航中的 URL 可能被惡意用戶給分析出來(lái)秽荤,直接進(jìn)行訪問(wèn)甜奄。
場(chǎng)景
用戶管理分為三個(gè)頁(yè)面:List.aspx、New.aspx窃款,程序只對(duì) List.aspx 進(jìn)行認(rèn)證和授權(quán)了课兄,某些用戶直接訪問(wèn) New.aspx 執(zhí)行添加操作。
攻擊方式
直接地址訪問(wèn)晨继。
保護(hù)措施
梳理網(wǎng)站的整體結(jié)構(gòu)烟阐,對(duì)所有頁(yè)面進(jìn)行認(rèn)證和授權(quán)管理。
非法輸入
定義
病從口入,禍從口出蜒茄。很多攻擊方式都是因?yàn)榉欠ㄝ斎雽?dǎo)致的唉擂。
場(chǎng)景
程序只在客戶端對(duì)輸入進(jìn)行了驗(yàn)證,服務(wù)器未做任何驗(yàn)證檀葛,惡意的程序可以繞過(guò)客戶端邏輯直接向服務(wù)器提交非法輸入玩祟,這很容易導(dǎo)致各種安全問(wèn)題。
攻擊方式
注入的 Javascript 代碼屿聋。
使用瀏覽器調(diào)試工具空扎。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過(guò)濾惡意輸入。
防止 Javascript 注入润讥。
授權(quán)逃避
定義
某些 URL 沒(méi)有出現(xiàn)在主頁(yè)導(dǎo)航界面转锈,系統(tǒng)只對(duì)導(dǎo)航頁(yè)面進(jìn)行了認(rèn)證和授權(quán)管理,這些沒(méi)有出現(xiàn)在導(dǎo)航中的 URL 可能被惡意用戶給分析出來(lái)象对,直接進(jìn)行訪問(wèn)黑忱。還有一種可能是:系統(tǒng)只在客戶端進(jìn)行了授權(quán)管理宴抚,服務(wù)器代碼并沒(méi)有進(jìn)行授權(quán)驗(yàn)證勒魔,惡意用戶很容易就可以逃避授權(quán)。
場(chǎng)景
當(dāng)用戶沒(méi)有 Create 權(quán)限的時(shí)候菇曲,系統(tǒng)只是禁用了瀏覽器按鈕冠绢,并沒(méi)有做服務(wù)器授權(quán),然后用戶使用瀏覽器調(diào)試工具啟用了按鈕常潮,就可以執(zhí)行 Create 了弟胀。
攻擊方式
直接地址訪問(wèn)。
修改客戶端代碼喊式。
保護(hù)措施
梳理網(wǎng)站的整體結(jié)構(gòu)孵户,對(duì)所有頁(yè)面進(jìn)行認(rèn)證和授權(quán)管理。
在服務(wù)器進(jìn)行授權(quán)管理岔留。
SQL 注入
定義
對(duì)于和后臺(tái)數(shù)據(jù)庫(kù)產(chǎn)生交互的網(wǎng)頁(yè)夏哭,如果沒(méi)有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行全面的判斷,就會(huì)使應(yīng)用程序存在安全隱患献联。用戶可以在可以提交正常數(shù)據(jù)的URL或者表單輸入框中提交一段精心構(gòu)造的數(shù)據(jù)庫(kù)查詢代碼竖配,使后臺(tái)應(yīng)用執(zhí)行攻擊著的SQL代碼,攻擊者根據(jù)程序返回的結(jié)果里逆,獲得某些他想得知的敏感數(shù)據(jù)进胯,如管理員密碼,保密商業(yè)資料等原押。
場(chǎng)景
服務(wù)器程序使用字符串拼接的方式來(lái)構(gòu)造 SQL 語(yǔ)句胁镐,這就會(huì)導(dǎo)致 SQL 注入攻擊的可能。
攻擊方式
惡意的提交 SQL 片段。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過(guò)濾惡意輸入盯漂。
不要拼湊 SQL 參數(shù)烁巫,采用 DbParameter 設(shè)置參數(shù)。
最小化 SQL Server 訪問(wèn)賬戶的權(quán)限宠能。
異常敏感信息泄露
定義
未處理異常直接顯示到瀏覽器亚隙,這會(huì)導(dǎo)致敏感信息被泄露,對(duì)最終用戶來(lái)說(shuō)违崇,也會(huì)讓他們感覺(jué)系統(tǒng)不夠安全和易用阿弃。
場(chǎng)景
因?yàn)殚_(kāi)發(fā)原因,在某些場(chǎng)景下瀏覽器將后端的異常直接顯示給瀏覽器了羞延,如:NullReferenceException等渣淳。
攻擊方式
在調(diào)用的最上層,為處理掉全部異常伴箩。
在調(diào)用的下層入愧,為封裝合適的異常信息。
保護(hù)措施
定義合理的異常處理策略嗤谚。
異常一定不能跨越邊界直接顯示到瀏覽器棺蛛。
上傳攻擊
定義
用戶惡意的上傳外掛、木馬和其它程序等巩步。
場(chǎng)景
你做了一個(gè)上傳功能旁赊,結(jié)果對(duì)上傳的文件沒(méi)有做好足夠的控制,比如:某些惡意的用戶會(huì)上傳一些惡意的腳本椅野,然后執(zhí)行這些腳本终畅。
攻擊方式
上傳惡意文件。
保護(hù)措施
在服務(wù)器端驗(yàn)證和過(guò)濾惡意輸入竟闪,如:后綴名限制离福。
對(duì)上傳后的文件進(jìn)行掃描和殺毒。
抵賴
定義
某些用戶由于某些原因炼蛤,不愿意承認(rèn)自己執(zhí)行過(guò)某些操作妖爷,當(dāng)然,某些操作可能是他們沒(méi)有意識(shí)的情況下執(zhí)行的鲸湃。
場(chǎng)景
用戶一不小心執(zhí)行的刪除操作赠涮,然后立即發(fā)現(xiàn)自己操作錯(cuò)誤了,然后他打電話給售后暗挑,說(shuō)系統(tǒng)有問(wèn)題笋除。
攻擊方式
界面引導(dǎo)不夠友好,容易導(dǎo)致誤操作炸裆,為了推卸責(zé)任垃它,進(jìn)行抵賴。
用戶惡意的執(zhí)行操作,然后抵賴国拇。
保護(hù)措施
提高界面的易用性洛史。
關(guān)鍵操作的提醒要足夠明顯。
所有操作要留下操作日志酱吝。
數(shù)據(jù)庫(kù)安全攻擊
連接字符串暴漏
定義
數(shù)據(jù)庫(kù)連接字符串中包含用戶名和密碼也殖,這些信息以明文的形式存儲(chǔ)在配置文件中,運(yùn)維和開(kāi)發(fā)人員都能看得到务热,隨著團(tuán)隊(duì)人員的流動(dòng)忆嗜,這些敏感信息也會(huì)暴漏。
場(chǎng)景
直接將連接字符串配置在 Web.Config 中崎岂,而這個(gè)文件沒(méi)有被加密捆毫。
攻擊方式
未加密連接字符串。
未加密配置文件冲甘。
保護(hù)措施
加密連接字符串绩卤。
加密配置文件。
存儲(chǔ)數(shù)據(jù)泄露和篡改
定義
某些敏感信息最終需要被存儲(chǔ)在數(shù)據(jù)庫(kù)中江醇,如果這些信息被存儲(chǔ)為明文濒憋,會(huì)有很多人員可以看到這些信息,極端情況下嫁审,某些黑客攻陷了服務(wù)器跋炕,也可以看到這些數(shù)據(jù)。
場(chǎng)景
為加密密碼律适、關(guān)鍵財(cái)務(wù)信息,稅務(wù)局來(lái)查賬了遏插。
攻擊方式
未加密敏感數(shù)據(jù)捂贿。
加密方法過(guò)于簡(jiǎn)單。
保護(hù)措施
加密敏感數(shù)據(jù)胳嘲。
對(duì)某些數(shù)據(jù)采用不可逆加密厂僧,如:密碼。
對(duì)某些數(shù)據(jù)采用可逆加密了牛,如:財(cái)務(wù)數(shù)據(jù)颜屠。
網(wǎng)絡(luò)安全攻擊
拒絕服務(wù)攻擊
定義
惡意用戶試圖攻擊服務(wù)器、網(wǎng)絡(luò)和系統(tǒng)鹰祸,最終的目的是讓系統(tǒng)不可用甫窟,停止對(duì)外服務(wù)。
場(chǎng)景
惡意用戶在嘗試并發(fā)的無(wú)限制的向服務(wù)器發(fā)送請(qǐng)求蛙婴,試圖讓服務(wù)器的負(fù)載達(dá)到最大粗井,最終讓系統(tǒng)停止對(duì)外服務(wù)。
攻擊方式
攻擊網(wǎng)絡(luò)。
攻擊服務(wù)器浇衬。
攻擊系統(tǒng)懒构。
保護(hù)措施
在程序級(jí)別,識(shí)別并攔截惡意的請(qǐng)求耘擂。
購(gòu)買(mǎi)第三方安全軟件胆剧。
傳輸數(shù)組泄露、篡改
定義
惡意的代理服務(wù)器或路由器攔截用戶的請(qǐng)求醉冤,讀取或修改敏感數(shù)據(jù)赞赖。
場(chǎng)景
您在咖啡館發(fā)現(xiàn)了一個(gè)免費(fèi)的 WIFI,然后偷偷的接入了冤灾,您還暗自高興前域,當(dāng)您使用這個(gè)免費(fèi)的 WIFI 進(jìn)行網(wǎng)上沖浪的時(shí)候,您的各種信息都會(huì)被 WIFI 給攔截韵吨,如果是惡意的用戶匿垄,結(jié)果可想而知。
攻擊方式
綁架路由器归粉。
免費(fèi) WIFI 騙局椿疗。
為加密的傳輸協(xié)議。
未加密的傳輸數(shù)據(jù)糠悼。
保護(hù)措施
加強(qiáng)客戶端路由的安全管理届榄。
慎重的選擇代理服務(wù)器。
使用安全的傳輸協(xié)議倔喂,如:SSL铝条。