最近刚学 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>"
也不行。
可见他过滤了尖括号和引号。<>"
分别变成了转义符 <>"
我试试用 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=# onerror=alert(document.domain)><input type="text" value="
成功弹窗。
第 5 题¶
一开始没注意有什么。没有过滤。突然发现有长度限制 15 字符。
直接把 15 改为 999。然后填写,弹窗成功。
也可以用 WebScarab 拦截 POST 包,修改。可以绕过 15 字符限制。成功弹窗。
后来看了网上答案,似乎也是用代理拦截。
第 6 题¶
这次随便输入东西。发现 <>
号被转义为 <>
尝试利用前面的知识:Unicode 编码。似乎不行。
突然想起,用这个代码,不需要尖括号:
" onmouseover=alert(document.domain) align="left
弹窗成功。
看答案是基本一样的。
第 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
。果然是输入一个地址,在下面生成一个同样的链接。
那目测要反射型?
但是测试一下发现,他过滤了引号和尖括号。
" 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 编码。
不管了,先上 FireBug 爽一把:
我看到,这个 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="
我去,我的 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 题¶
一个背景颜色的题,可惜会过滤我的引号。
关于 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 的时候写的,那时洒家对 XSS 的理解不是很深,都是半懂不懂地一顿乱试。另外,这篇文章就是个流水账,内容全都是口语,句子都不通顺,还有一些错别字和一些不知道什么意思的多余字符串。
洒家对着多余的字符串百思不得其解。搜索了一下,意外发现我这篇文章已经被翻译成多种文字了,可惜都是机器翻译。
这一套题目即使在当时看来也有点老了,有的题目考察的是旧版 IE 的特性,有的题目场景好像都是 self-XSS。简单看了一下,一些修改页面元素、抓包改包才能注入 JavaScript 代码的题,应该是要结合 CSRF 才有现实利用价值。
因此这篇文章仅供怀旧。
写于 2020 年 11 月迁移老博客时。