网站地图    收藏   

主页 > 后端 > 网站安全 >

Ecmall某处SQL注入第五弹和一处能引入单引号的地

来源:自学PHP网    时间:2015-04-16 23:15 作者: 阅读:

[导读] 做完作业再看看0618补丁。非二次注入, 连载了这么多弹 有感情了。应该是最后一弹了, 看在是最后一弹了 也别再3rank了把。给高点把。一枚注入 另外一处能引入单引号或者转义符 不过也...

做完作业再看看0618补丁。
非二次注入, 连载了这么多弹 有感情了。
应该是最后一弹了, 看在是最后一弹了 也别再3rank了把。给高点把。
一枚注入 & 另外一处能引入单引号或者转义符 不过也就只能引入这个而已这里不太好利用。

首先还是把我之前发的ecmall的那两个先确认了来下撒?




刚在bbs下的20140618的补丁

0x01 能引入单引号或者转义符的地方

首先来看看my_goods.app.php中的 这函数
 

function _get_post_data($id = 0)
    {
        $goods = array(
            'goods_name'       => $_POST['goods_name'],
            'description'      => html_script($_POST['description']),
            'cate_id'             => $_POST['cate_id'],
            'cate_name'        => $_POST['cate_name'],
            'brand'                  => $_POST['brand'],
            'if_show'             => $_POST['if_show'],
            'last_update'      => gmtime(),
            'recommended'      => $_POST['recommended'],
            'tags'             => html_script(trim($_POST['tags'])),
        );
        $spec_name_1 = !empty($_POST['spec_name_1']) ? $_POST['spec_name_1'] : '';
        $spec_name_2 = !empty($_POST['spec_name_2']) ? $_POST['spec_name_2'] : '';



省略一点
 

case 2: // 二个规格
                $goods['spec_name_1'] = $spec_name_1;
                $goods['spec_name_2'] = $spec_name_2;
                foreach ($_POST['spec_1'] as $key => $spec_1)
                {
                    $spec_1 = trim($spec_1);
                    $spec_2 = trim($_POST['spec_2'][$key]);
                    if ($spec_1 && $spec_2)
                    {
                        if (($spec_id = intval($_POST['spec_id'][$key]))) // 已有规格ID的
                        {
                            $specs[$key] = array(
                                'spec_id'   => $spec_id,
                                'spec_1'    => $spec_1,
                                'spec_2'    => $spec_2,
                                'price'     => $this->_filter_price($_POST['price'][$key]),
                                'stock'     => intval($_POST['stock'][$key]),
                                'sku'       => html_script(trim($_POST['sku'][$key])),
                            );
                        }





主要来看这里的

$spec_2 = trim($_POST['spec_2'][$key]);

'sku' => html_script(trim($_POST['sku'][$key])),

这里$key带入到了后面 而且$key是post来的 所以是可控的。

如果这时候我们提交的是字符串 就成了截取字符的了。

因为' 会被ecmall的全局addslashes转义成\'

如果这时候截取第一个字符就成了\

截取第二个字符就是'



引入了转义符 如果 有两个连着的可控的话可以这样

'\','user()#' 之类的就能注入了 可惜这里只有一个可控。
 

$specs[$key] = array(
                                'spec_id'   => $spec_id,
                                'spec_1'    => $spec_1,
                                'spec_2'    => $spec_2,
                                'price'     => $this->_filter_price($_POST['price'][$key]),
                                'stock'     => intval($_POST['stock'][$key]),
                                'sku'       => html_script(trim($_POST['sku'][$key])),
                            );



这里spec_2 可以截取 无奈price被过滤了。

stock也可以截取 可是被intval了 sku 也可以截取可是已经是最后一个了。。

然后在edit中调用了这函数。


 

10.jpg





这里截取第2个字符 成功引入单引号。


 

11.jpg



截取第一个字符 成功引入转义符。







0x02 能成功的注入。。



首先来看一下ecmall的全局文件


 

}
        /* 数据过滤 */
        if (!get_magic_quotes_gpc())
        {
            $_GET   = addslashes_deep($_GET);
            $_POST  = addslashes_deep($_POST);
            $_COOKIE= addslashes_deep($_COOKIE);
        }



判断gpc是否开启 如果关闭 就调用addslashes_deep来对get post cookie进行转义


 

function addslashes_deep($value)
{
    if (empty($value))
    {
        return $value;
    }
    else
    {
        return is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value);
    }
}





这里可以看到对数组中的value进行了addslashes 没有对key进行addslashes。



在my_goods.app.php中



看这函数
 

function _edit_image($goods_id)
    {
        if (isset($_POST['old_order']))
        {
            foreach ($_POST['old_order'] as $image_id => $sort_order)
            {
                $data = array('sort_order' => $sort_order);
                if (isset($_POST['old_url'][$image_id]))
                {
                    $data['image_url'] = $_POST['old_url'][$image_id];
                }
                $this->_image_mod->edit("image_id = '$image_id' AND goods_id = '$goods_id'", $data);
            }
        }

        return true;
    }





对post的foreach 出来后 直接把post里的key 带入到了查询当中。



结合刚才说的数组中的key是不会被addslashes的 所以造成了注入。



调用这函数的地方随便找一处把。


 

12.jpg


 

修复方案:

过滤 转义

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论