X CMS 全版本 SQL注入(0day)

NewZhan CMS 全版本 SQL注入(0day)

newzhan cms 是一个虚拟商品交易系统,前段时间在渗透测试目标的时候正好遇到了,由于该系统源码收费就从网上找了个以前的版本审计了一下,发现了几处前台SQL 注入漏洞,最新版本验证目前漏洞仍然存在,端午佳节权当节日福利分享给大家。

image-20200625230550190

漏洞详情

数据库操作函数对传入的数组仅仅对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 注入

image-20200625224324960

POC:

本地在线测试:

image-20200625230232488
image-20200625225920668
image-20200625230030146

官网Demo测试:

image-20200625230324492

最后再送给大家一个SQL注入WAF绕过的PDF文档作为端午节礼物,原文之前已经发到了先知

image-20200625231129995

WAF绕过之SQL注入.pdf (2.5 MB)

4 个赞

感谢分享

求一下师傅的mysql监控工具 :grinning:

求一下师傅的源码下载地址

这个是团队开发的辅助工具过段时间应该要公开

只有以前的版本,最新版本没搞到,https://pan.baidu.com/s/122wQJstxT9I3vvZE463NFg

师傅,如果公开能不能at下我。谢谢师傅了

是不是贴错代码了? )是不是应该贴$this->arr2sql? 这个类方法的处理过程?

第一步调用update 是贴的这个update吗? :smile:

我扫了一下这个cms,不能完全准确揪出你这个洞,反射太多了,这个cms本身的source R函数 也很奇怪,需要做别名分析,这个cms也没有namespace标准,感觉很乱。

嗯,对是这个函数,少贴了,不是这个update,贴的代码是数据库最终操作的函数,调用栈很浅很简单就没贴了,其实他数据库增删改查函数都只是对value做了处理,前台这个update触发点更容易发现

	private function arr2sql($arr) {
		$s = '';
		foreach($arr as $k=>$v) {
			$v = addslashes($v);
			$s .= "$k='$v',";
		}
		return rtrim($s, ',');
	}
2 个赞