CWE(Common Weakness Enumeration,通用弱点分类) 是一个社区开发的软件安全漏洞和弱点分类列表。它为安全研究人员、开发者和分析师提供了统一的语言来讨论、识别和处理软件安全问题。
CWE 提供了一个标准化的框架来:
每个 CWE 条目包含:
CWE 按照层次结构组织,从高层类别到具体实现:
不同类型的 CWE 有不同的利用方式,以几个常见类型为例:
// 不安全的代码示例
$query = "SELECT * FROM users WHERE id = '" . $_GET['id'] . "'";
利用方式:
' OR '1'='1// 不安全的代码示例
element.innerHTML = document.location.hash.substring(1);
利用方式:
// 不安全的代码示例
move_uploaded_file($_FILES['file']['tmp_name'], '/uploads/' . $_FILES['file']['name']);
利用方式:
| 防御措施 | 说明 |
|---|---|
| 安全编码标准 | 制定并遵循安全编码规范 |
| 代码审查 | 进行定期的安全代码审查 |
| 自动化测试 | 使用 SAST/DAST 工具进行测试 |
| 依赖管理 | 使用安全的第三方组件 |
| 防御措施 | 说明 |
|---|---|
| 输入验证 | 验证所有外部输入 |
| 输出编码 | 对输出进行适当编码 |
| 访问控制 | 实施最小权限原则 |
| 错误处理 | 安全地处理和记录错误 |
相关 CVE: CVE-2014-6271 (Shellshock)
# 漏洞代码
system("ping " + user_input);
影响: Apache、OpenSSH 等多个系统 修复: 使用参数化命令或禁止特殊字符
相关 CVE: CVE-2017-5638 (Struts2)
// 漏洞代码
if(password.equals("admin123")) {
grantAccess();
}
影响: 多个企业系统 修复: 使用安全的认证机制
相关 CVE: CVE-2014-0160 (Heartbleed)
// 漏洞代码
memcpy(bp, pl, payload);
影响: OpenSSL 修复: 添加长度检查和边界验证
以下是 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 | 不安全的文件上传 | 上传恶意文件到服务器 | 验证文件类型和内容,限制权限 |
描述:在页面中注入恶意JavaScript代码,在用户浏览器中执行。
示例代码:
// 不安全示例
document.write("Welcome " + decodeURIComponent(location.search.substring(1)));
// 安全示例
const text = document.createTextNode(decodeURIComponent(location.search.substring(1)));
document.body.appendChild(text);
描述:写入数据超出了缓冲区边界,可能破坏相邻内存。
示例代码:
// 不安全示例
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';
// 不安全示例
$query = "SELECT * FROM users WHERE username = '$_GET[username]'";
// 安全示例
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET['username']]);
// 安全示例 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"));
// 安全示例 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)
// 安全示例 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)
// 安全示例 $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