聊聊Web安全:如何抵御常見(jiàn)的網(wǎng)絡(luò)攻擊?
Web安全是一個(gè)大課題,在網(wǎng)絡(luò)安全事件中,針對(duì)Web的攻擊是最多的。
從一些html標(biāo)簽,到JS代碼安全問(wèn)題,然后到接口、數(shù)據(jù)庫(kù),以及流量攻擊、模擬請(qǐng)求、自動(dòng)化攻擊等等,很多很多。
本文簡(jiǎn)單的聊聊常見(jiàn)的網(wǎng)絡(luò)攻擊防御方式。
一、DDOS
DDOS最常見(jiàn),也是最難防御。目前還沒(méi)有人敢說(shuō)能徹底防御DDOS。
DDoS就是流量攻擊。
由于DDoS攻擊往往采取合法的數(shù)據(jù)請(qǐng)求技術(shù),再加上傀儡機(jī)器,造成DDoS攻擊成為最難防御的網(wǎng)絡(luò)攻擊之一。
如何基礎(chǔ)防御:
1. 對(duì)頻繁請(qǐng)求的ip和接口進(jìn)行限流,熔斷處理,超過(guò)多少次必須輸入圖形驗(yàn)證碼。
進(jìn)行驗(yàn)證處理可,減輕服務(wù)器數(shù)據(jù)庫(kù)處理壓力。
其實(shí)現(xiàn)在很多大公司都是把一下接口放在一個(gè)項(xiàng)目里面進(jìn)行rpc遠(yuǎn)程調(diào)用處理。通過(guò)分布式緩存,分布式一致性問(wèn)題,分布式事務(wù)來(lái)解決這些問(wèn)題。
2. 使用黑名單和白名單機(jī)制,防御攻擊(OAuth2.0協(xié)議)這個(gè)推薦使用。
這個(gè)黑名單白名單就是現(xiàn)在很多代理網(wǎng)站來(lái)給你處理網(wǎng)站的安全性,也算是給你防御網(wǎng)站吧。
3. 選擇高防數(shù)據(jù)中心:
國(guó)內(nèi)數(shù)據(jù)中心一般都會(huì)有防火墻防御,我們今天把防火墻情況分為兩種:
- 集群防御,單線機(jī)房防御一般在:10G-32G的集群防御,BGP多線機(jī)房一般為:10G以內(nèi)集群防火墻。
- 獨(dú)立防御,獨(dú)立防御都是出現(xiàn)在單線機(jī)房,或者是多線多ip機(jī)房,機(jī)房防御能力一般為:10G-200G不等,這種機(jī)房是實(shí)現(xiàn)的單機(jī)防御能力,隨著數(shù)據(jù)中心的防御能力提高還有就是競(jìng)爭(zhēng)壓力比較大,高防的價(jià)格也在不斷的創(chuàng)造新低。
4. CDN內(nèi)容分發(fā):
通過(guò)CDN防御的方式:CDN技術(shù)的初衷是提高互聯(lián)網(wǎng)用戶對(duì)網(wǎng)站的訪問(wèn)速度,但是由于分布式多節(jié)點(diǎn)的特點(diǎn),又能夠?qū)Ψ植际骄芙^攻擊流量產(chǎn)生稀釋的效果。所以目前CDN防御的方式不但能夠起到防御的作用,而且用戶的訪問(wèn)請(qǐng)求是到最近的緩存節(jié)點(diǎn),所以也對(duì)加速起到了很好的作用。
CDN防御的最重要的原理:通過(guò)智能DNS的方式將來(lái)自不同位置的流量分配到對(duì)應(yīng)的位置上的節(jié)點(diǎn)上,這樣就讓區(qū)域內(nèi)的節(jié)點(diǎn)成為流量的接收中心,從而將流量稀釋的效果,在流量被稀釋到各個(gè)節(jié)點(diǎn)后,就可以在每個(gè)節(jié)點(diǎn)進(jìn)行流量清洗。從而起到防御作用。
目前針對(duì)DDOS流量攻擊的防護(hù)方法中CDN防御也分為自建CDN防御,這種情況防御能力較好,但是成本較高,需要部署多節(jié)點(diǎn),租用各個(gè)節(jié)點(diǎn)服務(wù)器,如果應(yīng)用較少的話,造成資源浪費(fèi)。另外就是租用別人現(xiàn)成的CDN防御,可以極大的節(jié)省成本,并且防御能力很少非常好。
二、CSRF
攻擊?" src="http://p1.pstatp.com/large/pgc-image/fa44e1ad5feb47d38bd60f015948de25" width="531" height="466">
CSRF即:Cross Site Request Forgery(跨站域請(qǐng)求偽造)它在 2007 年曾被列為互聯(lián)網(wǎng) 20 大安全隱患之一,也被稱為“One Click Attack”或者Session Riding,通??s寫為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利用也就是人們所知道的釣魚(yú)網(wǎng)站。盡管聽(tīng)起來(lái)像跨站腳本(XSS),但它與XSS非常不同,并且攻擊方式幾乎相左。
XSS利用站點(diǎn)內(nèi)的信任用戶,而CSRF則通過(guò)偽裝來(lái)自受信任用戶的請(qǐng)求來(lái)利用受信任的網(wǎng)站。與XSS攻擊相比,CSRF攻擊往往不大流行,因此對(duì)其進(jìn)行防范的資源也相當(dāng)稀少,所以被認(rèn)為比XSS更具危險(xiǎn)性。
也就是通俗一點(diǎn)來(lái)說(shuō)就是,大量請(qǐng)求你的接口,通過(guò)抓包工具請(qǐng)求分析,偽造token訪問(wèn)你的接口,攻擊服務(wù)器降低服務(wù)器數(shù)據(jù)庫(kù)性能。
如何防御CSRF?
模擬請(qǐng)求這里還是要說(shuō)到分布式,畢竟真的要用到分布式,緩存集群。解決限流,服務(wù)容錯(cuò),熔斷的問(wèn)題。
1. 后端防御:
(1) MVCC方案
多版本并發(fā)控制,該策略主要使用 update with condition(更新帶條件來(lái)防止)來(lái)保證多次外部請(qǐng)求調(diào)用對(duì)系統(tǒng)的影響是一致的。在系統(tǒng)設(shè)計(jì)的過(guò)程中,合理的使用樂(lè)觀鎖,通過(guò) version 或者 updateTime(timestamp)等其他條件,來(lái)做樂(lè)觀鎖的判斷條件,這樣保證更新操作即使在并發(fā)的情況下,也不會(huì)有太大的問(wèn)題。
(2) 去重表
在插入數(shù)據(jù)的時(shí)候,插入去重表,利用數(shù)據(jù)庫(kù)的唯一索引特性,保證唯一的邏輯。
(3) 悲觀鎖
select for update,整個(gè)執(zhí)行過(guò)程中鎖定該訂單對(duì)應(yīng)的記錄。注意:這種在 DB 讀大于寫的情況下盡量少用。
(4oken機(jī)制,防止頁(yè)面重復(fù)提交
把token放在redis 里面通過(guò)限流方式,每個(gè)token只能使用一次,網(wǎng)絡(luò)延遲或者重試機(jī)制解決這個(gè)問(wèn)題。
(5) MQ消息中間件也可以解決這個(gè)問(wèn)題,可以通過(guò)發(fā)布訂閱的方式來(lái)消息通知處理。
(6) nginx服務(wù)器對(duì)域名網(wǎng)關(guān)攔截處理,只能通過(guò)域名訪問(wèn),不能獲取到你的ip,所以的前臺(tái)文件通過(guò)分離來(lái)實(shí)現(xiàn)。
(7) 分布式校驗(yàn)
在大型網(wǎng)站中,使用Session存儲(chǔ)CSRF Token會(huì)帶來(lái)很大的壓力。訪問(wèn)單臺(tái)服務(wù)器session是同一個(gè)。但是現(xiàn)在的大型網(wǎng)站中,我們的服務(wù)器通常不止一臺(tái),可能是幾十臺(tái)甚至幾百臺(tái)之多,甚至多個(gè)機(jī)房都可能在不同的省份,用戶發(fā)起的HTTP請(qǐng)求通常要經(jīng)過(guò)像Ngnix之類的負(fù)載均衡器之后,再路由到具體的服務(wù)器上,由于Session默認(rèn)存儲(chǔ)在單機(jī)服務(wù)器內(nèi)存中,因此在分布式環(huán)境下同一個(gè)用戶發(fā)送的多次HTTP請(qǐng)求可能會(huì)先后落到不同的服務(wù)器上,導(dǎo)致后面發(fā)起的HTTP請(qǐng)求無(wú)法拿到之前的HTTP請(qǐng)求存儲(chǔ)在服務(wù)器中的Session數(shù)據(jù),從而使得Session機(jī)制在分布式環(huán)境下失效,因此在分布式集群中CSRF Token需要存儲(chǔ)在Redis之類的公共存儲(chǔ)空間。
由于使用Session存儲(chǔ),讀取和驗(yàn)證CSRF Token會(huì)引起比較大的復(fù)雜度和性能問(wèn)題,目前很多網(wǎng)站采用Encrypted Token Pattern方式。這種方法的Token是一個(gè)計(jì)算出來(lái)的結(jié)果,而非隨機(jī)生成的字符串。這樣在校驗(yàn)時(shí)無(wú)需再去讀取存儲(chǔ)的Token,只用再次計(jì)算一次即可。
這種Token的值通常是使用UserID、時(shí)間戳和隨機(jī)數(shù),通過(guò)加密的方法生成。這樣既可以保證分布式服務(wù)的Token一致,又能保證Token不容易被破解。
在token解密成功之后,服務(wù)器可以訪問(wèn)解析值,Token中包含的UserID和時(shí)間戳將會(huì)被拿來(lái)被驗(yàn)證有效性,將UserID與當(dāng)前登錄的UserID進(jìn)行比較,并將時(shí)間戳與當(dāng)前時(shí)間進(jìn)行比較。
2. 前臺(tái)防御:
(1) CSRF監(jiān)控
對(duì)于一個(gè)比較復(fù)雜的網(wǎng)站系統(tǒng),某些項(xiàng)目、頁(yè)面、接口漏掉了CSRF防護(hù)措施是很可能的。
一旦發(fā)生了CSRF攻擊,我們?nèi)绾渭皶r(shí)的發(fā)現(xiàn)這些攻擊呢?(這里其實(shí)nginx也可以處理)
CSRF攻擊有著比較明顯的特征:
- 跨域請(qǐng)求。
- GET類型請(qǐng)求Header的MIME類型大概率為圖片,而實(shí)際返回Header的MIME類型為Text、JSON、HTML。
(2) 通過(guò)對(duì)稱非對(duì)稱算法,前臺(tái)網(wǎng)站訪問(wèn)先訪問(wèn)后臺(tái)獲取到應(yīng)簽,然后在把前臺(tái)請(qǐng)求的參數(shù)拿到后臺(tái)去檢驗(yàn)。一般網(wǎng)絡(luò)上面接口支付都是重定向啦。這樣一般都比較麻煩。但是這樣安全性能很高的,其實(shí)ssl證書(shū)比域名都貴滴。
(3) 用雙重Cookie防御CSRF的
優(yōu)點(diǎn):
- 無(wú)需使用Session,適用面更廣,易于實(shí)施。
- Token儲(chǔ)存于客戶端中,不會(huì)給服務(wù)器帶來(lái)壓力。
- 相對(duì)于Token,實(shí)施成本更低,可以在前后端統(tǒng)一攔截校驗(yàn),而不需要一個(gè)個(gè)接口和頁(yè)面添加。
缺點(diǎn):
- Cookie中增加了額外的字段。
- 如果有其他漏洞(例如XSS),攻擊者可以注入Cookie,那么該防御方式失效。
- 難以做到子域名的隔離。
- 為了確保Cookie傳輸安全,采用這種防御方式的最好確保用整站HTTPS的方式,如果還沒(méi)切HTTPS的使用這種方式也會(huì)有風(fēng)險(xiǎn)。
三、SQL注入
攻擊?" src="http://p1.pstatp.com/large/pgc-image/e5ee0de9b60e46d3a0cbe6bf2d5ca70c" width="640" height="308">
SQL注入:利用現(xiàn)有應(yīng)用程序,將惡意的SQL命令注入到后臺(tái)數(shù)據(jù)庫(kù)執(zhí)行一些惡意的操作。造成SQL注入的原因是因?yàn)槌绦驔](méi)有有效過(guò)濾用戶的輸入,使攻擊者成功的向服務(wù)器提交惡意的SQL查詢代碼,程序在接收后錯(cuò)誤的將攻擊者的輸入作為查詢語(yǔ)句的一部分執(zhí)行,導(dǎo)致原始的查詢邏輯被改變,額外的執(zhí)行了攻擊者精心構(gòu)造的惡意代碼。
SQL注入漏洞可能會(huì)影響使用SQL數(shù)據(jù)庫(kù)(如MySQL,Oracle,SQL Server或其他)的任何網(wǎng)站或Web應(yīng)用程序。犯罪分子可能會(huì)利用它來(lái)未經(jīng)授權(quán)訪問(wèn)用戶的敏感數(shù)據(jù):客戶信息,個(gè)人數(shù)據(jù),商業(yè)機(jī)密,知識(shí)產(chǎn)權(quán)等。SQL注入攻擊是最古老,最流行,最危險(xiǎn)的Web應(yīng)用程序漏洞之一。
1. SQL注入攻擊的類型
SQL注入攻擊可以通過(guò)多種方式執(zhí)行。在選擇特定攻擊方法之前,攻擊者可能會(huì)觀察系統(tǒng)的行為。
(1) 帶內(nèi)注入
這是典型的攻擊,攻擊者可以通過(guò)相同的通信通道發(fā)起攻擊并獲得結(jié)果。這是通過(guò)兩種帶內(nèi)技術(shù)完成的:
- 基于錯(cuò)誤的SQL注入:從顯示的錯(cuò)誤消息中獲取有關(guān)數(shù)據(jù)庫(kù)的信息
- 基于聯(lián)合的SQL注入:依賴于攻擊者能夠?qū)NION ALL被盜信息的結(jié)果與合法結(jié)果連接起來(lái)。
這兩種技術(shù)都依賴于攻擊者修改應(yīng)用程序發(fā)送的SQL,以及瀏覽器中顯示的錯(cuò)誤和返回的信息。如果應(yīng)用程序開(kāi)發(fā)人員或數(shù)據(jù)庫(kù)開(kāi)發(fā)人員無(wú)法正確地參數(shù)化他們?cè)诓樵冎惺褂玫闹?,那么它?huì)成功。兩者都是試錯(cuò)法,可以檢測(cè)到錯(cuò)誤。
(2) 盲注入
也稱為推理SQL注入,盲注入攻擊不會(huì)直接從目標(biāo)數(shù)據(jù)庫(kù)中顯示數(shù)據(jù);相反,攻擊者會(huì)仔細(xì)檢查行為中的間接線索。HTTP響應(yīng)中的詳細(xì)信息,某些用戶輸入的空白網(wǎng)頁(yè)以及數(shù)據(jù)庫(kù)響應(yīng)某些用戶輸入需要多長(zhǎng)時(shí)間,這些都可以是線索,具體取決于攻擊者的目標(biāo)。他們還可以指向攻擊者嘗試的另一個(gè)SQLi攻擊途徑。
(3) 帶外注入
這種攻擊有點(diǎn)復(fù)雜,當(dāng)攻擊者無(wú)法在單個(gè)直接查詢 - 響應(yīng)攻擊中實(shí)現(xiàn)其目標(biāo)時(shí),攻擊者可能會(huì)使用此攻擊。通常,攻擊者會(huì)制作SQL語(yǔ)句,這些語(yǔ)句在呈現(xiàn)給數(shù)據(jù)庫(kù)時(shí)會(huì)觸發(fā)數(shù)據(jù)庫(kù)系統(tǒng)創(chuàng)建與攻擊者控制的外部服務(wù)器的連接。以這種方式,攻擊者可以收集數(shù)據(jù)或可能控制數(shù)據(jù)庫(kù)的行為。
二階注入就是一種帶外注入攻擊。在這種情況下,攻擊者將提供SQL注入,該注入將由數(shù)據(jù)庫(kù)系統(tǒng)的單獨(dú)行為存儲(chǔ)和執(zhí)行。當(dāng)二級(jí)系統(tǒng)行為發(fā)生時(shí)(它可能類似于基于時(shí)間的作業(yè)或由其他典型管理員或用戶使用數(shù)據(jù)庫(kù)觸發(fā)的某些事情)并且執(zhí)行攻擊者的SQL注入,那就是當(dāng)“伸出”到系統(tǒng)時(shí)攻擊者控制發(fā)生了。
2. 如何防御SQL注入
(1) 規(guī)范sql 寫的方式不要寫拼接sql,、最好使用預(yù)編譯方式
在mybatis編寫sql語(yǔ)句的時(shí)候,最好使用?傳參數(shù)方式,不要使用#傳參數(shù),因?yàn)?傳參數(shù)方式,可能會(huì)受到sql語(yǔ)句攻擊。
- #{}: 解析為一個(gè) JDBC 預(yù)編譯語(yǔ)句(prepared statement)的參數(shù)標(biāo)記符,一個(gè) #{ } 被解析為一個(gè)參數(shù)占位符,可以防止SQL注入問(wèn)題。
- ${}: 僅僅為一個(gè)純碎的 string 替換,在動(dòng)態(tài) SQL 解析階段將會(huì)進(jìn)行變量替換。
(2) 限制數(shù)據(jù)庫(kù)權(quán)限和特權(quán)
將數(shù)據(jù)庫(kù)用戶的功能設(shè)置為最低要求;這將限制攻擊者在設(shè)法獲取訪問(wèn)權(quán)限時(shí)可以執(zhí)行的操作。
避免直接向用戶顯示數(shù)據(jù)庫(kù)錯(cuò)誤,攻擊者可以使用這些錯(cuò)誤消息來(lái)獲取有關(guān)數(shù)據(jù)庫(kù)的信息。
對(duì)訪問(wèn)數(shù)據(jù)庫(kù)的Web應(yīng)用程序使用Web應(yīng)用程序防火墻(WAF),其實(shí),不止是SQL注入,本文所講的這些攻擊,幾乎全都可以用WAF進(jìn)行防護(hù)。WAF有多種,比如硬件、軟件、云,有很貴的商業(yè)WAF硬件,也有免費(fèi)+商業(yè)的WAF軟件(比如:ShareWAF,很不錯(cuò)。)。
這為面向Web的應(yīng)用程序提供了保護(hù),它可以幫助識(shí)別SQL注入嘗試;根據(jù)設(shè)置,它還可以幫助防止SQL注入嘗試到達(dá)應(yīng)用程序(以及數(shù)據(jù)庫(kù))。
(3) 定期測(cè)試與數(shù)據(jù)庫(kù)交互的Web應(yīng)用程序
這樣做可以幫助捕獲可能允許SQL注入的新錯(cuò)誤或回歸。
將數(shù)據(jù)庫(kù)更新為最新的可用修補(bǔ)程序,這可以防止攻擊者利用舊版本中存在的已知弱點(diǎn)/錯(cuò)誤。
(4) 后臺(tái)日志分析sql 可以使用AOP攔截寫入sql性能
四、防盜
防盜鏈就是A網(wǎng)站有一張圖片,B網(wǎng)站要引用過(guò)來(lái)使用到自己網(wǎng)站,引用圖片和樣式,js等等。
如何防御?
- 寫一個(gè)過(guò)濾器判斷http請(qǐng)求頭Referer域中的記錄來(lái)源的值,如果和當(dāng)前訪問(wèn)的域名不一致的情況下,說(shuō)明該圖片可能被其他服務(wù)器盜用。
- 通過(guò)動(dòng)靜分離或者前后端分離。通過(guò)nginx配置。
- 可以通過(guò)shiro權(quán)限判斷鏈接重定向。
五、XSS
攻擊?" src="http://p1.pstatp.com/large/pgc-image/462a088e47794987900c15426e341921" width="640" height="285">
Xss就是javascript 腳本攻擊,就是在表單提交的時(shí)候提交一個(gè)小腳本,因?yàn)闉g覽器默認(rèn)是支持腳本的,所以寫個(gè)小腳本不做處理的話問(wèn)題就很大。不處理網(wǎng)頁(yè)直接掛掉。
如何防御?
- 通過(guò)后臺(tái)編寫一個(gè)過(guò)濾器攔截所有g(shù)etParameter參數(shù) 重寫httpservletwrapp方法。
- 通過(guò)工具類將參數(shù)特殊字符轉(zhuǎn)換成html源代碼保存。
- 通過(guò)js檢驗(yàn)
過(guò)濾用戶輸入的 檢查用戶輸入的內(nèi)容中是否有非法內(nèi)容。如<>(尖括號(hào))、”(引號(hào))、 ‘(單引號(hào))、%(百分比符號(hào))、;(分號(hào))、()(括號(hào))、&(& 符號(hào))、+(加號(hào))等。、嚴(yán)格控制輸出
六、文件上傳漏洞
1. 什么是文件上傳漏洞?
上傳漏洞這個(gè)顧名思義,就是攻擊者通過(guò)上傳木馬文件,直接得到WEBSHELL,危害等級(jí)超級(jí)高,現(xiàn)在的入侵中上傳漏洞也是常見(jiàn)的漏洞。 導(dǎo)致該漏洞的原因在于代碼作者沒(méi)有對(duì)訪客提交的數(shù)據(jù)進(jìn)行檢驗(yàn)或者過(guò)濾不嚴(yán),可以直接提交修改過(guò)的數(shù)據(jù)繞過(guò)擴(kuò)展名的檢驗(yàn)。
大家經(jīng)常在網(wǎng)上下載文件什么東西,比如一個(gè)軟件,默認(rèn)幾十M但是下下來(lái)為啥只有幾百Kb很多網(wǎng)站都是釣魚(yú)網(wǎng)站,你下載下來(lái)的文件是后綴為.exe文件,這是系統(tǒng)運(yùn)行文件,文件下載也有這個(gè)問(wèn)題,所以網(wǎng)上很多不靠譜滴,不要亂下載文件。
2. 如何解決防御?
- 對(duì)文件格式限制,只允許某些格式上傳
- 對(duì)文件格式進(jìn)行校驗(yàn),前端跟服務(wù)器都要進(jìn)行校驗(yàn)(前端校驗(yàn)擴(kuò)展名,服務(wù)器校驗(yàn)擴(kuò)展名、Content_Type等)
- 將上傳目錄防止到項(xiàng)目工程目錄之外,當(dāng)做靜態(tài)資源文件路徑,并且對(duì)文件的權(quán)限進(jìn)行設(shè)定,禁止文件下的執(zhí)行權(quán)限。
- 通過(guò)文件流解析判斷文件類型。
七、忘記密碼?
我在這里分析一個(gè)常見(jiàn)的qq漏洞,現(xiàn)在很多都還有人家盜用別人密碼,然后通過(guò)qq發(fā)送消息,找你借錢或者轉(zhuǎn)賬到某個(gè)地方,黑客就是通過(guò) 抓包分析暴力破解密碼(寫一個(gè)程序破解驗(yàn)證碼,如果是4位純數(shù)字可想而知),然后盜取你的短信驗(yàn)證碼登錄,如果發(fā)生了這樣的情況,如果是qq的話你就一直發(fā)短信驗(yàn)證碼,聯(lián)系客戶還得一段時(shí)間。因?yàn)榇蠹叶贾纐q驗(yàn)證碼都是4位所以別人很好破解,我這里說(shuō)的都是真實(shí)案例,因?yàn)槲乙郧耙脖粍e人這樣操作過(guò),但是我就一直頻繁發(fā)短信驗(yàn)證碼后面就找回來(lái)啦。
如何防御:
- 忘記密碼驗(yàn)證碼最好在6-8位 最好是加字符,字母組合。
- 一旦頻繁調(diào)用接口驗(yàn)證時(shí),應(yīng)該使用圖形驗(yàn)證碼攔截,防止機(jī)器模擬。
- 使用黑名單和白名單機(jī)制,防御攻擊(OAuth2.0協(xié)議)。