首先还是要有phpstudy,这个就不说了。

然后下载靶场:

地址:https://github.com/do0dl3/xss-labs

将靶场解压到phpstudy的www目录下,访问就好了。

  • xss-labs 1~10

level-01

根据图标点击进入xss之旅:

可以看到有get请求,参数为name,可进行输入,并将输入内容显示于页面。

http://127.0.0.1/xss-labs-master/level1.php?name=test


可以看到这里的输入内容直接插入到了<h2>标签中,没有任何的过滤。

直接在URL中输入payload:

http://127.0.0.1/xss-labs-master/level1.php?name=test<script>alert('hhh');</script>


事后看看后端代码:

通过源码可以看到,服务器通过get发送传递name参数的值赋值给了
$str变量,后直接将$str变量插入到了<h2>标签。没有对name参数进行任何的处理,且name完全由我们控制,所以我们可以直接插入反射型的XSS漏洞。

level-02

依然是get传参,首先我们直接尝试payload:

<script>alert('hhh');</script>


可以看到我们构造的payload直接出现在了页面上,没有执行。

查看源码,我们的payload在<h2>标签中被编码了。<>被编码成立HTML字符实体。猜测在服务端用了htmlspecialchars()函数对keyword参数值进行了处理。而value中的js代码不能被执行。

由于payload在<h2>中是已被htmlspecialchars()函数过滤过的,所以我们尝试从value绕过,用 “> 将前方的value标签闭合,构造payload:

"><script>alert('hhh');</script>

成功:

再看看后端:

可以看到还是以get方式传递keyword参数的值给$str变量。且在<h2>处用htmlspecialchars()函数对变量$str进行了处理,才显示的。但是在<input>标签的value属性值中是直接插入的,所以我们在这里进行XSS攻击。

level-03

随便输入看看:

现在看来是和第二关没什么区别,无法确定服务器端是否对敏感字符进行了过滤,编码等操作。尝试构造payload探探虚实:

<script>alert('hhh');</script>

没有弹窗,看看源码:

可以看到这次对h2和value处都用htmlspecialchars()函数进行了处理:

字符	10进制	文字
”	&#34	&quot;
’	&#39	&apos;
&	&#38	&amp;
<	&#60	&lt;    >	&#62	&gt;

所以我们通过<input>标签的一些特殊事件来执行js代码,所以可以构造:

1' onclick='alert(1)   //点击输入框
1' onmouseover='alert(1)    //鼠标移动到1上
1' oninput='alert(1)   //输入

属性 值 描述
oninput script 当元素获得用户输入时运行的脚本。
onclick script 当元素被点击时发生。
onmouseover script 当鼠标移动到元素时发生。
以上代码可以构成:

<input name=keyword value='1' onclick='alert(1)'>
<input name=keyword value='1' onmouseover='alert(1)'>
<input name=keyword value='1' oninput='alert(1)'>

以上方法都可以实现:

不看源码的情况下,判断value属性使用的是单引号还是双引号:
输入’ “ >三个字符测试闭合,来判断。

输入’“>文本框无内容,为’闭合显示为:

输入ohh’”>,显示为:

看看后端代码:

确实对h2和value处都用htmlspecialchars()函数进行了处理。
level-04
和第三关方法相同,变为了 “ 闭合。

看看后端:

可以看到先是用str_replace()函数进行了对<>的转化,后<h2>处进行了htmlspecialchars()函数处理,value处之后直接拼接赋值。
level-05
尝试直接弹窗,看看页面反应:

可以看到依然是在`<h2>`处进行了htmlspecialchars()函数处理,而在value处可以看到第一个<script>标签中插入了一个_。现在看来我们之前的触发条件依然可以,试试看:


我们之前的事件触发也被防范了。

尝试换个其他标签:

"> <a href=javascript:alert('hhh')>不要点</a>


看看后端:

可以看到先是将传过来的keyword用strtolower()函数将其转化为小数,后用str_replace()函数对<script和on进行了处理,最后在<h2>处用htmlspecialchars()函数处理后显示,在value处直接插入。

level-06
还是先基本测试看看,看不出什么。然后直接上一个<scriptOnon>,一步到位查看JS代码变换:

可以看到在value处script、on关键字已被加上_,<>也在<h2>处被处理,但是这里可以看到value处没有进行小写转化,所以我们可以尝试大小写绕过:

"><scRipt>alert(1);</script>
"><a Href=javascript: alert(1)>ohh</a>


日常看代码:

可以看到服务端做的措施还挺多,将
<script, on, src, data, href,都做了替换破坏原有语义。也提示了我们第五关的其他方法(虽然来的比较晚)。其他的xss攻击举例:

<img src=100 onerror=alert(1)>

data,emmm不了解,看看其他大佬→里面有点data构造的xss讲解,这里搬过来了:

data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=
这条语句和javascript:alert(1)<script>alert(1)</script>的作用是一样的。

data:的语法从上面的语句中已经可以看得很清楚了,base64为编码方式,可以任意改,可以UTF-8可以UTF-7,只要将后面编码后的内容做相应的更改就可以了。

利用可以参考下面的演示:

http://www.bj.com/xss/level1.php?name=<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=">oh</a>

level-07
还是先进行测试:

<scriptonOn>oh</script>


可以看到在<h2>处<>被处理了,value处直接将我们<>里的script和on,On都去掉了,所以大小写绕过应该也是不行了。既然删除了我们的代码试试双写绕过:

"> <scrscriptipt>alert(1);</scscriptript>


看代码:

可以看到先是将我们的输入进行了小写转换,后又对关键字进行了空替换。但是这个替换只进行了一次,所以我们可以双写绕过。
level-08
输入普通的XSS攻击看看:

<script>alert('hhh');</script>


可以看到value中的值被编码成了字符实体,而在href中的script字符被插入了_字符破坏语义。

再看看事件触发和大小写绕过:

" onclick="alert(1)
javaSCRipt:alert(1)

也不行。

将我们要提交的js代码进行编码来绕过,不要全部转换,不然无法识别(我把t转化了):

成功:

看看源码:

可以看到对参数进行了小写转化,后对常见的关键字进行了过滤处理,最后还将"进行了字符实体替换。
level-09
尝试普通XSS攻击:

<script>alert('hhh')</script>

查看源码:

可以看到我们的值插入到了value中,当然是进行了编码,而href处显示我们的链接不合法,没有将我们的值插入进去。

我们插入一个合法的链接看看:

可以看到成功插入进去。所以我们将攻击语句带入到带有url地址中看看,看能否插入进去:

可以看到确实插入成功,但是我们的javascript字符被插入了_。在试试大小写绕过,也不行,被转化为了小写后插入_。

我们还是同上一关一样对关键字进行编码绕过看看,没有成功。然后看到大佬博客还要求在alert()与http之间加上//,否则不会成功。所以我们加上//,成功:

javascrip&#116;:alert(1)//http://www.baidu.com


看看源码了:

level-10

输入框消失了,响应页面上只有一个显示位。先看看源码:

可以看到有一个隐藏的表单,里面偶三个隐藏的<input>标签,这里我们先测试一下显示位看看:

果然关键字符被编码了。

去隐藏的标签看看,先构造语句看看哪个标签可以突破:

1&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"


可以看到标签名为t_sort的<input>标签可以被改变。所以我们从这里入手,构造语句:

1&t_sort=" type="text" onclick="alert(1)


看源码:

可以看到服务器是接收t_sort参数的,再将<、>去除后插入到<input>标签中。所以我们不能通过闭合<input>标签来引入新标签攻击。