DVWA Vulnerability: Cryptography Problems
字数 1045 2025-08-30 06:50:35
DVWA Cryptography 漏洞教学文档
概述
DVWA (Damn Vulnerable Web Application) 的 Cryptography 模块主要演示了与加密算法相关的安全漏洞,特别是在实现加密功能时常见的错误。本教学文档将详细分析从 Low 到 Impossible 四个难度级别的加密漏洞及其利用方法。
Low 级别漏洞分析
核心加密函数
Low 级别使用了 XOR 异或加密算法,关键代码如下:
function xor_this($cleartext) {
$key = "wachtwoord";
$ciphertext = "";
for($i=0; $i<strlen($cleartext); $i++) {
$ciphertext .= $cleartext[$i] ^ $key[$i % strlen($key)];
}
return $ciphertext;
}
加密流程
- XOR 加密:message 与 key 进行 XOR 处理,生成二进制数据
- Base64 编码:为了可读性,将二进制数据转换为 Base64 形式
漏洞利用
- 拦截的密文是 Base64 编码的
- 需要先解码 Base64 字符串
- 使用
xor_this()函数与密钥 "wachtwoord" 进行解密
解密方法
$ciphertext = base64_decode($intercepted_ciphertext);
$cleartext = xor_this($ciphertext); // 使用相同的 XOR 函数解密
Medium 级别漏洞分析
核心解密函数
Medium 级别使用了 AES-128-ECB 加密模式:
function decrypt($token) {
$key = "ik ben een aardbei";
return openssl_decrypt(hex2bin($token), 'AES-128-ECB', $key);
}
漏洞利用步骤
- 解密密钥已知:
$key = "ik ben een aardbei" - 解密后的数据是 JSON 格式
- 修改 JSON 中的关键字段:
- 将
user的值改成 "sweep" - 将
exp时间戳的值改成有效值或 9999999999 - 将
level的值改成 "admin"
- 将
- 重新加密修改后的 JSON 生成新的 token
示例 token
3061837c4f9debaf19d4539bfa0074c1fa6cb95f192bdcf6d22c9c4d4b8faacd837d1e6b16bfae07b776feb7afe57630f950edda1fda24d2f7ffdf17b0d4da31
High 级别漏洞分析
关键发现
- 提交表单后发现引用了
token_library_high.php文件 - 在源代码中找到密钥
- 加密使用了更复杂的方式
示例 token
{
"token": "uN4N+V73wdXa+qowB7cc3A==",
"iv": "MTIzNDU2NzgxMjM0NTY3OA=="
}
漏洞利用步骤
- 解密 token
- 将
userid改成 1(管理员 ID) - 重新加密生成新的 token
- 使用新 token 登录
Impossible 级别
Impossible 级别实现了安全的加密方案,没有明显的可利用漏洞。
总结与防御建议
常见加密漏洞
- 使用弱加密算法:如 XOR 加密
- 硬编码密钥:密钥直接写在代码中
- 使用不安全的加密模式:如 ECB 模式
- 缺乏完整性验证:允许修改加密数据
防御措施
- 使用强加密算法(如 AES-256)
- 使用安全的加密模式(如 CBC 或 GCM)
- 密钥安全存储,不要硬编码
- 添加消息认证码(MAC)确保数据完整性
- 使用随机 IV 值
- 实施适当的密钥轮换机制
附录:加解密代码示例
XOR 加解密示例
function xor_encrypt_decrypt($input, $key) {
$output = '';
for($i=0; $i<strlen($input); $i++) {
$output .= $input[$i] ^ $key[$i % strlen($key)];
}
return $output;
}
AES 加解密示例
// 加密
function aes_encrypt($data, $key) {
$iv = openssl_random_pseudo_bytes(16);
$ciphertext = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($iv . $ciphertext);
}
// 解密
function aes_decrypt($input, $key) {
$input = base64_decode($input);
$iv = substr($input, 0, 16);
$ciphertext = substr($input, 16);
return openssl_decrypt($ciphertext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
}