### 简要描述:
PHPOK 输入过滤做的还是不错的,输入参数都做了 addslashes 转义; addslashes 在某些场景起不到安全防护作用,这里借PHPOK举个栗子。
### 详细说明:
getshell利用的是include方法过滤不严的缺陷,代码如下:
文件 framework/www/payment_control.php :submit方法
```
function submit_f()
{
$rs = $this->auth_check();
...
$payment = $this->get('payment','int');
...
// 取数据库表 qinggan_payment 的数据
$payment_rs = $this->model('payment')->get_one($payment);
// $payment_rs['code']即上述表 qinggan_payment 的code字段数据
$file = $this->dir_root.'payment/'.$payment_rs['code'].'/submit.php';
if(!is_file($file))
{
error(P_Lang('支付接口异常,请检查'),$error_url,'error');
}
// 包含$file文件
include_once($file);
```
include参数$file参数是可控的,来自于数据库表qinggan_payment的code字段,我们继续跟这个字段是否可控。
文件 framework/admin/payment_control.php : save方法
```
function save_f()
{
$gid = $this->get('gid','int');
// ($_GET或$_POST)外部传code值,会对敏感字符做addslashes
$code = $this->get('code');
$id = $this->get('id','int');
...
$data = array('title'=>$title,'code'=>$code,'gid'=>$gid);
...
// 数据存入db,上面的get方法传入的code值存入数据库表 qinggan_payment的code字段
$this->model('payment')->save($data,$id);
...
}
```
总结一下:get方法存入的code参数值存入DB,include方法从DB中取到code参数值;从而可以任意控制include的参数造成getshell。include文件名是 'payment/'.$payment_rs['code'].'/submit.php',我们需要截断掉submit.php,因为数据库code的长度是100,分隔符的方法是不行了,可以用%00截断。
这里说明一下%00字符不受addslashes影响的原因。%00会被转义为\0,不过在存入DB又变成%00,这种二次使用的场景无视GPC。
### 漏洞证明:
一、利用CSRF开启支付功能,并设置code为根目录的LICENSE文件:
http://127.0.0.1/phpok/admin.php?c=payment&f=save&code=../LICENSE%00&gid=1&title=1&status=1
二、到首页的“产品展示”下个单,然后到 个人中心 => 订单中心 => 支付,选择上面CSRF添加的支付方式触发可getshell
[<img src="https://images.seebug.org/upload/201412/0300511314b8d4648dfb76a90e7588188577b21a.png" alt="phpok.PNG" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/0300511314b8d4648dfb76a90e7588188577b21a.png)
暂无评论