最近在研讀《白帽子講web安全》和《Web前端黑客技術(shù)揭秘》,為了加深印象,閑暇之時(shí)做了一些總結(jié)。

下面是書中出現(xiàn)的一些專有詞匯:

POC(Proof Of Concept):觀點(diǎn)驗(yàn)證程序,運(yùn)行這個(gè)程序就可以得出預(yù)期的結(jié)果,也就驗(yàn)證了觀點(diǎn)。

Payload:有效負(fù)載,在病毒代碼中實(shí)現(xiàn)這個(gè)功能的部分。

OWASP:開放式Web應(yīng)用程序安全項(xiàng)目組織,協(xié)助個(gè)人、企業(yè)和機(jī)構(gòu)來發(fā)現(xiàn)和使用可信賴軟件。

XSS(Cross Site Script):跨站腳本攻擊,想盡一切辦法將你的腳本內(nèi)容在目標(biāo)網(wǎng)站中的目標(biāo)用戶的瀏覽器中執(zhí)行。

如果要調(diào)試代碼,可以直接在codepen的頁面中進(jìn)行。

一、XSS的幾種類型

1)反射型XSS

XSS代碼出現(xiàn)在URL中,作為輸入提交到服務(wù)器,瀏覽器解析執(zhí)行。也就是誘使用戶點(diǎn)擊一個(gè)惡意鏈接,發(fā)起攻擊。

http://www.xss.com?x=<script>alert('xss')</script>

2)存儲(chǔ)型XSS

提交的XSS代碼會(huì)存儲(chǔ)在服務(wù)器中(數(shù)據(jù)庫、文件等媒介中),下次請(qǐng)求頁面不用再提交XSS代碼,典型的場景有博客文章、留言板等。

3)DOM Based XSS

與前面兩種不一樣的地方是不需要提交到服務(wù)器中,可直接在瀏覽器中執(zhí)行

//輸入http://www.xss.com#alert(1)//執(zhí)行錨點(diǎn)內(nèi)容 顯示提示框eval(location.hash.substr(1))

常見的輸入輸出點(diǎn)可利用下面這些:

//常見的輸入點(diǎn):document.URL
document.URLUnencoded
document.location(and many of its properties)
document.referrer
window.location(and many of its properties)//常見的輸出點(diǎn):document.write(…)
document.writeln(…)
document.body.innerHtml = …//直接修改DOM樹:document.forms[0].action = … (and various other collections)
document.attachEvent(…)
document.create…(…)
document.execCommand(…)
document.body.…(accessing the DOM through the body object)
window.attachEvent(…)//替換document URL:document.location = … (and assigning to location’ s href, host and hostname)
document.location.hostname = …
document.location.replace(…)
document.location.assign(…)
document.URL = …
window.navigate(…)//打開或修改新窗口:document.open(…)
window.open(…)
window.location.href = … (and assigning to location’ s href, host and hostname)//直接執(zhí)行腳本:eval(…)
window.execScript(…)
window.setInterval(…)
window.setTimeout(…)

 

二、XSS的危害

1)掛馬

所謂掛馬就是通過各種方法獲得網(wǎng)站管理員賬號(hào),然后登陸網(wǎng)站后臺(tái),網(wǎng)頁掛馬可通過嵌入iframe實(shí)現(xiàn)。

2)盜取用戶Cookie

通過“document.cookie”讀取Cookie信息,發(fā)起劫持,可直接通過加密的Cookie登錄憑證登錄進(jìn)用戶的賬戶。

3)DDoS(Distributed Denial of Service)分布式拒絕攻擊

在目標(biāo)瀏覽器中注入Ajax請(qǐng)求的代碼,Ajax請(qǐng)求的響應(yīng)有同源策略的限制,但請(qǐng)求不會(huì),所以可以同時(shí)發(fā)起請(qǐng)求攻擊。

4)釣魚攻擊

在網(wǎng)頁中,偽造真實(shí)的登錄框,欺騙用戶登錄時(shí),賬號(hào)密碼就會(huì)被盜取。

5)劫持用戶Web行為

網(wǎng)站的很多操作是通過HTTP的get或post請(qǐng)求完成的,攻擊者可通過代碼發(fā)起這兩種請(qǐng)求,例如構(gòu)造form、ajax等。

6)XSS Worm(蠕蟲)

當(dāng)被攻擊用戶查看存在XSS蠕蟲代碼的內(nèi)容時(shí),蠕蟲觸發(fā)并開始感染傳播。

用戶之間發(fā)生交互行為的頁面,存在存儲(chǔ)型XSS,比較容易發(fā)起XSS Worm攻擊。

 

三、XSS構(gòu)造技巧

1)利用字符編碼

這里要提一下HTML與JavaScript自解碼機(jī)制,能夠自動(dòng)執(zhí)行特定的方式。

1. HTML編碼,具體有如下幾種形式:

1. 進(jìn)制編碼:&#xH;(十六進(jìn)制格式)、&#D;(十進(jìn)制格式),最后的分號(hào)(;)可以不要。
2. HTML 實(shí)體編碼(HtmlEncode),例如“&nbsp;、&lt;”等。
<button onclick="document.write('&lt;img src=@ onerror=alert(123) /&gt;')">click</button>

2. JavaScript編碼,具體有如下幾種形式:

1. Unicode 形式:\uH (十六進(jìn)制)。
2. 普通十六進(jìn)制:\xH。
3. 純轉(zhuǎn)義: \' 、 \" 、 \< 、 > 這樣在特殊字符之前加 \ 進(jìn)行轉(zhuǎn)義。
//顯示彈出框document.write("\<img src\=@ onerror=alert\(123\) \/\>")

單純的輸入“<script>”等這些代碼可能就會(huì)被馬上過濾,但是如果再編碼一次上面的幾種形式,服務(wù)器過濾的時(shí)候可能就會(huì)漏掉。

關(guān)于編碼的更多信息可以參考《JavaScript字符集編碼與解碼》。

還可以使用多種編碼混淆在一起,更易于繞過服務(wù)器過濾。

<!--10進(jìn)制編碼background,16進(jìn)制編碼red--><div style="&#98&#97&#99kgr&#111&#117&#x006e;&#x0064;:\72\65\64;">content</div>

3. 標(biāo)簽天生具備HtmlEncode編碼,包括標(biāo)簽“title、iframe、noscript、noframes、textarea、xmp、plaintext”。以textarea為例:

<textarea id="textarea">    <div>222</div></textarea>
//&lt;div&gt;222&lt;/div&gt;document.getElementById('textarea').innerHTML

2)base標(biāo)簽

base標(biāo)簽定義頁面上所有相對(duì)路徑標(biāo)簽的host地址。

插入此標(biāo)簽設(shè)置域名,然后在遠(yuǎn)程服務(wù)器上定義相同文件名以及路徑,劫持當(dāng)前頁面所有使用相對(duì)路徑的標(biāo)簽。

<base href="http://www.pwstrick.com"/><!--解析為http://www.pwstrick.com/dist/x.jpg--><img src='/dist/x.jpg' />

3)window.name的使用

window對(duì)象不受同源策略的限制,可通過name屬性實(shí)現(xiàn)跨域、跨頁面?zhèn)鬟f參數(shù)。

window.name="alert(document.cookie)";//在另外要攻擊的頁面中注入 就能繞過長度限制執(zhí)行代碼eval(window.name);

有網(wǎng)友總結(jié)了繞過長度限制的技巧,但沒找到排版漂亮的版本,只找到百度文檔中的一篇,湊合一下看看吧《突破XSS字符數(shù)量限制

4)DOM fuzzing技巧

模糊測(cè)試(fuzzing)就是生成特定的數(shù)據(jù)輸入到程序的某個(gè)位置,監(jiān)視程序異常、奔潰、顯示結(jié)果等。

在前端中可以將代碼寫到HTML、JavaScript或CSS中都可。

通過在線fuzzing工具Shazzer可以了解更多,不過要注冊(cè)Twitter賬號(hào),我注冊(cè)成功了但授權(quán)沒成功,還是不能創(chuàng)建Vector,可惜了。

不過在網(wǎng)站上還是可以看到別人的編寫的一些代碼。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

5)其他

在網(wǎng)上還有個(gè)開源小工具XSSProbe,代碼簡單可供參考。

瀏覽器有兼容特點(diǎn),所以可以針對(duì)不同的瀏覽器注入不同代碼,瀏覽器探測(cè)可參考《Detecting browsers javascript hacks

 

四、XSS防御

1)HttpOnly

瀏覽器將禁止頁面的JS訪問帶有HttpOnly屬性的Cookie。此屬性解決的是XSS后的Cookie劫持攻擊。

Cookie的使用過程大致如下:

1. 瀏覽器向服務(wù)器發(fā)起請(qǐng)求

2. 服務(wù)器響應(yīng)后發(fā)送Set-Cookie頭(此時(shí)可設(shè)置HttpOnly),向客戶端瀏覽器寫入Cookie

3. 瀏覽器訪問該域下的所有頁面都將發(fā)送該Cookie(只要Cookie還沒過期)

<?phpheader("Set-Cookie: hidden=value; httpOnly");

2)輸入檢查

在服務(wù)器與客戶端添加驗(yàn)證規(guī)則,在特定的地方使用特定的規(guī)則,例如不匹配“script標(biāo)簽或<、>特殊符號(hào)”等。

啟用“白名單原則”,可用于標(biāo)簽、屬性或事件,只讓正常的“a、div”等標(biāo)簽通過。

下面是FindingDOMXSS中對(duì)輸入點(diǎn)(sources)的匹配規(guī)則:

/(location\s*[\[.])|([.\[]\s*["']?\s*(arguments|dialogArguments|innerHTML|write(ln)?
|open(Dialog)?|showModalDialog|cookie|URL|documentURI|baseURI|referrer|name|opener|parent|top|content|self|frames)\W)|(localStorage|sessionStorage|Database)/

3)輸出檢查

變量輸出到HTML頁面時(shí),可以使用編碼或轉(zhuǎn)義的方式防御XSS攻擊。

針對(duì)HTML與JavaScript的編碼可通過HtmlEncode和JavaScriptEncode實(shí)現(xiàn),具體的函數(shù)內(nèi)容可參考此處。

在PHP中,可以使用一個(gè)開源的項(xiàng)目HTML Purifier實(shí)現(xiàn)對(duì)XSS的檢查。

FindingDOMXSS中同樣給出了輸出點(diǎn)(sinks)的匹配規(guī)則:

/((src|href|data|location|code|value|action)\s*["'\]]*\s*\+?\s*=)|
((replace|assign|navigate|getResponseHeader|open(Dialog)?|showModalDialog|eval|evaluate|execCommand|execScript|setTimeout|setInterval)\s*["'\]]*\s*\()/

4)DOM Based XSS防御

DOM Based XSS是直接從“JavaScript”中輸出數(shù)據(jù)到HTML頁面里,前面提到的都是從“服務(wù)器”中輸出。

//x是從服務(wù)器中輸出的,并且做了JavaScriptEncode操作var x="\x20\x27onclick\x3dalert\x281\x29\x3b";//在輸出后會(huì)變成<a href=" " onclick="alert(1);">test</a>還是能執(zhí)行點(diǎn)擊document.write("<a href='"+x+">test</a>");

所以要在合適的地方再做一次編碼操作,下面是分情況說明:

如果輸出到事件或腳本中,則再做一次JavaScriptEncode;如果輸出到HTML內(nèi)容或?qū)傩灾校驮僮鲆淮蜨tmlEncode。

在OWASP中有一篇《DOM based XSS Prevention Cheat Sheet》,詳細(xì)記錄了發(fā)生場景和解決指南。

 

http://www.cnblogs.com/strick/p/6349911.html