在wooyun上看到了有人提了PHPAPP的漏洞: http://wooyun.org/bugs/wooyun-2010-055604,然后去官网看了看,前几天刚有更新,就在官网下了PHPAPP最新的v2.6来看看(2014-12-11更新的)。
PSOT注入点:wwww.xxx.com/member.php?action=1&app=43&cid=2&rid=-1, 存在漏洞的文件在/phpapp/apps/refund/member_phpapp.php
审核大大,这里说明一下,前面提交了一个漏洞(http://wooyun.org/bugs/wooyun-2014-088699),和本漏洞存在于同一个文件,但是1、URL不同;2、对参数rid的要求不同:一个是要大于0,一个要求小于0;3、SQL语句不同:一个是Update注入,一个是Insert注入;4:注入参数不同:一个是sellercontent,一个是buyercontent,这应该不能算是重复吧。
下面分析一下漏洞产生的原因
第一处绕过:
先看看是如何得到$_POST中的内容的,$this->POST=$this->POSTArray();如果key的最后一个字母是’_s’时,用户的输入会经过str方法的防注处理。而如果key(参数)的最后一个字母不是’_s’,则可以功能绕过过滤!
第二处绕过:
看到了这句(条件是$this->rid>0不成立,而这个参数用户可控)$this->rid=$this->Insert('refund_money',$this->POST,array('buyeruid'=>$consumearr['buyeruid'],'selleruid'=>$consumearr['selleruid'],'tid'=>$consumearr['tid'],'cid'=>$consumearr['cid'],'oid'=>$consumearr['oid'],'buyerphoto'=>$photoid,'dateline'=>$this->NowTime(),'process'=>1));把整个post的内容带入了Insert方法,再去看看Insert方法,/phpapp/apps/core/class/mysql_class_phpapp.php
Insert代码防注分析:
1、通过GetMysqlFieldArray方法获取数据表的所有字段名及每个字段对应的属性;
2、判断用户post的内容中的key是否是数据表中的字段名,防止了key的注入;
3、通过dataTypeConvert方法把用户提交的数据按数据表中各字段的类型进行防注转换。
如果以上每一步的代码都正确实现了的话,应该是没有办法注入的,但是这里的第3步中,也就是dataTypeConvert方法的实现时有疏忽,看下面代码。
只对int、real、timestamp做了处理,其他的类型这里没有处理。
绕过方法:
在提交http请求时,可以提交其他类型的参数,但其他参数必须是数据表(phpapp_refund_money)中的字段,且类型不是int、real、timestamp的参数。
测试时请保证自己的账号有可退款的订单,现实情况是很容易满足的。
下面以sellercontent为例进行证明:
Phpapp可以显错,那就用error-based blind进行注入。
Pyload:(POST提交)
注入成功,管理员用户名及密码如下图中所示: