Dedecms通杀重装漏洞的一次分析

2013-07-20 16:07:32 6 4951
漏洞发布原地址:http://www.cnseay.com/2956/
漏洞出现在index.php.bak,值得一提的是名字是index.php.bak,如果是apache,就能当做php执行,所以给了我我们下手的机会

部分代码分析:
...
$insLockfile = dirname(__FILE__).'/install_lock.txt';//初始化$insLockfile,防止register_globals= on,初始化的值是“目录/install_lock.txt”
....
if(file_exists($insLockfile))
/*file_exists() 函数检查文件或目录是否存在。如果指定的文件或目录存在则返回 true,否则返回 false
也就是说我们要想办法让他变成false原因是因为true就会执行exit函数,exit函数的特点就是输出字符串,然后就会停止执行下面的代码,也就相当于结束,而下面的命令是重装的相关代码,所以要想办法让file_exists($insLockfile)返回假
关键变量$insLockfile已经初始化,那么只能找办法覆盖*/
{
    exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!");
}
关键代码分析
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
    foreach($$_request as $_k => $_v)
{
${$_k} = RunMagicQuotes($_v);
}
}
直接说明有点难说明,所以先给出上个相关这部分的exp:http://url/dedecms/install/index.php.bak?insLockfile=xxx
让我们看看它是如何工作的:
我们用get方式对insLockfile进行赋值,但是这个变量已经初始化,所以这个exp目的不是为了给insLockfile赋值,那是为了什么呢?
看看这段代码的工作流程吧
foreach作用:http://www.php.net/manual/zh/control-structures.foreach.php
可变变量:http://www.php.net/manual/zh/language.variables.variable.php
foreach(Array('_GET','_POST','_COOKIE') as $_request)//第一次循环,$_request=array[0]也就是"_GET"了
{
    foreach($$_request as $_k => $_v)
/*什么意思呢?foreach不说了,说里面的,$$_request 把值赋给$_v,“$$_request”是个可变变量,根据上面$_request的值,得出$$_request=$_GET把值代入代码中得出
foreach($_GET as $_k => $_v)
根据多次尝试,用get方式发送a=b,$_GET会吧a作为下标(键),b作为值(键值),所以此时$_k=“insLockfile”,$_v=“xxx”,但是还是没有当成一个命令来执行,继续看下面这那段代码
*/
{
${$_k} = RunMagicQuotes($_v);
/*又是一个可变变量,
把上面的值都带入进去得${insLockfile} = RunMagicQuotes(“xxx”);
也就是$insLockfile = RunMagicQuotes(“xxx”);
哈哈,没错我们的exp(http://url/dedecms/install/index.php.bak?insLockfile=xxx)相当于让dedecms执行了$insLockfile = RunMagicQuotes(“xxx”);
这段关键的覆盖变量的代码貌似还是防注入的,哈哈RunMagic貌似是魔术引号的修改版,如果是的话就执行这段代码$insLockfile =“xxx”
*/
}
}
利用exp,执行了相当于把$insLockfile的值它改为"xxx"的代码,把它带入重装判断代码if(file_exists(“xxx”)),不走运的话真的有这个目录存在,一般的人的话就开始重装了,然后dede的密码什么的就能重置了
但是我还是有个问题的哈,就是在没覆盖之前就执行了判断是否重装的命令,后面的代码不执行了,谈不上掩盖了,这是为什么?

关于作者

blackday8篇文章60篇回复

评论6次

要评论?请先  登录  或  注册