环境:Windows10 + phpstudy + xss-labs
靶场:https://github.com/do0dl3/xss-labs
放在(网站根目录)
练习方法:通过输入语句判断是否弹窗,查看源代码(以及F12)找出编改信息,尝试注入语句
一、第一关 直接注入
观察三处箭头,可以发现它是向服务器提交了一个name参数,值为“test”,从页面
回显来看,将neme参数的值显示在了页面上,并且显示了name参数值的字符长度
接下来,查看源码。直接输入语句
<script>alert('test')</script>
二、第二关 标签被闭合
使用第一关方法,发现不成功,查看网页源代码
可以看到在<h2> </h2>标签之中的恶意代码被编码了。其中<和>都被编码成了html字符实体。
要想浏览器执行这里的弹窗代码,只需要将属性的引号和标签先闭合就可以了。将keyword的参数值重新赋值
"><script>alert('xss')</script><
三、第三关 <>号都被实体化
<>号都被实体化了
因为html前端代码中;使用标点符号时要空一格
' onclick=alert('test') '
四、第四关 <>号都被实体化
同第三关,改为双引号
" onclick=alert('test') "
五、第五关 javascript伪协议
尖括号没有过滤,但是<script>中间有个下划线,通过构造href属性来绕过
"><a href="javascript:alert('test')">点击</a><"
六、第六关 大小写绕过
把href属性给过滤了。查看了一下源码,src、data、on都被过滤了。但是大小写没有过滤,可通过大小写进行绕过
" Onclick=alert('test') "
七、第七关 双写绕过
正常注入,直接替换为空了,那么其他的也都替换了,大小写也被过滤了。这里因为是替换为空字符,我们可以通过双写注入进行绕过。
" OOnnclick=alert('test') "
八、第八关 html实体编码绕过
我们在输入框输入的内容,会被带入到友情链接href属性中,那我们是不是可以直接输入javascript:alert(1),点击友情链接不就可以了嘛。当我们输入后发现javascript被过滤了。只能使用HTML实体编码(即Unicode编码)绕过了。将javascript:alert(1)进行实体编码
javascript:alert('test')
九、第九关 http://注释绕过
显示链接不合法?意思是让我们输入个待http://的值?试着输入以下,查看源代码
但是http://在前面是无法执行JavaScript,那么如何去除呢,我们想到这个是php代码,是不是可以用双斜杠进行注释,http://放到最后面不就注释掉了嘛。注意这关也需要实体化字符串。
javascript:alert('test')/* http:// */
十、第十关 隐藏信息
从页面响应来看,有一个<input>标签的状态可以被改变。这个标签就是名为t_sort的<input>标签,之前都是隐藏状态,但是通过构造参数响应发现,可以看到有hidden,把输入框给隐藏了,把type属性删掉或者修改hidden为text,则会出现输入框。按F12,选中上面的元素。有它里面的值被改变了。尝试尝试能不能注入恶意代码进行弹窗,利用$t_sort参数。
<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')
十一、第十一关 referer注入
可以看到如同第十关一样有隐藏的表单不同的是多了一个名为t_ref的<input>标签。
t_sort仍然是接受参数值的,但是里面的双引号被编码了,F12查看元素。通关抓包看到缺少referer头,将如下代码加入到referer头中,修改放包即可。
referer: "type="test" onclick="alert('test')
十二、第十二关 User-Agent注入
可以看到本关和上一关差不多,这里使用user-agent参数罢了,所以我们直接上payload
user-agent: "type="text" onclick="alert('test')
十三、第十三关 cookie参数绕过
跟上题一样,考虑一下http头传值
" onclick=alert() type="text
名字是t_cook,考虑到是cookie头,我们先看一下这个网页的cookie,F12打开
十四、第十四关 exif xss
该关是修改iframe调用的文件来实现xss注入(但因为iframe调用的文件地址失效,无法进行测试),直接跳15关
十五、第十五关 ng-include文件包含
这一关看到src可以猜想是个文件包含的题目
可以随便包涵之前的一关并对其传参,以达到弹窗的效果
发现个ng-include:,include作用是将同一服务器的html文件包含进来,和src进行传参,在请求 src 资源时会将其指向的资源下载并应用到文档中,比如 JavaScript 脚本,img 图片等等,在这里我们将src指向任意一关,输入对应的xss弹窗脚本即可。
?src='level1.php?name=<img src=1 one rror=alert(1)>'
十六、第十六关 空格绕过
这里过滤了很多标签和一些常见方法
回车代替空格绕过检测
?keyword=<svg%0Aonload=alert(1)>
十七、第十七关 embed标签 拼接绕过
发现embed标签,用来嵌入外部内容,比如插件、多媒体文件等。尝试对arg01和arg02的值进行修改。发现src属性后面的值也在发生变化。这两个变量是互相拼接起来的,所以在输入arg02时在b之后加一个空格,当浏览器解析到b的时候就停止判断,然后将onclick或onmouseover看作另外一个属性。从而执行JavaScript语句。
?arg01=a&arg02=b onm ousemove='alert(1)'
?arg01=a&arg02=b onclick='alert(1)'
十八、第十八关 拼接绕过
源码跟上关差别不大,就是换了个swf文件。跟17关一样,payload也一样
?arg01=a&arg02=b onm ousemove='alert(1)'
十九、第十九关 flash xss
arg01=version&arg02=<a href="javascript:alert(1)">xss</a>
二十、第二十关 反编译
?arg01=id&arg02=xss\"))}catch(e){alert(1)}//%26width=123%26height=123
arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)