0%

Metinfo 6.x存储型XSS(CVE-2018-20486) 漏洞分析

安装漏洞环境:

漏洞复现:

poc:[Host]/admin/login/login_check.php?url_array[]=<script>alert(1)</script>&url_array[]=a

管理员登录后台-安全与效率,触发xss

漏洞分析:

粗略猜测:

引入了外部变量,直接修改了数据库该值

/MetInfo6.1.3/app/system/safe/admin/index.class.php

查询数据库发现被是加密后的字段:

解密后应该就是<script>alert(1)</script>


跟踪分析:

common.inc.php

1
2
3
4
5
6
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value,0,0,1);
$_M['form'][$_key]=daddslashes($_value,0,0,1);
}
}

这个时候,引入了外部变量_COOKIE,_POST, _GET

这个循环会遍历全局变量_COOKIE,_POST, _GET,然后对里面的值进行过滤,然后赋值到$_M[form]

进入循环之前,$_M变量的值为

结束循环时,出现了变量覆盖,$_M变量的值为

code mix with data.

login_check.php

payload经过authcode函数加密后.更新入了表met_config里的met_adminfile字段


攻击者将payload注入到数据库后,管理员访问后台的安全与效率,触发xss时发生了什么?

load_class.php 加载模块

加载了app/system/index/admin/下的index 类,调用里面的doindex函数

index 类继承了 admin

1
class index extends admin

admin 类继承了 common

common.class.php

common类 构造函数里面,加载了全站的配置数据

load_config_global函数,先读取了数据库的配置到$M全局数组中,

此时的met_adminfile还没解密

经过authcode解密函数后,

可以看到met_adminfile就是我们的payload

admin.class.php

执行check()函数:

将$M全局数组里的值赋给了$met_adminfile

加载页面:

先加载渲染了侧边栏、头部底部之后,最后才加载渲染/app/system/safe/admin/index.class.php


流程:

  • login_check.php 10行 包含了../include/common.inc.php

  • common.inc.php 79-84行,循环赋值给$M数组时产生了变量覆盖

  • login_check.php 13-18行,将payload加密后更新入了表met_config里的met_adminfile字段


others:

造成变量覆盖时使用的语法.

1
2
3
4
$hell="abc"; $$hell="def";等同于$abc="def"

$_request = _GET
$$_request = $_GET

这是个trick?


思考:

  • 善用搜索,加对断点可以加快跟踪调试的速度

  • 一开始粗略猜测,可以知道大体的思路

  • 对前端页面进行元素查看,也可以方便加断点,加快速度

refs: