level-1
http://127.0.0.1/xss/level1.php?name=%3Ca%20href=%22https://www.baidu.com%22%3Ebd%3C/a%3E
level1: 基础反射型 XSS
操作步骤:
在输入框输入:<script>alert(1)</script>
提交表单,页面立即弹出alert(1)。
原理:
漏洞点:输入直接嵌入 HTML 且未过滤<script>标签。
类型:反射型 XSS(非持久化,仅当前请求生效)。
风险:攻击者可注入任意 JavaScript 代码,窃取用户 Cookie 或执行其他操作。
str.没有进行过滤,所以直接打开hackbar点击xss辅助器,运行即可成功
或者直接在搜索框中输入:127.0.0.1/xss/level1.php?name=<script>alert(`1`)</script>
level-2
Level2: HTML 属性注入
操作步骤:
输入:"><script>alert(1)</script>
提交后页面弹出alert(1)。
原理:
漏洞点:输入被放入 HTML 属性(如value="")中,未对引号转义。
利用方式:用"闭合属性,再注入脚本标签。
防御:对用户输入进行 HTML 实体编码(如"转为")。
其中value值 多了一个双引号和> 所以在输入框中加入“> 则可以执行成功
源代码中的htmlspecialchare($str)用法
level-3
Lab3: 事件注入
操作步骤:
输入:' onclick='alert(1)
提交后点击输入框触发弹窗。
原理:
漏洞点:输入被放入 HTML 属性(如onclick='')中,未过滤单引号。
利用方式:用'闭合事件属性,注入 JavaScript 代码。
防御:禁止用户输入特殊字符(如'、"、<、>)。
level-4
Lab4: 双引号事件注入
操作步骤:
输入:" onclick="alert(1)
提交后点击输入框触发弹窗。
原理:
漏洞点:输入被放入双引号包裹的事件属性(如onclick="")中。
利用方式:用"闭合属性,注入 JavaScript 代码。
对比 Lab3:引号类型不同,需针对性构造 payload。
level-5
Lab5: 标签过滤绕过
操作步骤:
输入:"><a href="javascript:alert(1)">click me</a>
点击生成的链接触发弹窗。
原理:
防御机制:过滤了<script>标签。
绕过方式:使用合法标签(如<a>)配合javascript:协议执行代码。
风险:用户点击恶意链接时触发攻击。
level-6
Lab6: 大小写绕过
操作步骤:
输入:"><a Href="javascript:alert(1)">click me</a>
点击链接触发弹窗。
原理:
防御机制:过滤小写href。
绕过方式:利用 HTML 不区分大小写特性,使用大写Href。
防御建议:过滤时忽略大小写(正则匹配/href/i)。
level-7
Lab7: 双写绕过
操作步骤:
输入:"><a hhrefref="javasscriptcript:alert(1)">click me</a>
点击链接触发弹窗。
原理:
防御机制:过滤href和javascript。
绕过方式:双写被过滤的关键字(如hhrefref),过滤后恢复为合法语法。
防御建议:替换被过滤字符为空(如href→``)而非删除。
level-8
Lab8: Unicode 编码绕过
操作步骤:
输入:javascript:alert(1)的 Unicode 编码(如javascript:alert(1))
提交后页面执行 JavaScript。
原理:
防御机制:过滤javascript字符串。
绕过方式:使用 Unicode 编码(如j→j),浏览器会自动解码。
防御建议:解码用户输入后再进行过滤。
level-9
Lab9: 协议过滤绕过
操作步骤:
输入:javascript:alert(1)//http://example.com
提交后页面执行 JavaScript。
原理:
防御机制:检查 URL 是否以http开头。
绕过方式:在javascript:后添加//和合法域名,利用注释截断后续内容。
防御建议:严格校验协议,仅允许http/https。
level-10
Lab10: 隐藏输入框注入
操作步骤:
输入:t_sort=" onmouseover='alert(1)' type="text
鼠标悬停在输入框上触发弹窗。
原理:
漏洞点:输入被放入隐藏输入框的name属性(如<input type="hidden" name="t_sort">)。
利用方式:注入onmouseover事件,并将type改为text使输入框可见。
防御:避免直接将用户输入作为 HTML 属性名。