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
相关推荐
大方子1 天前
【PolarCTF】rce1
网络安全·polarctf
枷锁—sha1 天前
Burp Suite 抓包全流程与 Xray 联动自动挖洞指南
网络·安全·网络安全
聚铭网络1 天前
聚铭网络再度入选2026年度扬州市网络和数据安全服务资源池单位
网络安全
darkb1rd1 天前
八、PHP SAPI与运行环境差异
开发语言·网络安全·php·webshell
世界尽头与你1 天前
(修复方案)基础目录枚举漏洞
安全·网络安全·渗透测试
枷锁—sha2 天前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
liann1192 天前
3.1_网络——基础
网络·安全·web安全·http·网络安全
ESBK20252 天前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信
旺仔Sec2 天前
一文带你看懂免费开源 WAF 天花板!雷池 (SafeLine) 部署与实战全解析
web安全·网络安全·开源·waf
七牛云行业应用2 天前
Moltbook一夜崩盘:150万密钥泄露背后的架构“死穴”与重构实战
网络安全·postgresql·架构·高并发·七牛云