NewZhan CMS sql注入漏洞¶
一、漏洞简介¶
二、漏洞影响¶
NewZhan CMS 商业版 2.4.1
NewZhan CMS 个人版 2.6.3
三、复现过程¶
漏洞分析¶
数据库操作函数对传入的数组仅仅对value进行了转义处理,并没有把key考虑在内,前台控制器可以通过提交POST 控制key进行注入。 db_mysql.class.php
public function update($key, $data) {
list($table, $keyarr, $keystr) = $this->key2arr($key);
$s = $this->arr2sql($data);
return $this->query("UPDATE {$this->tablepre}$table SET $s WHERE $keystr LIMIT 1", $this->wlink);
}
private function key2arr($key) {
$arr = explode('-', $key);
if(empty($arr[0])) {
throw new Exception('table name is empty.');
}
$table = $arr[0];
$keyarr = array();
$keystr = '';
$len = count($arr);
for($i = 1; $i < $len; $i = $i + 2) {
if(isset($arr[$i + 1])) {
$v = $arr[$i + 1];
$keyarr[$arr[$i]] = is_numeric($v) ? intval($v) : $v;
// 因为 mongodb 区分数字和字符串
$keystr .= ($keystr ? ' AND ' : '').$arr[$i]."='".addslashes($v)."'";
} else {
$keyarr[$arr[$i]] = NULL;
}
}
if(empty($keystr)) {
throw new Exception('keystr name is empty.');
}
return array($table, $keyarr, $keystr);
}
审计发现前台商品管理控制器有$POST 数据传入update($data)可以触发SQL 注入