xss-labs

level2

先用基础payload:

1
<script>alert(1)</script>

image-20250722085147571

查看网页源码:

说明服务端对用户输入做了转义(< 变成了 &lt

查看题目源代码:

发现

1
htmlspecialchars($str)  

能将一些特殊的 HTML 字符转换为 HTML 实体

字符 转换为
& &amp;
< &lt;
> &gt;
" &quot;
' &#039; (当 ENT_QUOTES 被设置时)
&nbsp;

我们可以直接闭合input标签进行绕过

1
"><script>alert(1)</script>

level3

还是先用:

1
<script>alert(1)</script>

image-20250722161825067

查看网页源代码:

发现表单内的和h2标签的都被转义了

查看源代码:

1
2
3
4
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />

单引号虽然存在实体&apos但是不被转义(未设置ENT_QUOTES),HTML5中预留但是也不推荐使用

先闭合value,再引入鼠标事件的属性(最常与 <input><select><a> 标签一起使用):
onclick onfocus onmouseover onmouseout

再闭合javascript伪协议来执行

1
2
3
4
' onclick=javascript:alert(1) ' //点击input标签时
' onfocus=javascript:alert(1) ' //聚焦input标签时
' onmouseover=javascript:alert(1) ' //进入input标签时
' onmouseout=javascript:alert(1) ' //移出input标签时

总结:onfocus可以绕过html实体化(即<>号的过滤)

level5

依旧<script>alert(1)</script>开局,script变成scr_ipt,再试试鼠标事件,on变成o_n

image-20250725160659820

源代码:

image-20250725161100507

过滤了js的标签还有onfocus事件,虽然str_replace不区分大小写,但是有小写字母转化函数,所以就不能用大小写法来绕过过滤了,只能新找一个方法进行xss注入

这里可以使用<a>标签的href属性

payload:

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

点击链接就可以了

level6

这题替换的关键字比上题多,但是没有添加小写转化函数,我们可以采用大小写绕过

level7

image-20250725170356211

不难发现,这里面进行了小写转化,将检测出来的on,script,href,src和data给删掉了,但是我们可以利用双写来绕过

比如下面这个payload:

1
"><scriscriptpt>alert(1)</scriscriptpt>

level8

image-20250725171040279

是把传入的字符串进行转小写之后进行一系列过滤操作,最后将字符写入a标签的href属性中,跳转链接

我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议

1
javascript:alert()

image-20250725172151118

利用在线工具进行Unicode编码后得到

1
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;

总结: href属性自动解析Unicode编码

level9

image-20250725173339806

下面多了个strpos()函数的验证,输入字符串必须包含http://

payload1:

http://用注释符注释掉否则会执行不了无法弹窗

1
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;/* http:// */

payload2:

http://写在alert内

1
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert('http://')

总结:插入指定内容(本关是http://)绕过检测

level10

这里有隐藏的传参方法,如果没有后端代码,就查看页面源代码一个一个测,这里是get传参t_sort,并过滤掉了<>号,不能闭合插入标签,但是我们还能用onfocus事件,因为这里输入框被隐藏了,需要添加type="text",构造payload:

1
?t_sort=" onfocus=javascript:alert() type="text

这里input标签内将会出现两个type属性,浏览器通常会判定第一个出现的值作为最终的值

level11

先看参数t_sort,想通过覆盖type属性的值就要闭合双引号,就会被转义,是行不通的,那就通过t_ref参数,修改ref头来进行xss

level15

image-20250725221316267

其中:

1
<span class="ng-include:'.htmlspecialchars($str).'">

ng-include类似于php的文件包含

ng-include 指令用于包含外部的 HTML文件,包含的内容将作为指定元素的子节点,ng-include 属性的值可以是一个表达式,返回一个文件名,默认情况下,包含的文件需要包含在同一个域名下

特别值得注意的几点如下:

  • ng-include,如果单纯指定地址,必须要加引号
  • ng-include,加载外部html,script标签中的内容不执行
  • ng-include,加载外部html中含有style标签样式可以识别
  • ng-inclue,记载外部html中的link标签可以加载

我们先试试看包涵第一关,构建payload:

1
?src='/level1.php'

image-20250725222133231

注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a><input><img><p>标签等等,这些标签是能需要我们手动点击弹窗的

1
2
3
4
?src='level1.php?name=<a href='javascript:alert(1)'>xss</a>'//错误的,自己看着点单双引号
?src='level1.php?name=<a href="javascript:alert(/xss/)">'//正确的
?src='level1.php?name=<img src=1 onerror=alert(1)/>'//错误的,不要加'/'
?src='level1.php?name=<img src=1 onerror=alert(1)>'//正确的

总结:ng-include文件包涵,可以无视html实体化

level16

image-20250725224923234

script /转化为空格的html实体化形式,可以用回车的URL编码%0a代替空格绕过,再配合上不用/的<img><svg>等标签

payload:

1
?keyword=<img%0asrc=1%0aonerror=alert(1)>

参考:
XSS-potatowo

xss-labs靶场实战全通关详细过程(xss靶场详解)


猫猫🐱



© 2025 子非鲲 使用 Stellar 创建
共发表 44 篇 Blog · 总计 109.6k 字