试着学了一下漏洞分析和复现,只能说有样学样吧,如果有错误希望大佬能指点一下
dedecms v5.7sp2后台存在任意文件上传
漏洞位置
直接上传文件即可。
漏洞利用
来看看漏洞位置,F12查看
漏洞分析
看位置,在/dede/filemanager_control.php
的112行开始文件上传,
可以看到,完全没有对文件名、文件类型等进行检查和过滤,导致可以直接上传文件
CVE-2019-8362
基本相同的位置,后台文件上传getshell。
漏洞位置
/dede/album_add.php
可以通过解压进行漏洞利用。
漏洞利用
首先,我们要先制作一个php文件,命名为xxx.jpg.php
,并进行压缩。
然后通过上面提到的文件式管理器上传到/upload/soft
上去。
进入album_add.php
,选择从zip压缩包中解压图片并选择刚刚上传的zip文件,
发布成功后,得到如下页面,点击预览文档
然后点击文件名即可跳转到文件路径
漏洞分析
刚刚已经分析过文件式管理的上传漏洞了。现在直接看album_add.php
直接定位到160行,开头包含了两个文件,分别是关于处理zip文件和文件管理的。
再到后面的$z->ExtractAll($zipfile,$tmpzipdir);
函数对文件进行解压缩并读取文件名操作,进入file_class.php
的FileManagement->GetMatchFiles
函数后,发现对文件名只进行是否有jpg|png|gif
的过滤,很容易就绕过了:
绕过之后后面都是对文件存放路径的操作,没有对文件名有更多的修改,于是就有了任意文件getshell
CVE-2018-9175
漏洞简述
后台写配置文件过滤不足导致写shell。
漏洞利用
http://test.dedecms57.com/dede/sys_verifies.php?action=getfiles&refiles[]=123&refiles[]=\%22;phpinfo();die();//
或是
http://test.dedecms57.com/dede/stepselect_main.php?action=addenum_save&ename=123&egroup=;phpinfo();//&islogin=1
漏洞分析
1
先来复现/dede/sys_verifies.php?action=getfiles&refiles[]=\%22;phpinfo();die();//
值得注意的是,在文件头就包括了一个config.php
,而config.php中又包含了/include/common_inc.php
文件,在这个文件中对所有外部参数进行了注册和过滤。然后跳转到86行执行CheckRequest
函数,在CheckRequst函数的最后一句又跳转到66行的_RunMagicQuotes
处。在该函数的最后一行,存在addslashes
,而addslashes的作用是在"
、'
、\
前添加反斜杠。此时我们的参数变成了这样:\\\";phpinfo();dire();//
然后到/dede/sys_verifiles.php
,在152行有当action=getfiles的参数处理。
在%网站根目录%/data/modifytmp.inc
中可以知道代码写入了如下内容:
,此时已经有php的文件头了。
继续向下,168行,对文件名进行了分割,效果如图:
再下面调用了一个$curdir = GetDirName($filename);
,跳到425行的函数声明处,
对filename进行了两次过滤,分别是对首次出现/
、\
或者两个交替出现的情况进行了一次过滤,然后再清除在/
后面的内容,匹配模式如图:
(图中的网站:https://regex101.com/)
再到177行,测试是否为目录,然后不管是否都把这玩意写入modifytmp.inc
中再闭合php文件尾,最后把这个用iframe组件(相当于当前网页里再打开一个指定大小的网页)展示出来,而我们前面的"
将$files[0]
这里闭合了,后面跟着我们写入的php语句,最后的//
被当成注释而将后面的";
都注释掉了。此时的modifytmp.inc
的内容是这样的:
1 |
|
将$files[0]这一行分开一下,
1 |
|
这样就看得很清楚了。
前面的过滤都还算挺齐全,但这个删除前三个字符的操作就让前面的都白搭了。
2
再来复现第二种/dede/stepselect_main.php?action=addenum_save&ename=123&egroup=;phpinfo();//&islogin=1
,在215行对action=”addenum_save”进行了处理,但是没有对参数进行任何过滤,直接可以把php语句存入sql中。
这里其实还有个漏洞,只要将ename和egroup调换位置,就可以进行任意文件写入。
原因在234行的WriteEnumsCache
函数,在/dede/enums_func.php
中的22行进行了定义,并且在36行可以看到,他对参数依然是没有处理,直接将其写入了/data/enums/$egroup.php
中。
只要对其进行闭合即可写入shell。
http://test.dedecms57.com/dede/stepselect_main.php?action=addenum_save&ename=';phpinfo();die();//&egroup=1234&islogin=1
需要注意的是,egroup一次没成功就需要换另一个名字,因为他会把后来的数据都存入这个文件中,而且数据还会存入sql中,再来一次不仅要把文件删除还要把sql中的数据删除,所以要换个名字。
只能说这是一个很鸡肋的洞,正常环境咋可能把data文件开放给你访问嘛
CNVD-2018-01221
漏洞位置
在tpl.php的251行,没有对文件名进行严格的过滤。
漏洞利用
1 | http://test.dedecms.com/dede/tpl.php?filename=(文件名随意).lib.php&action=savetagfile&content=%3C?php%20phpinfo();?%3E&token=f1ccc319d5c897a3a362335792a21e05(替换你复制的token) |
漏洞分析
首先,在common.inc.php中进行了一次全局过滤,对单引号等加了一次反斜杠
csrf_check()
函数在config.php的63行,它对token进行了检查,如果没有token他会直接退出,但在tpl.php
文件的154行,我们可以看到,token是被隐藏的,只要前端修改页面就可以获取token了。
往下看,这里有一个对filename
变量名的检查,需要以.lib.php
结尾,在这之后还对文件中addslashes添加的反斜杠进行了删除。
之后就直接进行了文件写入,造成了任意文件写入漏洞
CVE-2018-2129
漏洞位置
在/member/article_add.php
处的富文本编辑器中。
漏洞利用
有三个条件:
- 需要打开会员注册功能
- 必须为管理员权限(鸡肋)
- bp需要修改编码(不然会导致uploadsafe.inc.php的53行无法获取图片大小。)
抓包修改content-type为image/jpeg
并且将文件后缀改为.jpg.p*hp
漏洞分析
在select_images_post.php
文件开头,从cofig.php->commonc.inc.php,对外部变量进行了注册,然后再进入uploadsafeinc.php对图像文件进行了过滤:在33行对文件后缀进行了黑名单过滤,在51行对文件类型进行了白名单检查。
但主要漏洞点在select_images_post.php
的36行处的这一条语句:
$imgfile_name = trim(preg_replace("#[ \r\n\t\*\%\\\/\?><\|\":]{1,}#", '', $imgfile_name));
这里会将第一次匹配到的*
%
\
/
?
>
<
|
:
"
这些符号删除,也就是说.jpg.p?hp
、.jpg.p%hp
等等都可以成功绕过,而此时文件名如图:
然后在61行里,他会选择最后一个后缀作为文件后缀,如图
文件名也就会被拼接成php为后缀的文件,再加上response返回的地址,就造成了任意文件上传
任意用户文件删除
漏洞位置
漏洞点是可以对$litpic
进行变量覆盖,导致该变量被写入数据库中,在删除时调用了inc_batchup.php
的DelArv
函数进行文件删除。
漏洞利用
1
/member/article_add.php
发布一篇文章,内容随便,不用审核通过,然后抓包修改oldlitopic
参数
修改完之后删除该文章即可删除oldlitopic参数的文件
2
/member/album_add.php
发布图集,抓包添加formhtml和litpicname即可
删除图集即可删除相应的文件
漏洞分析
1
先来分析第一种,在article_edit.php
的57行,包含了一个/inc/archives_check_edit.php
,在该文件的92行会对$litpic
进行变量覆盖,然后在article_edit.php
的104行将其写入数据库中。
删除时,在/member/archives_do.php
的114行开始处理,在161行利用了一个/inc/inc_batchup.php
中的DelArc()
函数,在75行对$litpic
参数所指的文件进行了删除。
也就是说只要包含了archives_check_edit.php
的都可以通过传递参数$oldlitpic
进行变量覆盖以达到删除文件的目的。
2
第二个的漏洞点也是因为变量覆盖,在album_edit.php
100行和180行都有$litpic = $litpicname;
我们只要控制$litpicname
就行了
100行的添加formhtml
、litpicname
参数就会进入下面的if条件中,然后就可以进行变量覆盖。
3
这个是180行的,利用起来更简单,在修改图集的时候添加参数imgurl1为/aaa.txt
,这样就可以覆盖litpicname变量。
因为$formhtml
默认为0,所以会跳过94到103行,直接进入循环,而循环里的第一个条件是isset(${'imgurl'.$i})
,所以只要添加参数imgurl1
或imgurl2
······imgurl120
都可以。于是就会进入这里:
$litpicname
会被'$imgurl'.$i
覆盖,而$litpic
会被$litpicname
覆盖。也就是说我们控制了'$imgurl'.$i
就可以成功进行变量覆盖,然后写入数据库,然后在删除的时候就会删除litpic变量所指的文件了。
(其实这里本意还好,开发的本意我猜测为修改时如果添加了图片,则覆盖原图路径,且在删除时将该路径的文件进行删除,但对于参数的值没有控制好,所以导致任意文件删除)
(3可以说是我第一次没看其他文章,自行摸索出来的其他可利用的变量和漏洞利用,有一说一,爽的一笔)
任意修改前台用户密码
漏洞位置
在/member/resetpasswrod.php
的80行,存在弱类型比较。
漏洞利用
当用户未设置安全问题,且知道用户ID时,构造GET请求,/member/resetpassword.php?dopost=safequestion&safequestion=0x0&safeanswer=&id=8
,,id为用户ID。然后会提示跳转到http://test.dedecms57.com/member/resetpassword.php?dopost=getpasswd&id=8&key=xOyR3jcd
注意,现在这里要将amp;
删除,(http://test.dedecms57.com/member/resetpassword.php?dopost=getpasswd&id=8&key=xOyR3jcd
)然后即可跳转到修改密码的界面。
而且想要多次复现需要将member/inc/inc_pwd_functions.php
的153行的$tptim= (60*10);
改为$tptim= (0);
漏洞分析
在resetpassword.php
中的84行,存在弱类型比较,if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)
而在手册中显示
1 | 以下的东西被认为是空的: |
于是,我们构造safequestion=0x0
或0e0
、0e1
等即可绕过empty()
(这是我自己添加的一部分代码)从而达到相等然后即可通过弱类型比较。
之后会进行跳转,按照上面的要求进行修改即可
- 本文作者: Sn1pEr
- 本文链接: https://sn1per-ssd.github.io/2021/03/08/dedecms漏洞复现/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!