web靶场——xss-labs靶机平台的搭建和代码审计

目录

一、web靶场-xss-labs靶机平台的搭建

1、将下载好的压缩包放置php的WWW根目录下

2、配置网站

3、启动MYSQL和Nginx

4、完成后我们就可以在浏览器输入127.0.0.1:8088进入靶场

二、xss-labs靶场通关攻略

第一关:

1、输入代码进行测试:源代码

我们直接将参数插入标题试一试

第二关:

1、尝试插入代码

2、查看网页源码

3、查看源代码

4、绕过思路

方法一:input标签

方法二:使用onclick点击事件

第三关:

1、尝试插入代码

2、查看网页源码

3、查看源码

4、绕过思路

方法一:onmouseover事件

方法二:onclick函数

第四关:

1、输入代码进行测试:

2、查看页面源码

3、查看源码

4、绕过思路

方法一:onmouseover标签:

方法二:onfocus标签:

第五关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码

4、绕过思路

第六关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码

4、绕过思路

第七关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码

​​​​​​​4、绕过思路

第八关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码:

4、绕过思路

方法一:

原理:

第九关:

1、输入代码进行测试

2、查看网页源码

3、查看源码

4、绕过思路

方法一:

方法二:

第十关:

1、输入代码进行测试

2、查看网页源码

3、查看源码

4、绕过思路

方法一:

方法二:

第十一关:

1、输入代码进行测试

2、查看网页源码:

3、查看源码

4、绕过思路

方法一:

方法二:

第十二关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码

4、绕过思路,参考第十关

方法一:

方法二:

第十三关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码

4、绕过思路

方法一:

方法二:

第十四关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码

4、绕过思路

第十五关:

1、输入代码进行测试

2、查看网页源码

3、查看源码

4、绕过思路

方法一:

方法二:

第十六关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码

4、绕过思路

方法一:

方法二:

第十七关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码

[< embed >:外部内容嵌入元素](#< embed >:外部内容嵌入元素)

4、绕过思路

方法一:

方法二:

第十八关:

1、输入代码进行测试:

2、查看网页源码

3、查看源码

4、绕过思路

第十九关:

1、不管了,直接查看源码

2、绕过思路

第二十关:

1、直接查看源代码

2、绕过思路


一、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> 和 <a> 标签一起使用,简单来说,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标签,在其中使用伪协议进行绕过

"><a href=javascript:alert('1')>

通关成功!!!

本关小结:可以插入标签(如<a>标签的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代码进行绕过

md-end-block 复制代码
<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,从而绕过

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;: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进行绕过

方法一:

Java&#115;&#99;&#114;&#105;&#112;&#116;:Alert(1);//http://

没有报错

绕过成功!!!

方法二:

将http:// 放在alert(' ')进行注释:

java&#115;&#99;&#114;&#105;&#112;&#116;: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进行绕过

md-end-block 复制代码
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头进行绕过

md-end-block 复制代码
Referer:"type="text" onclick="alert(1)

过关成功!!!

方法二:

使用onfocus标签,构造一个http头进行绕过

md-end-block 复制代码
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头进行绕过

md-end-block 复制代码
aaa"type="text" onclick="alert(1)

过关成功!!!

方法二:

使用onfocus标签,构造一个UA头进行绕过

md-end-block 复制代码
" onfocus=javascript:alert(1) type="text

过关成功!!!

本关小结:思路和10,11关大致相同,主要是http头部传参

第十三关:

1、输入代码进行测试:

没什么头绪,我们来看一下网页源码:

2、查看网页源码

我们又看到了熟悉的配方------直接看一下cook

使用Hackbar进行测试

好了,到了这里思路就简单明了了

照例再查看一下源码

3、查看源码

可以看到:

  • 将所有字母转换成小写

  • 过滤tsort

  • 过滤>转义成空

  • 过滤<转义成空

  • 同时还有四个隐藏表单

4、绕过思路

参考10,11,12,13关

方法一:

使用onclick标签,添加type="text"来构造USER头进行绕过

md-end-block 复制代码
user=" onclick=alert() type="text 

过关成功!!!

方法二:

使用onfocus标签,构造一个USER头进行绕过

md-end-block 复制代码
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,看能否绕过这一关

md-end-block 复制代码
127.0.0.1:8088/level15.php?src='/level1.php'

可以看见我们已经将第一关的html包含到第十五关,那么接下来我们该怎么做呢?

我们先测试一下这一关过滤了那些东西

md-end-block 复制代码
src= ' " <>%20 AAaa OnCliCK <script> <a hReF=javascript:alert()>

可见,' " <> 空格都被过滤了,由此可猜测又html实体化函数存在

这时我们可以选择在包含第一关的html 后在这一页面将触发第一关的绕过,但是这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用input标签

方法一:

md-end-block 复制代码
?src='/level1.php?name=<input src=1 onmouseover=alert()>'

当鼠标移动到输入框时就出发了弹窗

绕过成功!!!

方法二:

也可以使用p标签,构造payload

md-end-block 复制代码
?src='/level1.php?name=<p onmousedown=alert()>aaa</p>'

点击aaa即可绕过

绕过成功!!!

本关思路:ng-include文件包涵,可以无视html实体化

第十六关:

1、输入代码进行测试:

没什么思路,查看网页源码

2、查看网页源码

可见aaaaa插入到了center标签中

依旧没什么思路,直接看源码

3、查看源码

可以看到:

  • 将所有字母转换成小写

  • 将script转换成空格,然后将空格实体化

  • 将 / 转换成空格,然后将空格实体化

4、绕过思路

空格已经不能用了,那我们查一下可以代替空格的编码

  • 在URL中,空格通常被编码为 "%20"

  • 在HTML中,空格通常被编码为 " " 或 " "

  • 可以用回车来代替绕过,回车的url编码是%0a

方法一:

将空格替换构造payload

md-end-block 复制代码
?keyword=<svg%20onload=alert(1)>

绕过成功!!!

方法二:

也可以用img标签构造payload绕过

md-end-block 复制代码
keyword=<img%0Asrc=1%0aonerror=alert(1)>

绕过成功!!!

本关思路:回车代替空格绕过检测

第十七关:

1、输入代码进行测试:

这里可以看见他能传两个参数:a,b

没什么思路,测试一下关键字吧

md-end-block 复制代码
?arg01=" ' / sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;

2、查看网页源码

可以见到添加了html转义字符,但是embed标签是什么?

3、查看源码

可以看到后缀名为swf的文件(FLASH插件的文件,现在很多浏览器都不支持FLASH插件了)

< embed >:外部内容嵌入元素

HTML <embed> 元素将外部内容嵌入文档中的指定位置。此内容由外部应用程序或其他交互式内容源(如浏览器插件)提供。​​​​​​​

4、绕过思路

方法一:

你有FLASH插件

构造payload

md-end-block 复制代码
?arg01=a&arg02 onfocus=alert(1)

绕过成功!!!

方法二:

没有FLASH插件

将后端第十七关的代码(level17.php)指向的swf文件改为index.png

保存后再次打开十七关:

好大一张脸!!

接着我们构造payload进行绕过

?arg02= onclick=alert()

绕过成功!!!

本关小结:< embed >:外部内容嵌入元素与触发事件

第十八关:

1、输入代码进行测试:

看起来和17关差不多

2、查看网页源码

果然出现了embed:外部内容嵌入元素

看来解决思路和上一关基本相同

3、查看源码

4、绕过思路

直接测试一波过滤,构建Payload进行绕过

?arg02=" ' sRc DaTa OnFocus OnmOuseOver OnMouseDoWn P <sCriPt> <a hReF=javascript:alert()>;

还是html实体化函数

这一次我在FLASH中心浏览器进行测试,这个浏览器具备FALSH环境

?arg02= onmousedown=alert()

点击一下黑色embed标签区域:

绕过成功!!!

本关小结:FLASH插件

第十九关:

1、不管了,直接查看源码

2、绕过思路

又是embed,直接上上一关payload

?arg02= onmousedown=alert()

发现被双引号给闭合了

换个思路,使用javascript

?arg01=version&arg02=<a href="javascript:alert()">here</a>

绕过成功!!!

第二十关:

1、直接查看源代码

2、绕过思路

可见这里也有双引号闭合,没办法,直接构建palyoad

详细参考这篇文章:XSS-labs Level 20 Flash XSS_baynk的博客-CSDN博客

?arg01=id&arg02=xss\"))}catch(e){alert(1)}//%26width=123%26height=123
相关推荐
渗透测试老鸟-九青8 小时前
通过投毒Bingbot索引挖掘必应中的存储型XSS
服务器·前端·javascript·安全·web安全·缓存·xss
vortex58 小时前
蓝队基础之网络七层杀伤链:从识别到防御的全方位策略
安全·网络安全·蓝队
网安_秋刀鱼9 小时前
java组件安全
web安全·网络安全·1024程序员节
vortex510 小时前
HTTP 协议及内外网划分详解
网络·网络协议·http·网络安全
YAy1715 小时前
URLDNS链分析
学习·安全·web安全·网络安全·安全威胁分析
儒道易行17 小时前
【Pikachu】目录遍历实战
网络安全
冰水°20 小时前
3.1_文件上传漏洞
安全·网络安全·文件上传·条件竞争·.htaccess·文件上传绕过
Wh1teR0se21 小时前
[ACTF2020 新生赛]Upload 1--详细解析
web安全·网络安全