1、攻擊是什么意思?
拿到本不該被拿到的隱私的信息。
比如,用戶(hù)的登錄狀態(tài);竊取 Cookie 信息;監(jiān)聽(tīng)用戶(hù)行為;修改 DOM;
其他攻擊類(lèi)型還有:
(1)網(wǎng)絡(luò)釣魚(yú),包括盜取各類(lèi)用戶(hù)賬號(hào);
(2)竊取用戶(hù)cookies資料,從而獲取用戶(hù)隱私信息,或利用用戶(hù)身份進(jìn)一步對(duì)網(wǎng)站執(zhí)行操作;
(3)劫持用戶(hù)(瀏覽器)會(huì)話,從而執(zhí)行任意操作,例如進(jìn)行非法轉(zhuǎn)賬、強(qiáng)制發(fā)表日志、發(fā)送電子郵件等;
(4)強(qiáng)制彈出廣告頁(yè)面、刷流量等;
(5)網(wǎng)頁(yè)掛馬,進(jìn)行惡意操作,例如任意篡改頁(yè)面信息、刪除文章等;
(6)進(jìn)行大量的客戶(hù)端攻擊,如DDoS攻擊;
(7)獲取客戶(hù)端信息,例如用戶(hù)的瀏覽歷史、真實(shí)IP、開(kāi)放端口等;
(8)控制受害者機(jī)器向其他網(wǎng)站發(fā)起攻擊;
(9)結(jié)合其他漏洞,如CSRF漏洞,實(shí)施進(jìn)一步作惡;
(10)提升用戶(hù)權(quán)限,包括進(jìn)一步滲透網(wǎng)站;
(11) 傳播跨站腳本蠕蟲(chóng)等;
2、XSS攻擊的定義?
1)定義:(Croess SiteScripting)XSS意思是跨站腳本攻擊(腳本代碼注入)。
2)大致分為三種類(lèi)型 :Persistent型(持久型),Non-persistent(反射型)及Dom-based型(區(qū)別是是否通過(guò) HTTP 請(qǐng)求數(shù)據(jù))。
反射型是最常用,也是使用得最廣的一種攻擊方式。它通過(guò)給別人發(fā)送帶有惡意腳本代碼參數(shù)的URL,當(dāng)URL地址被打開(kāi)時(shí),特有的惡意代碼參數(shù)被HTML解析、執(zhí)行。它的特點(diǎn)是非持久化,必須用戶(hù)點(diǎn)擊帶有特定參數(shù)的鏈接才能引起。


3、什么是CGI?
公共網(wǎng)關(guān)接口(Common Gateway Interface,CGI)是Web 服務(wù)器運(yùn)行時(shí)外部程序的規(guī)范,按CGI 編寫(xiě)的程序可以擴(kuò)展服務(wù)器功能。CGI 應(yīng)用程序能與瀏覽器進(jìn)行交互,還可通過(guò)數(shù)據(jù)API與數(shù)據(jù)庫(kù)服務(wù)器等外部數(shù)據(jù)源進(jìn)行通信,從數(shù)據(jù)庫(kù)服務(wù)器中獲取數(shù)據(jù)。格式化為HTML文檔后,發(fā)送給瀏覽器,也可以將從瀏覽器獲得的數(shù)據(jù)放到數(shù)據(jù)庫(kù)中。幾乎所有服務(wù)器都支持CGI,可用任何語(yǔ)言編寫(xiě)CGI,包括流行的C、C ++、Java、VB 和Delphi 等。
CGI分為標(biāo)準(zhǔn)CGI和間接CGI兩種。標(biāo)準(zhǔn)CGI使用命令行參數(shù)或環(huán)境變量表示服務(wù)器的詳細(xì)請(qǐng)求,服務(wù)器與瀏覽器通信采用標(biāo)準(zhǔn)輸入輸出方式。間接CGI又稱(chēng)緩沖CGI,在CGI程序和CGI接口之間插入一個(gè)緩沖程序,緩沖程序與CGI接口間用標(biāo)準(zhǔn)輸入輸出進(jìn)行通信

4、XSS測(cè)試方法
1、工具掃描:APPscan、AWVS
2、手工測(cè)試:Burpsuite、firefox(hackbar)、XSSER XSSF
使用手工檢測(cè)Web應(yīng)用程序是否存在XSS漏洞時(shí),最重要的是考慮那里有輸入,輸入的數(shù)據(jù)在什么地方輸出。在進(jìn)行手工檢測(cè)XSS時(shí),人畢竟不像軟件那樣不知疲憊,所以一定要選擇有特殊意義的字符,這樣可以快速測(cè)試是否存在XSS。
(1)在目標(biāo)站點(diǎn)上找到輸入點(diǎn),比如查詢(xún)接口,留言板等;
(2)輸入一組"特殊字符+唯一識(shí)別字符",點(diǎn)擊提交后,查看返回的源碼,是否有做對(duì)應(yīng)的處理;
(3)通過(guò)搜索定位到唯一字符,結(jié)合唯一字符前后語(yǔ)法確認(rèn)是否可以構(gòu)造執(zhí)行js的條件(構(gòu)造閉合);提交構(gòu)造的腳本代碼,看是否可以成功執(zhí)行,如果成功執(zhí)行則說(shuō)明存在XSS漏洞;
5、如何防御?
XSS防御的總體思路是:對(duì)輸入(和URL參數(shù))進(jìn)行過(guò)濾,對(duì)輸出進(jìn)行編碼。
1、DOM 節(jié)點(diǎn)內(nèi)容進(jìn)行轉(zhuǎn)義
對(duì)于一些標(biāo)簽的 < 和 > 進(jìn)行轉(zhuǎn)移,是他們?cè)?HTML 中不會(huì)以一個(gè) script 標(biāo)簽形式執(zhí)行。
主要的思路就是將容易導(dǎo)致XSS攻擊的邊角字符替換成全角字符。< 和 > 是腳本執(zhí)行和各種html標(biāo)簽需要的,比如 ,& 和 # 以及 % 在對(duì)URL編碼試圖繞過(guò)XSS filter時(shí),會(huì)出現(xiàn)。我們說(shuō)對(duì)輸入的過(guò)濾分為白名單和黑名單。上面的XSS filter就是一種黑名單的過(guò)濾,黑名單就是列出不能出現(xiàn)的對(duì)象的清單,一旦出現(xiàn)就進(jìn)行處理。還有一種白名單的過(guò)濾,白名單就是列出可被接受的內(nèi)容,比如規(guī)定所有的輸入只能是“大小寫(xiě)的26個(gè)英文字母和10個(gè)數(shù)字,還有-和_”,所有其他的輸入都是非法的,會(huì)被拋棄掉。很顯然如此嚴(yán)格的白名單是可以100%攔截所有的XSS攻擊的。但是現(xiàn)實(shí)情況一般是不能進(jìn)行如此嚴(yán)格的白名單過(guò)濾的。
對(duì)于輸入,處理使用XSS filter之外,對(duì)于每一個(gè)輸入,在客戶(hù)端和服務(wù)器端還要進(jìn)行各種驗(yàn)證,驗(yàn)證是否合法字符,長(zhǎng)度是否合法,格式是否正確。在客戶(hù)端和服務(wù)端都要進(jìn)行驗(yàn)證,因?yàn)榭蛻?hù)端的驗(yàn)證很容易被繞過(guò)。其實(shí)這種驗(yàn)證也分為了黑名單和白名單。黑名單的驗(yàn)證就是不能出現(xiàn)某些字符,白名單的驗(yàn)證就是只能出現(xiàn)某些字符。盡量使用白名單。
2、DOM 節(jié)點(diǎn)的處理
對(duì)于 DOM 節(jié)點(diǎn)影響比較大的就是單引號(hào)和雙引號(hào), 因?yàn)樗麄儠?huì)關(guān)閉屬性的值。所以也是對(duì)單引號(hào)和雙引號(hào)進(jìn)行字符轉(zhuǎn)義。
3、JavaScript 代碼的處理
對(duì)于避免造成 javascript 注入的情況,一般會(huì)對(duì)從 url 上取到的數(shù)據(jù)進(jìn)行 encode ,這樣就可以避免雙引號(hào)提前封閉。
只是這里也要注意一下 ,這里一般會(huì)使用 encode 的方式格式化參數(shù)會(huì)更好一些,不然也要考慮類(lèi)似 \" 這樣的雙引號(hào)轉(zhuǎn)義符,是不是會(huì)和 下一個(gè) " 又相互抵消。 當(dāng)然,解決的方法還是給 \ 做轉(zhuǎn)義。
4、富文本配置白名單
在富文本中,可以其實(shí)可以使用配置黑白名單的方法,配置禁止某些標(biāo)簽出現(xiàn)或者是只允許某些標(biāo)簽出現(xiàn)。
但更多時(shí)候建議使用的還是白名單,因?yàn)榕渲煤诿麊螌?shí)在是太麻煩了而且一旦漏了,問(wèn)題也就大了。網(wǎng)上已經(jīng)有一些庫(kù)可以使用,但是這些庫(kù)是別人寫(xiě)的,可能有些地方不是自己想要的。所以,如果想完全定制那么就是使用白名單配置,如果只是一個(gè)小需求,快速開(kāi)發(fā)影響也不大,那就可以考慮引用個(gè)庫(kù)。
5、CSP(據(jù)說(shuō)最有效防御手段,需驗(yàn)證)
前面說(shuō)的一些防御方法是有效果,但是始終還是遠(yuǎn)遠(yuǎn)不夠。所以,現(xiàn)在防御XSS 有一個(gè)更好的方法就是使用 CSP 規(guī)則。
CSP 概念
CSP 即 content security policy 內(nèi)容安全策略,是一個(gè) HTTP header ,用于指定哪些內(nèi)容可以執(zhí)行。
CSP 規(guī)則
child-src connect-src default-src...
child-src:指定一些子頁(yè)面元素,比如 ifame 。
connect-src :指定網(wǎng)絡(luò)請(qǐng)求比如 ajax 的請(qǐng)求。
default-src:默認(rèn)規(guī)則,當(dāng)其他規(guī)則沒(méi)有配置時(shí),會(huì)直接讀取這里。
font-src ifame-src img-src
font-src:指定字體源。
ifame-src:指定 ifame 的訪問(wèn)域。
img-src:指定 圖片資源的訪問(wèn)域。
script-src style-src
script-src :指定腳本訪問(wèn)域
style-src:指定樣式文件訪問(wèn)域
配置方法
http.set(`content-security-policy`,`default-src 'self'`);
上面這個(gè)意思就是允許當(dāng)前域下的任意請(qǐng)求。 至于詳細(xì)配置,可以參考 ,https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP?這個(gè)說(shuō)明。
6、對(duì)輸出進(jìn)行編碼
1>?作為body文本輸出,作為html標(biāo)簽的屬性輸出:
比如:
<span>${username}</span>, <p><c:out value="${username}"></c:out></p>
<input type="text" value="${username}" />
此時(shí)的轉(zhuǎn)義規(guī)則如下:
< 轉(zhuǎn)成 <
> 轉(zhuǎn)成 >
& 轉(zhuǎn)成 &
" 轉(zhuǎn)成 "
' 轉(zhuǎn)成 '
2>?javascript事件
<input type="button" onclick='go_to_url("${myUrl}");' />
除了上面的那些轉(zhuǎn)義之外,還要附加上下面的轉(zhuǎn)義:
\ 轉(zhuǎn)成 \\
/ 轉(zhuǎn)成 \/
; 轉(zhuǎn)成 ;(全角;)
3>?URL屬性
如果 <script>, <style>, <imt> 等標(biāo)簽的 src 和 href 屬性值為動(dòng)態(tài)內(nèi)容,那么要確保這些url沒(méi)有執(zhí)行惡意連接。
確保:href 和 src 的值必須以 http://開(kāi)頭,白名單方式;不能有10進(jìn)制和16進(jìn)制編碼字符。
7、HttpOnly 與 XSS防御
XSS 一般利用js腳步讀取用戶(hù)瀏覽器中的Cookie,而如果在服務(wù)器端對(duì) Cookie 設(shè)置了HttpOnly 屬性,那么js腳本就不能讀取到cookie,但是瀏覽器還是能夠正常使用cookie。
一般的Cookie都是從document對(duì)象中獲得的,現(xiàn)在瀏覽器在設(shè)置 Cookie的時(shí)候一般都接受一個(gè)叫做HttpOnly的參數(shù),跟domain等其他參數(shù)一樣,一旦這個(gè)HttpOnly被設(shè)置,你在瀏覽器的 document對(duì)象中就看不到Cookie了,而瀏覽器在瀏覽的時(shí)候不受任何影響,因?yàn)镃ookie會(huì)被放在瀏覽器頭中發(fā)送出去(包括ajax的時(shí) 候),應(yīng)用程序也一般不會(huì)在js里操作這些敏感Cookie的,對(duì)于一些敏感的Cookie我們采用HttpOnly,對(duì)于一些需要在應(yīng)用程序中用js操作的cookie我們就不予設(shè)置,這樣就保障了Cookie信息的安全也保證了應(yīng)用。
如果你正在使用的是兼容 Java EE 6.0 的容器,如 Tomcat 7,那么 Cookie?類(lèi)已經(jīng)有了 setHttpOnly 的方法來(lái)使用 HttpOnly 的 Cookie?屬性了。
1cookie.setHttpOnly(true);
設(shè)置完后生成的 Cookie 就會(huì)在最后多了一個(gè) ;HttpOnly
另外使用?Session 的話 jsessionid?這個(gè) Cookie 可通過(guò)在?Context?中使用?useHttpOnly 配置來(lái)啟用 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>
對(duì)于 不支持 HttpOnly 的低版本java ee,可以手動(dòng)設(shè)置(比如在一個(gè)過(guò)濾器中):
String sessionid = request.getSession().getId();?
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");
8、其他注意點(diǎn)
csp 規(guī)則一般會(huì)在服務(wù)器配置,當(dāng)然前端頁(yè)面也是可以配置,但是更多的是以服務(wù)器為準(zhǔn),在日常開(kāi)發(fā)中也經(jīng)常會(huì)遇到引用了第三方的東西,這個(gè)時(shí)候 csp 規(guī)則不通過(guò),都需要向服務(wù)器端的同學(xué)要求加個(gè)規(guī)則。
參考鏈接
1、反射型xssDemo?
https://blog.csdn.net/huli870715/article/details/8615473
2、CGI(通用網(wǎng)關(guān)接口)
https://baike.baidu.com/item/CGI/607810?fr=aladdin&fromid=6717913&fromtitle=%EF%BC%A3%EF%BC%A7%EF%BC%A9