Django——XSS攻擊及處理


一、XSS介紹

XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意制造的網頁程序。
這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。
攻擊成功后,攻擊者可能得到包括但不限於更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容

人們經常將跨站腳本攻擊(Cross Site Scripting)縮寫為CSS,但這會與層疊樣式表(Cascading Style Sheets,CSS)的縮寫混淆。因此,有人將跨站腳本攻擊縮寫為XSS

跨站腳本攻擊(XSS),是最普遍的Web應用安全漏洞。
這類漏洞能夠使得攻擊者嵌入惡意腳本代碼到正常用戶會訪問到的頁面中,當正常用戶訪問該頁面時,則可導致嵌入的惡意腳本代碼的執行,從而達到惡意攻擊用戶的目的。
 
         
攻擊者可以使用戶在瀏覽器中執行其預定義的惡意腳本,其導致的危害可想而知,
如劫持用戶會話,插入惡意內容、重定向用戶、使用惡意軟件劫持用戶瀏覽器、繁殖 XSS蠕蟲,甚至破壞網站、修改路由器配置信息等。
 
         
XSS漏洞可以追溯到上世紀90年代。
大量的網站曾遭受XSS漏洞攻擊或被發現此類漏洞,如Twitter、Facebook、MySpace、Orkut、新浪微博和百度貼吧。
研究表明,最近幾年XSS已經超過緩沖區溢出成為最流行的攻擊方式,有68%的網站可能遭受此類攻擊。
根據開放網頁應用安全計划(Open Web Application Security Project)公布的2010年統計數據,在Web安全威脅前10位中,XSS排名第2,僅次於代碼注入(Injection)
 

 

 

 

 二、原理

HTML是一種超文本標記語言,通過將一些字符特殊地對待來區別文本和標記,例如,小於符號(<)被看作是HTML標簽的開始,<title>與</title>之間的字符是頁面的標題等等。
當動態頁面中插入的內容含有這些特殊字符(如<)時,用戶瀏覽器會將其誤認為是插入了HTML標簽,當這些HTML標簽引入了一段JavaScript腳本時,這些腳本程序就將會在用戶瀏覽器中執行。
所以,當這些特殊字符不能被動態頁面檢查或檢查出現失誤時,就將會產生XSS漏洞。

三、特點

與釣魚攻擊相比,XSS攻擊所帶來的危害更大,通常具有如下特點:
①由於XSS攻擊在用戶當前使用的應用程序中執行,用戶將會看到與其有關的個性化信息,如賬戶信息或“歡迎回來”消息,克隆的Web站點不會顯示個性化信息。
②通常,在釣魚攻擊中使用的克隆Web站點一經發現,就會立即被關閉。
③許多瀏覽器與安全防護軟件產品都內置釣魚攻擊過濾器,可阻止用戶訪問惡意的克隆站點。
④如果客戶訪問一個克隆的Web網銀站點,銀行一般不承擔責任。但是,如果攻擊者通過銀行應用程序中的XSS漏洞攻擊了銀行客戶,則銀行將不能簡單地推卸責任。

四、類型

從攻擊代碼的工作方式可以分為三個類型:
(1)持久型跨站:最直接的危害類型,跨站代碼存儲在服務器(數據庫)。
(2)非持久型跨站:反射型跨站腳本漏洞,最普遍的類型。用戶訪問服務器-跨站鏈接-返回跨站代碼。
(3)DOM跨站(DOM XSS):DOM(document object model文檔對象模型),客戶端腳本處理邏輯導致的安全問題。
基於DOM的XSS漏洞是指受害者端的網頁腳本在修改本地頁面DOM環境時未進行合理的處置,而使得攻擊腳本被執行。
在整個攻擊過程中,服務器響應的頁面並沒有發生變化,引起客戶端腳本執行結果差異的原因是對本地DOM的惡意篡改利用。

五、攻擊方式

常用的XSS攻擊手段和目的有:
1、盜用cookie,獲取敏感信息。
2、利用植入Flash,通過crossdomain權限設置進一步獲取更高權限;或者利用Java等得到類似的操作。
3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作。
4、利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
5、在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDoS攻擊的效果。

六、防御方法

(1)基於特征的防御。
  XSS漏洞和著名的SQL注入漏洞一樣,都是利用了Web頁面的編寫不完善,所以每一個漏洞所利用和針對的弱點都不盡相同。
  這就給XSS漏洞防御帶來了困難,不可能以單一特征來概括所有XSS攻擊。   傳統的XSS防御在進行攻擊鑒別時多采用特征匹配方式,主要是針對“javascript”這個關鍵字進行檢索,
  但是這種鑒別不夠靈活,凡是提交的信息中各有“javascript”時,就被硬性的被判定為XSS攻擊。 (
2)基於代碼修改的防御。
  Web頁面開發者在編寫程序時往往會出現一些失誤和漏洞,XSS攻擊正是利用了失誤和漏洞,
  因此一種比較理想的方法就是通過優化Web應用開發來減少漏洞,避免被攻擊:
  1)用戶向服務器上提交的信息要對URL和附帶的的HTTP頭、POST數據等進行查詢,對不是規定格式、長度的內容進行過濾。
  2)實現Session標記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。
  3)確認接收的的內容被妥善的規范化,僅包含最小的、安全的Tag(沒有javascript),去掉任何對遠程內容的引用(尤其是樣式表和javascript),使用HTTP only的cookie。   當然,如上操作將會降低Web業務系統的可用性,用戶僅能輸入少量的制定字符,人與系統間的交互被降到極致,僅適用於信息發布型站點。
  並且考慮到很少有Web編碼人員受過正規的安全培訓,很難做到完全避免頁面中的XSS漏洞。 (
3)客戶端分層防御策略。
  客戶端跨站腳本攻擊的分層防御策略是基於獨立分配線程和分層防御策略的安全模型。
  它建立在客戶端(瀏覽器),這是它與其他模型最大的區別,之所以客戶端安全性如此重要,客戶端在接受服務器信息,選擇性的執行相關內容。
  這樣就可以使防御XSS攻擊變得容易,該模型主要由三大部分組成:1)對每一個網頁分配獨立線程且分析資源消耗的“網頁線程分析模塊”;
  2)包含分層防御策略四個規則的用戶輸入分析模塊;3)保存互聯網上有關XSS惡意網站信息的XSS信息數據庫。 [3]   XSS攻擊主要是由程序漏洞造成的,要完全防止XSS安全漏洞主要依靠程序員較高的編程能力和安全意識,當然安全的軟件開發流程及其他一些編程安全原則也可以大大減少XSS安全漏洞的發生。

這些防范XSS漏洞原則包括: (
1)不信任用戶提交的任何內容,對所有用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、REFER、POST數據等,
僅接受指定長度范圍內、采用適當格式、采用所預期的字符的內容提交,對其他的一律過濾。
盡量采用POST而非GET提交表單;對“<”,“>”,“;”,“””等字符做過濾;任何內容輸出到頁面之前都必須加以en-code,避免不小心把htmltag顯示出來。 (2)實現Session 標記(session tokens)、CAPTCHA(驗證碼)系統或者HTTP引用頭檢查,以防功能被第三方網站所執行,
對於用戶提交信息的中的img等link,檢查是否有重定向回本站、不是真的圖片等可疑操作。 (
3)cookie 防盜。避免直接在cookie中泄露用戶隱私,例如email、密碼,等等;通過使cookie和系統IP綁定來降低cookie泄露后的危險。
這樣攻擊者得到的cookie沒有實際價值,很難拿來直接進行重放攻擊。 (
4)確認接收的內容被妥善地規范化,僅包含最小的、安全的Tag(沒有JavaScript),去掉任何對遠程內容的引用(尤其是樣式表和JavaScript),使用HTTPonly的cookie。

七、django中處理XSS攻擊的方式

ps:底層原理:特殊字符替換,加上 safe mark_safe 就不會替換了

Django中XSS攻擊就是跨站腳本攻擊,就是利用HTML對頁面進行惡意的標簽渲染,從而達到攻擊網站的效果,更嚴重的情況是直接獲取用戶信息,對網站造成巨大損失。
只不過Django自動幫我們做了這個防護功能,我們可以不必刻意做這些保護,但是對於開發者而言,在調用或者解除這些限制的時候要注意,不要留下漏洞。
解除限制很簡單,有兩種方式。

str='<a href="/page?page=1">1</a>'

(1)在前端模板語言中實現,只須用到幫助函數safe.如:

  {{ str|safe }}

(2)在后端views中實現:

  from django.utils.safestring import mark_safe

  str = mark_safe(str)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM