安装漏洞环境:
漏洞复现:
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.php
10行 包含了../include/common.inc.php
-
common.inc.php
79-84行,循环赋值给$M
数组时产生了变量覆盖
-
login_check.php
13-18行,将payload加密后更新入了表met_config
里的met_adminfile
字段
others:
造成变量覆盖时使用的语法.
1 | $hell="abc"; $$hell="def";等同于$abc="def" |
这是个trick?
思考:
-
善用搜索,加对断点可以加快跟踪调试的速度
-
一开始粗略猜测,可以知道大体的思路
-
对前端页面进行元素查看,也可以方便加断点,加快速度