XSS攻擊即跨站點腳本攻擊(Cross Site Script),指黑客經過篡改網頁,注入惡意HTML腳本,在用戶瀏覽網頁時,控制用戶瀏覽器進行惡意操做的一種攻擊方式。數據庫
常見的XSS攻擊類型有兩種,一種是反射型,攻擊者誘使用戶點擊一個嵌入惡意腳本的連接,達到攻擊的目的,以下圖所示。編程
攻擊者發佈的微博中含有惡意腳本URL(在實際應用中,該腳本在攻擊者本身的服務器上,URL中包含腳本的連接),用戶點擊該URL,腳本會自動關注攻擊者的新浪微博ID,發佈含有惡意腳本URL的微博,攻擊就擴散了。瀏覽器
攻擊者能夠採用XSS攻擊,偷取用戶Cookie、密碼等數據,進而僞造交易、盜竊用戶財產、竊取情報。安全
另外一種XSS攻擊是持久型XSS攻擊,黑客提交包含有惡意腳本的請求,保存在被攻擊的Web站點的數據庫中,用戶瀏覽網頁時,惡意腳本被包含在正常頁面中,達到攻擊的目的,以下圖所示。此種攻擊常用在論壇,博客等Web應用中。服務器
常見應對手段:數據結構
消毒架構
XSS攻擊者通常都是經過在請求中嵌入惡意腳本達到攻擊的目的,這些腳本是通常用戶輸入中不使用的,若是進行過濾和消毒處理,即對某些HTML危險字符轉義,如">"轉義爲">"、"<"轉義爲"<"等,就能夠防止大部分攻擊。爲了不對沒必要要的內容錯誤轉義,如"3<5"中的"<"須要進行文本匹配後再轉義,如"<img src="這樣的上下文中的"<"才轉義。事實上,消毒幾乎是全部網站最必備的XSS防攻擊手段。框架
HttpOnly編程語言
瀏覽器禁止頁面JavaScript訪問帶有HttpOnly屬性的Cookie。防止XSS攻擊者竊取Cookie。工具
對於存放敏感信息的Cookie,如用戶認證信息等,可經過對該Cookie添加HttpOnly屬性,避免被攻擊腳本竊取。
主要有兩種形式,SQL注入攻擊和OS注入攻擊。
SQL注入攻擊的原理以下圖所示。
攻擊者在HTTP請求中注入惡意SQL命令(drop table users;),服務器用請求參數構造數據庫SQL命令時,惡意SQL被一塊兒構造,並在數據庫中執行。
SQL注入攻擊須要攻擊者對數據庫結構有所瞭解才能進行,攻擊者獲取數據庫表結構信息的手段有以下幾種。
開源
若是使用開源軟件搭建的網站,網站數據結構是公開的,攻擊者就能夠直接獲取。
錯誤回顯
若是網站開啓錯誤回顯,即服務器內部500錯誤會顯示到瀏覽器上。攻擊者經過故意構造非法參數,使服務端異常信息輸出到瀏覽器端,爲攻擊者猜想數據庫表結構提供了便利。
盲注
網站關閉錯誤回顯,攻擊者根據頁面變化狀況判斷SQL語句的執行狀況,據此猜想數據庫表結構,此種方式攻擊難度較大。
防護SQL注入攻擊首先要避免被攻擊者猜想到表名等數據庫表結構信息,此外還能夠採用以下方式。
消毒
和防XSS攻擊同樣,請求參數消毒使一種比較簡單粗暴又有效的手段。經過正則匹配,過濾請求數據中可能注入的SQL,如"drop table"、"\b(?:update\b.*?\bset\delete\b\W*?\bfrom)\b"等。
參數綁定
使用預編譯手段,綁定參數是最好的防SQL注入方法。目前許多數據訪問層框架,如MyBatis、Hibernate等,都實現SQL預編譯和參數綁定,攻擊者的惡意SQL會被看成SQL的參數,而不是SQL命令被執行。
除了SQL注入,攻擊者還根據具體應用,注入OS命令、編程語言代碼等,利用程序漏洞,達到攻擊目的。
CSRF(Cross Site Request Forgery,跨站點請求僞造),攻擊者經過跨站點請求,以合法用戶的身份進行非法操做,如轉帳交易、發表評論等,以下圖所示。
CSRF的主要手法是利用跨站請求,在用戶不知情的狀況下,以用戶的身份僞造請求。其核心是利用了瀏覽器Cookie或服務器Session策略,盜取用戶身份。
相應地,CSRF地防護手段主要是識別請求者身份。主要有下面幾種方法。
表單Token
CSRF是一個僞造用戶請求地操做,因此須要構造用戶請求的全部參數才能夠。表單Token經過在請求參數中增長隨機數的辦法來阻止攻擊者得到全部請求參數:在頁面表單中增長一個隨機數做爲Token,每次響應頁面的Token都不相同,從正常頁面提交的請求會包含該Token值,而僞造的請求沒法得到該值,服務器檢查請求參數中Token的值是否存在而且正確以肯定請求提交者是否合法。
驗證碼
相對來講,驗證碼則更加簡單有效,即請求提交時,須要用戶輸入驗證碼,以免在用戶不知情的狀況下被攻擊者僞造請求。可是輸入驗證碼是一個糟糕的用戶體驗,因此請在必要時使用,如支付交易等關鍵頁面。
Referer check
HTTP請求頭的Referer域中記錄者請求來源,可經過檢查請求來源,驗證其是否合法。不少網站使用這個功能實現圖片防盜鏈(若是圖片訪問頁面來源不是來自本身網站的網頁就拒絕)。
Error Code
錯誤回顯,許多Web服務器默認是打開異常信息輸出的,即服務器端未處理的異常堆棧信息會直接輸出到客戶端瀏覽器,這種方式雖然對程序調試和錯誤報告有好處,但同時也給黑客形成可乘之機。
經過故意製造非法輸入,是系統運行時報錯,得到異常信息,從而尋找系統漏洞進行攻擊。
防護手段:
經過配置Web服務器參數,跳轉500頁面到專門的錯誤頁面便可,Web應用經常使用的MVC框架也有這個功能。
HTML註釋
程序發佈前須要進行代碼review或自動掃描,避免HTML註釋漏洞。
文件上傳
通常網站都會有文件上傳功能,設置頭像、分享視頻、上傳附件等。若是上傳的是可執行程序,並經過該程序得到服務器命令執行能力,那麼攻擊者幾乎能夠在服務器上隨心所欲,並以此爲跳板攻擊集羣環境的其餘機器。
最有效的防護手段是設置上傳文件白名單,只容許上傳可靠的文件類型。
此外還能夠修改文件名、使用專門的存儲等手段,保護服務器免受上傳文件攻擊。
路徑遍歷
攻擊者在請求的URL中使用相對路徑,遍歷系統未開放的目錄和文件。
防護方法主要是將JS、CSS等資源文件部署在獨立服務器、使用獨立域名,其餘文件不使用靜態URL訪問,動態參數不包含文件路徑信息。
ModSecurity是一款開源的Web應用防火牆,探測攻擊並保護Web應用程序,便可以嵌入Web應用服務器中,也能夠做爲獨立的應用程序啓動。ModSecurity最先只是Apache的一個模塊,如今已經有Java、.Net多個版本,並支持Nginx。
ModSecurity採用處理邏輯與攻擊規則集合分離的架構模式。
處理邏輯(執行引擎)負責請求和響應的攔截過濾,規則加載執行等功能。而攻擊規則集合則負責描述對具體攻擊的規則定義、模式識別、防護策略等功能(能夠經過文本方式進行描述)。
處理邏輯比較穩定,規則集合須要不斷針對漏洞進行升級,這是一種可擴展的架構設計,以下圖所示。
除了開源的ModSecurity,還有一些商業產品也能夠實現Web應用防火牆功能,如NEC的SiteShell。
網站安全漏洞掃描工具是根據內置規則,構造具備攻擊性的URL請求,模擬黑客攻擊行爲,用以發現網站安全漏洞的工具。許多大型網站的安全團隊都有本身開發的漏洞掃描工具,不按期地對網站的服務器進行掃描,查漏補缺。市場上也有不少商用的網站安全漏洞掃描平臺。