安装漏洞环境:

漏洞复现:
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 | foreach(array('_COOKIE', '_POST', '_GET') as $_request) { |
这个时候,引入了外部变量_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.php10行 包含了../include/common.inc.php

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

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

others:
造成变量覆盖时使用的语法.
1 | $hell="abc"; $$hell="def";等同于$abc="def" |
这是个trick?
思考:
-
善用搜索,加对断点可以加快跟踪调试的速度
-
一开始粗略猜测,可以知道大体的思路
-
对前端页面进行元素查看,也可以方便加断点,加快速度