PHPOK结合CSRF(GET型) - GETSHELL

2014-12-03T00:00:00
ID SSV:94634
Type seebug
Reporter Root
Modified 2014-12-03T00:00:00

Description

简要描述:

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);">