Day 141/200 關于XSS(含反射性)防護的整理(仍需迭代)

1、攻擊是什么意思?

拿到本不該被拿到的隱私的信息。

比如,用戶的登錄狀態;竊取 Cookie 信息;監聽用戶行為;修改 DOM;

其他攻擊類型還有:

(1)網絡釣魚,包括盜取各類用戶賬號;

(2)竊取用戶cookies資料,從而獲取用戶隱私信息,或利用用戶身份進一步對網站執行操作;

(3)劫持用戶(瀏覽器)會話,從而執行任意操作,例如進行非法轉賬、強制發表日志、發送電子郵件等;

(4)強制彈出廣告頁面、刷流量等;

(5)網頁掛馬,進行惡意操作,例如任意篡改頁面信息、刪除文章等;

(6)進行大量的客戶端攻擊,如DDoS攻擊;

(7)獲取客戶端信息,例如用戶的瀏覽歷史、真實IP、開放端口等;

(8)控制受害者機器向其他網站發起攻擊;

(9)結合其他漏洞,如CSRF漏洞,實施進一步作惡;

(10)提升用戶權限,包括進一步滲透網站;

(11) 傳播跨站腳本蠕蟲等;


2、XSS攻擊的定義?

1)定義:(Croess SiteScripting)XSS意思是跨站腳本攻擊(腳本代碼注入)。

2)大致分為三種類型 :Persistent型(持久型),Non-persistent(反射型)及Dom-based型(區別是是否通過 HTTP 請求數據)。

反射型是最常用,也是使用得最廣的一種攻擊方式。它通過給別人發送帶有惡意腳本代碼參數的URL,當URL地址被打開時,特有的惡意代碼參數被HTML解析、執行。它的特點是非持久化,必須用戶點擊帶有特定參數的鏈接才能引起。


示例


實際邏輯


3、什么是CGI?

公共網關接口(Common Gateway Interface,CGI)是Web 服務器運行時外部程序的規范,按CGI 編寫的程序可以擴展服務器功能。CGI 應用程序能與瀏覽器進行交互,還可通過數據API與數據庫服務器等外部數據源進行通信,從數據庫服務器中獲取數據。格式化為HTML文檔后,發送給瀏覽器,也可以將從瀏覽器獲得的數據放到數據庫中。幾乎所有服務器都支持CGI,可用任何語言編寫CGI,包括流行的C、C ++、Java、VB 和Delphi 等。

CGI分為標準CGI和間接CGI兩種。標準CGI使用命令行參數或環境變量表示服務器的詳細請求,服務器與瀏覽器通信采用標準輸入輸出方式。間接CGI又稱緩沖CGI,在CGI程序和CGI接口之間插入一個緩沖程序,緩沖程序與CGI接口間用標準輸入輸出進行通信



4、XSS測試方法

1、工具掃描:APPscan、AWVS

2、手工測試:Burpsuite、firefox(hackbar)、XSSER XSSF

使用手工檢測Web應用程序是否存在XSS漏洞時,最重要的是考慮那里有輸入,輸入的數據在什么地方輸出。在進行手工檢測XSS時,人畢竟不像軟件那樣不知疲憊,所以一定要選擇有特殊意義的字符,這樣可以快速測試是否存在XSS。

(1)在目標站點上找到輸入點,比如查詢接口,留言板等;

(2)輸入一組"特殊字符+唯一識別字符",點擊提交后,查看返回的源碼,是否有做對應的處理;

(3)通過搜索定位到唯一字符,結合唯一字符前后語法確認是否可以構造執行js的條件(構造閉合);提交構造的腳本代碼,看是否可以成功執行,如果成功執行則說明存在XSS漏洞;


5、如何防御?

XSS防御的總體思路是:對輸入(和URL參數)進行過濾,對輸出進行編碼

1、DOM 節點內容進行轉義

對于一些標簽的 < 和 > 進行轉移,是他們在 HTML 中不會以一個 script 標簽形式執行。

主要的思路就是將容易導致XSS攻擊的邊角字符替換成全角字符。< 和 > 是腳本執行和各種html標簽需要的,比如 ,& 和 # 以及 % 在對URL編碼試圖繞過XSS filter時,會出現。我們說對輸入的過濾分為白名單和黑名單。上面的XSS filter就是一種黑名單的過濾,黑名單就是列出不能出現的對象的清單,一旦出現就進行處理。還有一種白名單的過濾,白名單就是列出可被接受的內容,比如規定所有的輸入只能是“大小寫的26個英文字母和10個數字,還有-和_”,所有其他的輸入都是非法的,會被拋棄掉。很顯然如此嚴格的白名單是可以100%攔截所有的XSS攻擊的。但是現實情況一般是不能進行如此嚴格的白名單過濾的。

對于輸入,處理使用XSS filter之外,對于每一個輸入,在客戶端和服務器端還要進行各種驗證,驗證是否合法字符,長度是否合法,格式是否正確。在客戶端和服務端都要進行驗證,因為客戶端的驗證很容易被繞過。其實這種驗證也分為了黑名單和白名單。黑名單的驗證就是不能出現某些字符,白名單的驗證就是只能出現某些字符。盡量使用白名單。

2、DOM 節點的處理

對于 DOM 節點影響比較大的就是單引號和雙引號, 因為他們會關閉屬性的值。所以也是對單引號和雙引號進行字符轉義。

3、JavaScript 代碼的處理

對于避免造成 javascript 注入的情況,一般會對從 url 上取到的數據進行 encode ,這樣就可以避免雙引號提前封閉。

只是這里也要注意一下 ,這里一般會使用 encode 的方式格式化參數會更好一些,不然也要考慮類似 \" 這樣的雙引號轉義符,是不是會和 下一個 " 又相互抵消。 當然,解決的方法還是給 \ 做轉義。

4、富文本配置白名單

在富文本中,可以其實可以使用配置黑白名單的方法,配置禁止某些標簽出現或者是只允許某些標簽出現。

但更多時候建議使用的還是白名單,因為配置黑名單實在是太麻煩了而且一旦漏了,問題也就大了。網上已經有一些庫可以使用,但是這些庫是別人寫的,可能有些地方不是自己想要的。所以,如果想完全定制那么就是使用白名單配置,如果只是一個小需求,快速開發影響也不大,那就可以考慮引用個庫。

5、CSP(據說最有效防御手段,需驗證)

前面說的一些防御方法是有效果,但是始終還是遠遠不夠。所以,現在防御XSS 有一個更好的方法就是使用 CSP 規則。

CSP 概念

CSP 即 content security policy 內容安全策略,是一個 HTTP header ,用于指定哪些內容可以執行。

CSP 規則

child-src connect-src default-src...

child-src:指定一些子頁面元素,比如 ifame 。

connect-src :指定網絡請求比如 ajax 的請求。

default-src:默認規則,當其他規則沒有配置時,會直接讀取這里。

font-src ifame-src img-src

font-src:指定字體源。

ifame-src:指定 ifame 的訪問域。

img-src:指定 圖片資源的訪問域。

script-src style-src

script-src :指定腳本訪問域

style-src:指定樣式文件訪問域

配置方法

http.set(`content-security-policy`,`default-src 'self'`);

上面這個意思就是允許當前域下的任意請求。 至于詳細配置,可以參考 ,https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP?這個說明。

6、對輸出進行編碼

1>?作為body文本輸出,作為html標簽的屬性輸出:

比如:

<span>${username}</span>, <p><c:out value="${username}"></c:out></p>

<input type="text" value="${username}" />

此時的轉義規則如下:

< 轉成 &lt;

> 轉成 &gt;

& 轉成 &amp;

" 轉成 &quot;

' 轉成 &#39

2>?javascript事件

<input type="button" onclick='go_to_url("${myUrl}");' />

除了上面的那些轉義之外,還要附加上下面的轉義:

\ 轉成 \\

/ 轉成 \/

; 轉成 ;(全角;)

3>?URL屬性

如果 <script>, <style>, <imt> 等標簽的 src 和 href 屬性值為動態內容,那么要確保這些url沒有執行惡意連接。

確保:href 和 src 的值必須以 http://開頭,白名單方式;不能有10進制和16進制編碼字符。

7、HttpOnly 與 XSS防御

XSS 一般利用js腳步讀取用戶瀏覽器中的Cookie,而如果在服務器端對 Cookie 設置了HttpOnly 屬性,那么js腳本就不能讀取到cookie,但是瀏覽器還是能夠正常使用cookie。

一般的Cookie都是從document對象中獲得的,現在瀏覽器在設置 Cookie的時候一般都接受一個叫做HttpOnly的參數,跟domain等其他參數一樣,一旦這個HttpOnly被設置,你在瀏覽器的 document對象中就看不到Cookie了,而瀏覽器在瀏覽的時候不受任何影響,因為Cookie會被放在瀏覽器頭中發送出去(包括ajax的時 候),應用程序也一般不會在js里操作這些敏感Cookie的,對于一些敏感的Cookie我們采用HttpOnly,對于一些需要在應用程序中用js操作的cookie我們就不予設置,這樣就保障了Cookie信息的安全也保證了應用。

如果你正在使用的是兼容 Java EE 6.0 的容器,如 Tomcat 7,那么 Cookie?類已經有了 setHttpOnly 的方法來使用 HttpOnly 的 Cookie?屬性了。

1cookie.setHttpOnly(true);

設置完后生成的 Cookie 就會在最后多了一個 ;HttpOnly

另外使用?Session 的話 jsessionid?這個 Cookie 可通過在?Context?中使用?useHttpOnly 配置來啟用 HttpOnly,例如:


<Context?path=""?docBase="D:/WORKDIR/oschina/webapp"? ?reloadable="false"?useHttpOnly="true"/>

也可以在?web.xml 配置如下:

<session-config>

?<cookie-config>

??<http-only>true</http-only>

?</cookie-config>

<session-config>

對于 不支持 HttpOnly 的低版本java ee,可以手動設置(比如在一個過濾器中):

String sessionid = request.getSession().getId();?

response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");


8、其他注意點

csp 規則一般會在服務器配置,當然前端頁面也是可以配置,但是更多的是以服務器為準,在日常開發中也經常會遇到引用了第三方的東西,這個時候 csp 規則不通過,都需要向服務器端的同學要求加個規則。



參考鏈接

1、反射型xssDemo?

https://blog.csdn.net/huli870715/article/details/8615473

2、CGI(通用網關接口)

https://baike.baidu.com/item/CGI/607810?fr=aladdin&fromid=6717913&fromtitle=%EF%BC%A3%EF%BC%A7%EF%BC%A9

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • XSS[xss] 簡介 XSS,全稱Cross-site scripting,跨站[1][#fn1]腳本攻擊; 不...
    說叁兩事閱讀 405評論 0 0
  • 寫在前面 文章內容參考自https://twosecurity.io/http://www.4hou.com/we...
    Ackerzy閱讀 5,569評論 0 9
  • HTML5 新特性、語義化 新特性 新的 DOCTYPE 聲明<!DOCTYPE html> 新增 vedio 和...
    翔子丶閱讀 198評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,593評論 28 53
  • 人工智能是什么?什么是人工智能?人工智能是未來發展的必然趨勢嗎?以后人工智能技術真的能達到電影里機器人的智能水平嗎...
    ZLLZ閱讀 3,858評論 0 5