Web Security

跨站脚本攻击(XSS)

XSS (Cross-Site Scripting) 是一种安全漏洞,攻击者通过在网页中注入恶意脚本,窃取用户信息或执行其他恶意操作。

存储型 XSS

攻击者通过在网页中注入恶意脚本,窃取用户信息或执行其他恶意操作。

实际例子:

攻击者通过在评论区注入恶意脚本,攻击脚本会存储在服务器上,当其他用户访问该页面时,攻击脚本会被执行,窃取用户信息或执行其他恶意操作。

反射型 XSS

反射型 XSS 是指攻击者通过在 URL 中注入恶意脚本,当其他用户访问该 URL 时,恶意脚本会被执行,窃取用户信息或执行其他恶意操作。

实际例子:

网站搜索功能,搜索参数会显示在页面DOM中,那么攻击者就可以在搜索参数中注入恶意脚本,当其他用户访问该 URL 时,恶意脚本会被执行,窃取用户信息或执行其他恶意操作。 例如:https://example.com/?search=open+<script>alert('XSS')</script>

基于 DOM 的 XSS

常常出现于location.hrefdocument.write等操作中。

实际例子:

通过location.href获取hash值,然后通过document.write将hash值写入页面DOM中,当遇上http://example.com/#<script>alert('XSS')</script>时,恶意脚本会被执行。

mXSS (mutation-based XSS) 突变型 XSS

突变型 XSS 利用浏览器渲染机制,绕过安全检测和过滤,实现XSS攻击。

跨站请求伪造(CSRF)

查询参数篡改

主要出现在GET请求中,攻击者通过篡改查询参数,以链接形式诱导用户点击,实现CSRF攻击。

https://xxx.bank.com/transfer?toBankId=<hacked-bank-id>&amount=1000

替换GET的有效载荷

利用img标签的src属性,图像在加载时,会自动发起GET请求。

<img src="https://xxx.bank.com/transfer?toBankId=<hacked-bank-id>&amount=1000" width="0" height="0" border="0" />

大多数允许url的标签,都可以利用src属性,实现CSRF攻击。

利用video标签的src属性,实现CSRF攻击。

<!-- 视频通常会立即加载到DOM中 -->
<video width="1280" height="720" controls>
<source src="https://xxx.bank.com/transfer?toBankId=<hacked-bank-id>&amount=1000" type="video/mp4">
</video>

攻击具体步骤:

  1. 攻击者提交了一个链接至一个HTTP GET的img标签中。
  2. 用户访问了包含该img标签的页面。
  3. 用户以自己认证的身份发起了一次GET请求,请求参数中包含toBankId=<hacked-bank-id>&amount=1000
  4. 服务器以用户认证的身份cookie执行了向黑客转账操作,而用户对此毫不知情。

针对POST端点的CSRF攻击

常见于表单提交中,攻击者通过篡改表单参数,以链接形式诱导用户点击,实现CSRF攻击。

<form action="https://xxx.bank.com/transfer" method="POST">
<input type="hidden" name="toBankId" value="<hacked-bank-id>" />
<input type="hidden" name="amount" value="1000" />
<input type="text" name="username" value="username" />
<input type="password" name="password" value="password" />
<input type="submit" value="Transfer" />
</form>

攻击具体步骤:

  1. 攻击者在自己的站点上放置了一个包含该form标签的页面。
  2. 攻击者用邮件传播该Web页面。
  3. 用户访问了攻击者的Web页面,并填写了表单内容、提交。
  4. 发起的POST请求中,包含toBankId=<hacked-bank-id>&amount=1000username=usernamepassword=password
  5. 服务器以用户认证的身份cookie执行了向黑客转账操作,而用户对此毫不知情。

如何防御

使用Token验证、同源策略、CORS(跨域资源共享 Cross-Origin Resource Sharing)、Referer、SameSite属性等。

Referer是指请求头中的Referer字段,表示请求的来源URL,服务器可以通过Referer字段来判断请求是否来自合法的来源。

SameSite属性是指响应头中的Set-Cookie字段中的SameSite属性,用于限制Cookie的跨站请求策略。通常有三个值:StrictLaxNone

  • Strict:这意味着浏览器只在同站请求时发送cookie,即只有源自设置cookie的同一站点的请求才会发送cookie。如果请求来自不同的域名或协议(即使是相同的域名),具有SameSite=Strict属性的cookie都不会被发送。
  • Lax:这意味着在跨站请求中不会发送cookie,例如在加载图片或框架的请求中。但是,当用户从外部站点导航到源站点时(例如,当点击链接时),cookie会被发送。如果未指定SameSite属性,这是默认行为。
  • None:这意味着浏览器会在跨站请求和同站请求中都发送cookie。在设置这个值时,必须同时设置Secure属性,如下所示:SameSite=None; Secure。如果缺少Secure属性,将会记录一个错误

关于cookie设置

res.cookie('name', 'value', {
// 核心属性
domain: '.example.com', // Cookie 所属域名
path: '/', // Cookie 路径
expires: new Date(), // 过期时间
maxAge: 3600000, // 最大存活时间(毫秒)
// 安全属性
httpOnly: true, // 禁止 JavaScript 访问
secure: true, // 仅通过 HTTPS 传输
sameSite: 'strict', // 跨站点请求控制
// 其他属性
priority: 'high', // Cookie 优先级
partitioned: true // 分区 Cookie(新特性)
});

XML外部实体(XXE)

攻击者通过在XML文档中注入恶意实体,实现XXE攻击。

攻击具体步骤:

  1. 攻击者构造了一个包含恶意实体的XML文档。
  2. 攻击者将XML文档发送给服务器。
  3. 服务器解析XML文档,执行恶意实体中的代码,实现XXE攻击。

注入攻击

SQL注入

const sql = `SELECT * FROM users WHERE user_id = ${user_id}`;
const user_id = "1=1";
// 最终SQL语句变为:SELECT * FROM users WHERE user_id = 1=1
const executeSql = `SELECT * FROM users WHERE user_id = true`;
// 导致SQL查询了所有用户
const user_id = "123; UPDATE users SET password = 'hacked' WHERE user_id = 1";
// 导致SQL语句执行了更新操作,将用户1的密码更新为hacked

命令注入

攻击者通过在命令中注入恶意命令,实现命令注入攻击。

const command = `convert -d ... && rm -rf /videos`;
// 导致命令执行了convert -d ...操作,然后执行了rm -rf /videos操作,删除了所有视频文件

拒绝服务攻击(DoS)

ReDoS (Regular Expression Denial of Service)

/^((ab)*)+$/

“ababababababababababababababa” 会造成表达式引擎执行耗时增加,每增加一个ba字符串,执行时间增加一倍。

逻辑Dos

任何对服务器的逻辑操作,都可能导致DoS攻击。

  • 数据库写入
  • 文件系统操作,上传文件
  • 特定服务逻辑

DDos

通过大量请求,耗尽服务器资源,导致服务器无法正常工作。

第三方依赖漏洞攻击

CSP 防御

CSP (Content Security Policy) 是一种安全策略机制,通过设置 HTTP Header 来限制网页能够加载和执行的资源,用于防御XSS、点击劫持等攻击。

<!-- 设置 CSP 策略 -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://apis.example.com;">

MDN 文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP