Vulnerability-wiki

CWE 通用弱点分类

CWE(Common Weakness Enumeration,通用弱点分类) 是一个社区开发的软件安全漏洞和弱点分类列表。它为安全研究人员、开发者和分析师提供了统一的语言来讨论、识别和处理软件安全问题。


漏洞介绍

CWE 提供了一个标准化的框架来:

每个 CWE 条目包含:


原理分析

CWE 按照层次结构组织,从高层类别到具体实现:

  1. 视图(Views):不同视角的分类方式
    • 开发概念
    • 研究概念
    • 架构概念
    • 硬件设计
  2. 类别(Categories):相关弱点的集合
    • 缓冲区错误
    • 认证问题
    • 加密问题
    • 访问控制
  3. 弱点(Weaknesses):具体的安全问题
    • 代码级别的缺陷
    • 设计层面的缺陷
    • 架构层面的缺陷

利用方式

不同类型的 CWE 有不同的利用方式,以几个常见类型为例:

CWE-89:SQL 注入

// 不安全的代码示例
$query = "SELECT * FROM users WHERE id = '" . $_GET['id'] . "'";

利用方式:

  1. 输入 ' OR '1'='1
  2. 绕过认证或获取数据库内容

CWE-79:跨站脚本(XSS)

// 不安全的代码示例
element.innerHTML = document.location.hash.substring(1);

利用方式:

  1. 在 URL 中注入恶意 JavaScript 代码
  2. 窃取用户 cookie 或执行恶意操作

CWE-434:不受限制的文件上传

// 不安全的代码示例
move_uploaded_file($_FILES['file']['tmp_name'], '/uploads/' . $_FILES['file']['name']);

利用方式:

  1. 上传 PHP webshell
  2. 获取服务器控制权

防御思路

1. 开发阶段

防御措施 说明
安全编码标准 制定并遵循安全编码规范
代码审查 进行定期的安全代码审查
自动化测试 使用 SAST/DAST 工具进行测试
依赖管理 使用安全的第三方组件

2. 运行时防御

防御措施 说明
输入验证 验证所有外部输入
输出编码 对输出进行适当编码
访问控制 实施最小权限原则
错误处理 安全地处理和记录错误

真实案例分析

案例1:CWE-78 (OS 命令注入)

相关 CVE: CVE-2014-6271 (Shellshock)

# 漏洞代码
system("ping " + user_input);

影响: Apache、OpenSSH 等多个系统 修复: 使用参数化命令或禁止特殊字符

案例2:CWE-287 (认证不当)

相关 CVE: CVE-2017-5638 (Struts2)

// 漏洞代码
if(password.equals("admin123")) {
    grantAccess();
}

影响: 多个企业系统 修复: 使用安全的认证机制

案例3:CWE-200 (信息泄露)

相关 CVE: CVE-2014-0160 (Heartbleed)

// 漏洞代码
memcpy(bp, pl, payload);

影响: OpenSSL 修复: 添加长度检查和边界验证


常见 CWE Top 25

以下是 2024 年 MITRE 发布的 CWE Top 25 最危险软件漏洞,展示前十名的CWE细节:

排名 CWE ID 描述 典型场景 防御建议
1 CWE-79 跨站脚本(XSS) 在网页中注入恶意JavaScript代码 输入验证、输出编码、使用CSP
2 CWE-787 越界写入 缓冲区溢出,内存破坏 使用安全的字符串处理函数,边界检查
3 CWE-89 SQL注入 通过特殊字符篡改SQL查询 参数化查询,输入验证
4 CWE-352 跨站请求伪造 诱导用户执行非预期操作 使用CSRF Token,SameSite Cookie
5 CWE-22 路径穿越 访问受限目录外的文件 规范化路径,限制访问范围
6 CWE-125 越界读取 读取缓冲区外的数据 验证数组边界,安全的内存访问
7 CWE-78 OS命令注入 执行恶意系统命令 命令参数化,输入过滤
8 CWE-416 释放后使用 访问已释放的内存 避免悬空指针,正确管理内存
9 CWE-862 缺失授权 未经授权访问功能或资源 实施完整的访问控制机制
10 CWE-434 不安全的文件上传 上传恶意文件到服务器 验证文件类型和内容,限制权限

详细分析

1. CWE-79:跨站脚本(Cross-site Scripting)

描述:在页面中注入恶意JavaScript代码,在用户浏览器中执行。

示例代码

// 不安全示例
document.write("Welcome " + decodeURIComponent(location.search.substring(1))); 

// 安全示例
const text = document.createTextNode(decodeURIComponent(location.search.substring(1)));
document.body.appendChild(text);

2. CWE-787:越界写入(Out-of-bounds Write)

描述:写入数据超出了缓冲区边界,可能破坏相邻内存。

示例代码

// 不安全示例
char buffer[10];
strcpy(buffer, "This string is too long!");  // 缓冲区溢出

// 安全示例
char buffer[10];
strncpy(buffer, "Long str", sizeof(buffer)-1);
buffer[sizeof(buffer)-1] = '\0';

3. CWE-89:SQL注入(SQL Injection)

// 不安全示例
$query = "SELECT * FROM users WHERE username = '$_GET[username]'";

// 安全示例
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET['username']]);

4. CWE-352:跨站请求伪造(CSRF)

// 安全示例 if (hash_equals($_POST[‘csrf_token’], $_SESSION[‘csrf_token’])) { executeTransfer($_SESSION[‘user_id’], $to, $amount); }


#### 5. CWE-22:路径穿越(Path Traversal)
- **描述**:通过操作文件路径访问预期目录之外的文件。
- **示例代码**:
```php
// 不安全示例
include($_GET['template'] . ".php");

// 安全示例
$template = basename($_GET['template']);
include(realpath("/safe/templates/" . $template . ".php"));

6. CWE-125:越界读取(Out-of-bounds Read)

// 安全示例 if (index < sizeof(array)/sizeof(array[0])) { int value = array[index]; }


#### 7. CWE-78:OS命令注入(OS Command Injection)
- **描述**:将恶意系统命令注入到应用程序的shell命令中。
- **示例代码**:
```python
# 不安全示例
os.system('ping ' + user_input)

# 安全示例
import shlex
subprocess.run(['ping', shlex.quote(user_input)], shell=False)

8. CWE-416:释放后使用(Use After Free)

// 安全示例 char* ptr = new char[10]; delete[] ptr; ptr = nullptr; // 避免悬空指针


#### 9. CWE-862:缺失授权(Missing Authorization)
- **描述**:未对用户的操作进行适当的权限检查。
- **示例代码**:
```python
# 不安全示例
@app.route('/admin/delete_user/<id>')
def delete_user(id):
    db.delete_user(id)

# 安全示例
@app.route('/admin/delete_user/<id>')
@require_admin_permission
def delete_user(id):
    if current_user.can_manage_users():
        db.delete_user(id)

10. CWE-434:危险文件上传(Unrestricted File Upload)

// 安全示例 $allowed = [‘jpg’, ‘png’, ‘gif’]; $ext = pathinfo($_FILES[‘file’][‘name’], PATHINFO_EXTENSION); if (in_array($ext, $allowed)) { $new_name = uniqid() . ‘.’ . $ext; move_uploaded_file($_FILES[‘file’][‘tmp_name’], ‘uploads/’ . $new_name); } ```


工具与资源

工具/资源 说明
MITRE CWE 官方网站
NIST NVD 漏洞数据库
Snyk 依赖检查工具
SonarQube 代码质量检查

参考资料


📝 作者:Luhaozhhhe
📧 邮箱:15058298819@163.com
🏫 单位:Nankai University
📅 最后更新时间:2025-07-28