做完作业再看看0618补丁。 首先还是把我之前发的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中调用了这函数。
这里截取第2个字符 成功引入单引号。
截取第一个字符 成功引入转义符。 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的 所以造成了注入。 调用这函数的地方随便找一处把。
修复方案:过滤 转义 |
-
上一篇: qibocms多个系统因为补丁而造成的注入 - 网站安全
下一篇: 投注网伪静态sql注入、短信轰炸、前端绕过 - 网
还没有人抢沙发呢~