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

2014-07-22T00:00:00
ID SSV:93399
Type seebug
Reporter Root
Modified 2014-07-22T00:00:00

Description

简要描述:

做完作业再看看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中调用了这函数。

<img src="https://images.seebug.org/upload/201407/21225104621a0c3521c8d901cfd9ef11f9fe3eb1.jpg" alt="10.jpg" width="600" onerror="javascript:errimg(this);">

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

<img src="https://images.seebug.org/upload/201407/212252056634264ea649cc40713c4ca2687a4da7.jpg" alt="11.jpg" width="600" onerror="javascript:errimg(this);">

截取第一个字符 成功引入转义符。 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 =&gt; $sort_order) { $data = array('sort_order' =&gt; $sort_order); if (isset($_POST['old_url'][$image_id])) { $data['image_url'] = $_POST['old_url'][$image_id]; } $this-&gt;_image_mod-&gt;edit("image_id = '$image_id' AND goods_id = '$goods_id'", $data); } } return true; }

对post的foreach 出来后 直接把post里的key 带入到了查询当中。 结合刚才说的数组中的key是不会被addslashes的 所以造成了注入。 调用这函数的地方随便找一处把。

<img src="https://images.seebug.org/upload/201407/21230418680851831dc6c5a34b0f9b04de17d63e.jpg" alt="12.jpg" width="600" onerror="javascript:errimg(this);">

漏洞证明:

见上面 。