前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2019-6707 CVE-2019-6708分析

CVE-2019-6707 CVE-2019-6708分析

作者头像
安恒网络空间安全讲武堂
发布2019-03-08 16:48:19
5740
发布2019-03-08 16:48:19
举报
文章被收录于专栏:安恒网络空间安全讲武堂

前言

phpshe最新1.7版本的后台sql注入分析。

官网:http://www.phpshe.com/

实验环境

CVE-2019-6707

在后台批量上下架操作中存在注入。

分析

我们先根据路由查看源码,抓包拿到操作的路径

代码语言:javascript
复制
POST /phpshe/admin.php?mod=product&act=state&state=1&token=c04c2e7a55d84759c0e09eb54b16fccf

定位admin.php:86

代码语言:javascript
复制
if (in_array("{$mod}.php", pe_dirlist("{$pe['path_root']}module/{$module}/*.php"))) {
    include("{$pe['path_root']}module/{$module}/{$mod}.php");
}
pe_result();
?>

此时引入了admin模型中的product.php

在switch中找到state分支

代码语言:javascript
复制
case 'state':
        pe_token_match();
        $product_id = is_array($_p_product_id) ? $_p_product_id : $_g_id;
        if ($db->pe_update('product', array('product_id'=>$product_id), array('product_state'=>$_g_state))) {
            pe_success("操作成功!");
        }
        else {
            pe_error("操作失败...");
        }
    break;

如果提交的pproductid是一个数组的话会直接进入db->peupdate操作中。没有任何过滤防护措施。

继续跟进db->pe_update,在db.class.php:226

代码语言:javascript
复制
public function pe_update($table, $where, $set)
    {
        //处理设置语句
        $sqlset = $this->_doset($set);
        //处理条件语句
        $sqlwhere = $this->_dowhere($where);
        return $this->sql_update("update `".dbpre."{$table}` {$sqlset} {$sqlwhere}");
    }

peupdate会将参数抛向sqlupdate,继续跟进一下,

代码语言:javascript
复制
public function sql_update($sql)
    {
        if ($this->query($sql) == true) {
            $result = $this->affected_rows();//affected_rows()是获取insert/update/delete结果集条数。
            return $result == 0 ? true : $result;
        }
        return 0;       
    }

此时我们从product_id传上的数据会被直接拼接在语句中执行。

构造一个POST包进行测试,由于没有回显,我们进行延时

成功延时,网站对传入的product_id没有过滤处理造成了时间盲注。

之后继续审计发现

代码语言:javascript
复制
case 'tuijian':
        pe_token_match();
        foreach ($_p_product_id as $v) {
            $result = $db->pe_update('product', array('product_id'=>$v), array('product_istuijian'=>$_g_tuijian));
        }
        if ($result) {
            pe_success("操作成功!");
        }
        else {
            pe_error("操作失败...");
        }

不仅 state 分支,tuijian order move分支均没有对$product_id进行处理。

均存在注入点

CVE-2019-6708

在管理页面订单处

定位到order.php

这里依旧采取了一个语句的拼接

然后sqlwhere进入peselectall方法

继续跟进pe_selectall方法

代码语言:javascript
复制
public function pe_selectall($table, $where = '', $field = '*', $limit_page = array())
    {
        //处理条件语句
        $sqlwhere = $this->_dowhere($where);
        return $this->sql_selectall("select {$field} from `".dbpre."{$table}` {$sqlwhere}", $limit_page);
    }

看到此方法依然没有对语句的过滤处理就直接执行。

回到后台页面,进入订单页面。

之后进入wsend分支

代码语言:javascript
复制
http://127.0.0.1/phpshe/admin.php?mod=order&state=wsend

在state处进行注入

成功延时。可进行时间盲注。

如果wsend分支中有订单存在,同样可以进行bool盲注。

见下面两图

我们对比user.php和admin.php中对订单查询的处理

user.php多了一层对gstate的过滤,admin.php则没有这个操作。

继续审计发现在orderpay页面中,同样没有对g_state进行过滤就直接拼接。

同样存在注入,payload如下

代码语言:javascript
复制
http://127.0.0.1/phpshe/admin.php?mod=order_pay&state=wpay%27and%201=1%20--%201
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • CVE-2019-6707
      • 分析
    • CVE-2019-6708
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档