一、web靶场-xss-labs靶机平台的搭建
githhub下载连接:https://github.com/do0dl3/xss-labs
配置环境:
php小皮面板下载:小皮面板(phpstudy) - 让天下没有难配的服务器环境! (xp.cn)
具体配置教程:VScode的PHP远程调试模式Xdebug奈何@@的博客-CSDN博客
1、将下载好的压缩包放置php的WWW根目录下
2、配置网站
这里我为了区别其他配置环境,新建了一个网站,
注意:
- 端口号选择一个不被占用的端口
- 根目录:‘\phpstudy\phpstudy_pro\WWW\xss-labs-master’
- 最好使用5.xx本版
3、启动MYSQL和Nginx
4、完成后我们就可以在浏览器输入127.0.0.1:8088进入靶场
二、xss-labs靶场通关攻略
第一关:
1、输入代码进行测试:源代码
我们直接将参数插入标题试一试
通关成功!!!
过关总结: JS弹窗函数alert()
第二关:
可以看到这一关多了一个搜索框
1、尝试插入代码
我们尝试注入:
可见一些关键字可能被过滤了
2、查看网页源码
3、查看源代码
htmlspecialchars函数对<>实体化转义
4、绕过思路
构造闭合input标签,将导致<转义的”闭合住,再次进行XSS注入
方法一:input标签
"><script>alert(1)</script>
方法二:使用onclick点击事件
aa"οnclick="alert(1)
点击搜索框:
通关成功!!!
本关小结:闭合绕过
第三关:
个人感觉是第一关和第二关的结合体
1、尝试插入代码
"<script>alert(1 )<lscript>"
2、查看网页源码
可见,< > "" 都被实体化了 但是单引号貌似没有被转义
3、查看源码
htmlspecialchars函数对<>大于小于号进行html实体化
4、绕过思路
使用单引号构造闭合
'<script>alert(1)</script>'
但是我发现即使闭合后提交搜索仍旧无法撤销,可以看到点击搜索框提交无法触发XSS
方法一:onmouseover事件
onmouseover事件的效果是当我们的鼠标碰到input标签的位置,也就是搜索框时,会执行onmouseover事件。最常与 <input>、<select> 和 标签一起使用,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码
' οnmοuseοver=javascript:alert(1) '
提交后我们把鼠标移到搜索框触发onmouseover事件。
方法二:onclick函数
aa’οnclick=‘alert(1)
点击搜索框:
通关成功!!!
本关小结: onfocus和onclick可以绕过html实体化(即<>号的过滤)
第四关:
1、输入代码进行测试:
我们尝试使用onmouseover进行XSS测试
无法触发
2、查看页面源码
可见这关将双引号给过滤了
3、查看源码
过滤< > 大于小于号
4、绕过思路
我们尝试使用双引号进行闭合
方法一:onmouseover标签:
" οnmοuseοver=javascript:alert(1) "
方法二:onfocus标签:
" οnfοcus=javascript:alert() "
通关成功!!!
本关小结:onmouseover标签和onfocus标签+双引号闭合绕过
第五关:
1、输入代码进行测试:
尝试上一关XSS注入漏洞方式:
2、查看网页源码
尝试上一关XSS注入漏洞方式:发现on 被过滤
尝试用<script>注入:
可见script也被过滤了
但是我们查看此时网页界面,发现alert(1)逃逸出来,但是没有执行:
3、查看源码
$_GET["keyword"]
将所有字母转换成小写
4、绕过思路
尝试使用javascript伪协议绕过试试
知识点补充:JavaScript伪协议实际上是把javascript:后面的代码当JavaScript来执行,并将结果值返回给当前页面。
a href=javascript:alert('1')
还是未能绕过
查看web源码
发现<>被后面的>闭合,导致代码未能逃逸出来,无法执行,同时还有一个双引号防止双引号逃逸
因此,修改代码如下
添加一个标签得闭合前面的标签,构造闭合后新建一个=payload标签,在其中使用伪协议进行绕过
通关成功!!!
本关小结:可以插入标签(如标签的href属性)达到js执行的效果,前提是闭合号<"">没失效
第六关:
我们先按前五关来测试一下
1、输入代码进行测试:
2、查看网页源码
可见这一关将href也给过滤了
3、查看源码
可见将script、on、src、data、href过滤了,也将所有字母转小写
4、绕过思路
其余关卡的执行代码测试之后也无法绕过
我们发现<> 、“ ”、‘ ’、script、href、javascript等都被过滤
这时我们换一个思路,我们尝试这一关的大小写是否被过滤
构造代码:
"><ScriPt>alert(1)</ScrIpt>
通关成功!!!
本关小结:大小写法绕过str_replace()函数
第七关:
老规矩,把上一关的代码进行测试:
1、输入代码进行测试:
2、查看网页源码
可以发现,script直接变成了空值
3、查看源码
将所有字母转小写
过滤以下关键字:script、on、src、data、href
4、绕过思路
我们换个思路——双写来对应替换成空值这一注入绕过问题
例如:script,可以写成scscriptipt,当script被删掉的时候,就变成了script
注意这个加入的script不能分开,识别到后这个加入的script会被替换成空值,剩下的部分自动拼接,执行时空格会被自动忽略。
"><sscriptcript>alert(1)</sscriptcript>
通关成功!!!
关小结:双拼写绕过删除函数
第八关:
1、输入代码进行测试:
2、查看网页源码
输入任意字符,查看其输出路径:
可见在href下输出
尝试使用javascript注入:
javascript:alert(1)
发现javascript被过滤了
尝试大小写绕过:
发现大小写也被过滤:
3、查看源码:
将所有字母转换成小写
将单引号 ' ' 替换为实体字符双引号 " "
过滤以下关键字:script、on、src、data、href
4、绕过思路
尝试将javascript编写成urlcode代码进行绕过
<span style="background-color:#f8f8f8"><span style="color:#333333">javascript:alert(1)
javascript%3Aalert%281%29</span></span>
绕过失败,无法解析
方法一:
尝试利用利用href的隐藏属性自动Unicode解码,插入一段js伪协议尝试
原理:
编码顺序:urlcode html unicode javascript
因此,在使用html实体编码转义后javascript后,执行时首先将html 转换成javascript,从而绕过
javascript:alert(1)
可见应该javascript已经插入到href中:
通关成功!!!
本关小结: href属性自动解析Unicode编码
第九关:
1、输入代码进行测试
aaaa
连接不合法?那我们加上合法连接模式
2、查看网页源码
http://www.baidu.com JavaScript:Alert(1);
可见javascript被过滤了
3、查看源码
可以看到和上一关差不多:
将所有字母转换成小写
将单引号 ' ' 替换为实体字符双引号 " "
过滤以下关键字:script、on、src、data、href
但是其中加了一个if条件判断语句,如果传入的值中没有http://就会返回false
如果我们要想构造payload进行绕过,必须加入http://字符,但同时还要注释掉,否则无法触发
4、绕过思路
由于javascript被过滤了,我们尝试将script进行html编码,尝试绕过,同时将http://进行注释,从而构造payload进行绕过
方法一:
Javascript:Alert(1);//http://
没有报错
绕过成功!!!
方法二:
将http:// 放在alert(’ ‘)进行注释:
javascript:alert('http://'
绕过成功!!!
本关小结:将javascript进行编码绕过,同时将指定必须要的字符http://加入并且注释掉即可
第十关:
1、输入代码进行测试
这一关没有input,我们首先在浏览框输入代码进行测试
2、查看网页源码
可以看见这一关有三个隐藏表单
没办法,我们来查看以下源码吧
3、查看源码
可以看到:
- 将所有字母转换成小写
- 过滤tsort
- 过滤>转义成空
- 过滤<转义成空
- 同时还有三个隐藏表单
4、绕过思路
我们将隐藏表单的关键字拿出来依次尝试:
关键字t_link,传参失败
关键字t_history,传参失败
关键字t_sort,传参成功
由此可见传参值是t_sort
方法一:
由于这里的输入框被隐藏了,我们使用onclick标签。添加type="text"来构造payload进行绕过
http://127.0.0.1:8088/level10.php?t_sort=aaaaa%22%20type=%22text%22%20onclick=%22alert(1)
过关成功!!!
方法二:
也可以使用onfocus事件构建payload进行绕过
http://127.0.0.1:8088/level10.php?t_sort=aaaaa%22%20onfocus=javascript:alert()%20type=%22text
过关成功!!!
本关小结:根据隐藏form表单的参数名,尝试哪一个是正确的传参值,之后在隐藏的input标签中插入type="text显示输入框,构造闭合payload进行绕过
第十一关:
1、输入代码进行测试
没有反应
2、查看网页源码:
出现了熟悉的隐藏表单
3、查看源码
可以看到:
- 将所有字母转换成小写
- 过滤tsort
- 过滤HTTP_ERFERER
- 过滤>转义成空
- 过滤<转义成空
- 同时还有四个隐藏表单
4、绕过思路
按照上一关的思路来
关键字t_link,传参失败
关键字t_history,传参失败
关键字t_sort,传参成功
关键字t_ref,传参失败
但是按照上一关尝试发现无法绕过:
发现这一关将双引号 " " 给转码了,导致无法闭合
我们换个思路,这一关有四个<input>标签的值都做了隐藏处理,最后一个t_ref的<input>标签是http头referer的参数
我们的传参思路出现错误,我们不应该在get里面传参,而是伪造http的head头,即REFERER进行传参
这时候我们需要使用一个很好用的渗透工具——Hackbar在firefox浏览器下安装老版本hackbar_奈何@_@的博客-CSDN博客
我们首先测试一下前三个是否能够在REFERER传参
在尝试t_ref下传参
可见传参成功
之后就和上一关思路大致相同
方法一:
使用onclick标签,添加type="text"来构造http头进行绕过
Referer:"type="text" onclick="alert(1)
过关成功!!!
方法二:
使用onfocus标签,构造一个http头进行绕过
Referer: " onfocus=javascript:alert(1) type="text
过关成功!!!
本关小结:本关主要是referer,伪造http的head头,在隐藏的input标签中插入type="text显示输入框,构造闭合payload进行绕过
第十二关:
1、输入代码进行测试:
2、查看网页源码
又出现四个隐藏<input>
根据上一关经验,肯定是User-Agent头,我们使用Hackbar工具插入测试代码
可见我们的猜想是正确的
3、查看源码
可以看到:
- 将所有字母转换成小写
- 过滤tsort
- 过滤HTTP_USER_AGENT
- 过滤>转义成空
- 过滤<转义成空
- 同时还有四个隐藏表单
4、绕过思路,参考第十关
方法一:
使用onclick标签,添加type="text"来构造UA头进行绕过
aaa"type="text" onclick="alert(1)
过关成功!!!
方法二:
使用onfocus标签,构造一个UA头进行绕过
" onfocus=javascript:alert(1) type="text
过关成功!!!
本关小结:思路和10,11关大致相同,主要是http头部传参
第十三关:
1、输入代码进行测试:
没什么头绪,我们来看一下网页源码:
2、查看网页源码
我们又看到了熟悉的配方——直接看一下cook
使用Hackbar进行测试
好了,到了这里思路就简单明了了
照例再查看一下源码
3、查看源码
可以看到:
- 将所有字母转换成小写
- 过滤tsort
- 过滤>转义成空
- 过滤<转义成空
- 同时还有四个隐藏表单
4、绕过思路
参考10,11,12,13关
方法一:
使用onclick标签,添加type="text"来构造USER头进行绕过
user=" onclick=alert() type="text
过关成功!!!
方法二:
使用onfocus标签,构造一个USER头进行绕过
user=" onfocus=javascript:alert(1) type="text
过关成功!!!
本关小结:思路和10,11,12关大致相同,主要是http头部传参
第十四关:
1、输入代码进行测试:
2、查看网页源码
3、查看源码
4、绕过思路
由于这一关网站挂了,所以不在演示了
说一下思路吧
这一关是利用转跳的网站,在那网站去上传一个,属性里面含有xss代码的图片,以达到弹窗的效果
第十五关:
1、输入代码进行测试
没什么思路,直接看一下网页源码
2、查看网页源码
在如图所示的ng-include下输出,但是ng-include是什么?
ng-include指令就是文件包涵的意思,用来包涵外部的html文件,如果包涵的内容是地址,需要加引号
3、查看源码
4、绕过思路
既然ng-include指令就是文件包涵的意思,而这一关需要我们自己走出去,,并且ng-include可以包涵的内容是地址,需要加引号
因此,我们尝试采用ng-include包含一下第一关的html,看能否绕过这一关
127.0.0.1:8088/level15.php?src='/level1.php'
可以看见我们已经将第一关的html包含到第十五关,那么接下来我们该怎么做呢?
我们先测试一下这一关过滤了那些东西
src= ' " <>%20 AAaa OnCliCK <script> <a hReF=javascript:alert()>
可见,' " <> 空格都被过滤了,由此可猜测又html实体化函数存在
版权归原作者 奈何@_@ 所有, 如有侵权,请联系我们删除。