先放上网址:http://xss-quiz.int21h.jp

这是一个模仿真实xss挖洞的情景,在XSS Challenges练习过程中,我们需要用浏览器中的f12中搜索(),找出我们控制的代码所在的位置,然后思考那些个位置哪个或哪几个位置可以被注入我们想要的代码,然后结合上下文进行各种脑洞绕过。

建议使用firefox浏览器,搭配burp进行练习。

 

Stage #1

这一道题发现我们写入的内容直接没有任何过滤,嵌套在一个<b>标签里面,我们常规闭合标签新建标签即可。

"</b> <script>alert(document.domain)</script><b>"1"

Stage #2

这一题的注入点是在一个input标签的value属性那里,我们前后闭合input标签然后在中间加上script就好了。

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

Stage #3

这一道题我们的注入点也是在<b>标签里面,唯一的不同是用于标签构造的<>被转义了,用于匹配掉双引号的双引号也被转义了,所以我们要另外想方法。

我们注意到提交的参数并不只有输入框中的内容,还有country,也就是数据包中的p2

所以抓包,改包,发包,成功。

查找,我们可以看到我们注入的标签无任何过滤插入到了<b>标签上。

p1=1&p2=<script>alert(document.domain)</script>

Stage #4

这里依然是先抓包,发现有个hackme....

XSS模拟实战训练【XSS Challenges平台】_渗透测试教程

我们构造参数,直接提交,发现直接就过了。

p1=1&p2=Japan&p3="><script>alert(document.domain)</script>"

Stage #5

与Stage#2几乎一样,也是value参数,唯一的不同点是在前端限制了输入的长度,我们直接用bp抓包提交就好了。

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

Stage #6

与Stage#2几乎一样,也是value参数,唯一不同的是过滤了<>,但没有过滤"(可以闭合前面的属性),这样我们就不可以用新的标签了,但我们可以在<input>标签里面加新的属性。之后再次点击输入框即可通过本关。

" onclick=alert(document.domain) name="1

Stage #7

这道题也是value出问题,但除了<>,这道题把"也过滤了,本来以为这样就不能把独立的属性分隔出来,但我直接使用前一道题的参数,竟然成功触发了alert。

" onclick=alert(document.domain) name="1

Stage #8

题目是输入一条url,然后后台把它包在一个<a>标签里,我们需要点击超链接然后弹窗。

我们百度怎么在url中执行js,学到可以构造参数,然后点击超链接,点击过关。

javascript:alert(document.domain)

Stage #9

这道题卡住了,暂时没做出来。先用改包的方式绕过。拦截返回的数据包,修改如下:

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

这道题我们只能用抓包的功能过。(每一道题都可以)

Stage #10

这个也是value注入点,直接在网页提交发现,后台把domain过滤掉了。

上网找了下document.domain的等效DOM发现没有,突然想到是不是只匹配了一次,故嵌套domain

成功弹窗。

"><script>alert(document.domdomainain)</script><

Stage #11

也是value注入点,在网页中各种提交姿势试一下,发现script前面加个x,on事件全部不能用,想到除了on事件和script之外还能执行js的是构造a标签在超链中执行js。

构造"><a href=javascript:alert(document)>1</a>< ,发现构造的语句中仍然有script,我们把之中的s进行html实体化,s=&#115;

"><a href=javascript:alert(document.domain)>1</a><

发现被渲染成s了,成功弹窗。(还可以在script中间插入&#09;,&#10;,空格等不可见字符对script进行分割,让正则匹配不到)

做这道题又把unicode,utf-8,url编码,html实体等看了一遍,发现它们英文部分有很多相同之处,比如都可以表示为ascii的十、十六进制,只要加不同前缀就好了。

Stage #12

照常尝试,还是value值,过滤了<>和",想用编码能不能绕过(因为过滤了<>",HTML实体是不行的,html实体不能让内容逃出来),ie浏览器会把 ` `(笔记本1左边那颗键两次)识别为双引号,从而让我们的内容逃出来(<>没法逃就设置属性),构造payload。由于我用的火狐,并没有成功,老方法,抓包绕过。

`` onclick=alert(document.domain)

Stage #13

照常转义了<>和",F12发现相比以往的题这道题多了一个style属性,那肯定就是从这里入手了。

百度style XSS,搜到一个知识点叫“行内样式的动态特性”(就是在ie下能在css中执行js代码)

我在ie下试了很久都不能复现,又百度,发现还有一种利用方法  background:url(javascript:alert('xss'));

还是不能复现,只能归结为ie版本太高的问题了。

这道题卡住了,暂时没做出来。先用改包的方式绕过。拦截返回的数据包,修改如下:

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

Stage #14

和Stage #13几乎一样,不同的是转移了了script和expression,想用&#num;的形式实体一下其中的字母,但发现&号也被转移了mmp,然后试了下/**/应该也是可以的,可惜不能复现。从大佬的WP上有学来集中绕过方法。

(1)能绕WAF的不止html实体,unicode编码也行如e -> \0065 ,\u0065   ;\0065xpression(这道题过滤了反斜杠,反斜杠零)

(2)在expression中加反斜杠分隔 ;ex\pression(不行,理由同上)

(3)在expression中加注释符/**/分隔;ex/**/pression  通过

(4)在expression中加反斜杠零分隔; ex\0pression 通过

这道题卡住了,暂时没做出来。先用改包的方式绕过。拦截返回的数据包,修改如下:

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

Stage #15

随便试了下,照常转义<>,",也转义了&,过滤了\让我们不能构造html实体,和unicode编码。~~等等!

\是过滤了,不是转义了!我们试试输入两个\,发现只过滤了一个!

那就直接unicode就行了(就是\\003c和\\003e代替<>换成十六进制编码也就是\\x3c,\\x3e也是可以的)

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

Stage #16

看到又有document.write,试了试上题的利用代码,直接过了......看了下hint,发现是替换了\x,那与上题唯一的区别就是十六进制编码不能用了。ps:还有一种编码格式是八进制编码?学到一个知识点叫 HTML和javascript的自解码机制.payload如下:

\\74img src=x onclick=alert(document.domain)\\76

点击一下生成得图片即可过关。

 

Stage #17

题目说了只能在老ie上复现,那我们就直接看大佬WP好了。

类似于sql注入的宽字节注入,用%A7(%几都行,只要符合下面大佬WP中可以用来欺骗的编码)加上双引号的%34?让html自解码机制误认为这是宽字节字符,从而弄掉双引号。

半角片假名使用两个字节来表示:0x8E + 0xA1-0xDF

JIS X 0208字元使用两个字节来表示:0xA1-0xFE + 0xA1-0xFE

JIS X 0212字元使用三个字节来表示:0x8F + 0xA1-0xFE + 0xA1-0xFE

 

Stage #18

也是老版本ie,跳过不写。

Stage #19

没有任何输入点,抓包没发现任何东西....

这个不会,抓包跳过。

XSS模拟实战训练【XSS Challenges平台】_xss平台训练_02

结尾有个排行榜,可以参观一波,看来练习得人不少。

 

写在最后:

菜鸡就是菜鸡,没有全搞定,有兴趣得师傅可以尝试做一下,有答案可以评论告诉我,让我也跟大家涨一波姿势。