首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MetInfo 版本XSS漏洞分析

1.1 分析环境准备

IDE:PhpStorm

MetInfo版本:6.1.2

Web环境:phpstudy集成环境

PHP版本:5.4.45

1.2 漏洞概述

漏洞类型:XSS漏洞

危险等级:中

CVE编号:CVE-2018-18374

利用条件:该漏洞需要管理员在登录状态下访问攻击者构造的恶意链接。

漏洞位置:head.php中的第20行echo输出语句

漏洞产生原因:echo输出的script标签代码中,anyid值由外部输入获得,且没有做很好过滤

受影响版本:全部版本

修复版本:无

1.3 漏洞复现

1.3.1 管理员登录管理后台

使用firefox访问localhost/met/admin/登录管理后台

图 1.1登录管理后台

1.3.2 管理员访问构造的恶意链接

使用firefox访问http://localhost/met/admin/index.php?lang=cn&anyid=47%3Cscript%3Ealert(1)%3C/script%3E&n=admin&c=admin_admin&a=doadd,触发漏洞

图 1.2触发漏洞

1.4 漏洞分析

1.4.1 漏洞代码分析

漏洞代码在app/system/include/public/ui/admin/head.php文件20行的echo输出语句中

图 1.3危险输出

阅读代码可知,anyid的内容将直接被输出到script标签中,变量值来自$_M['form']['anyid'],看下$_M['form']['anyid']变量值来源,在app/system/include/class/common.class.php中的load_form()方法里,可以看到$_COOKIE、$_POST、$_GET变量的key为$_M['form']的key,value需要经过daddslashes函数处理。

图 1.4 $_M[‘form’][‘anyid’]值来源

图 1.5 daddslashes过滤函数

第59行代码中,如果未定义"IN_ADMIN",会使用addslashes、sqlinsert函数对传入变量进行处理,如果定义"IN_ADMIN",只使用addslashes进行处理。全局搜索下IN_ADMIN的定义位置,在admin/index.php文件中有定义

图 1.6IN_ADMIN定义

我们就是从admin/index.php文件入口进行利用的,所以对于$_GET、$_POST、$_COOKIE传入的变量值只会进行addslashes处理。

1.4.2 回溯触发路径

此处使用PhpStorm xdebug调试方式进行动态调试。在app/system/include/public/ui/admin/head.php 19行设置断点

图 1.7head.php断点

管理员登录后台后访问http://localhost/met/admin/index.php?lang=cn&anyid=47%3Cscript%3Ealert(1)%3C/script%3E&n=admin&c=admin_admin&a=doadd,触发断点

图 1.8head.php断点触发

左下方为调用过程

图 1.9 命中head.php断点调用过程

在app/system/include/class/load.class.php的243行代码下断点,重新调试

图 1.10命中call_user_func

$newclass是一个类对象,我们F7跟踪call_user_func函数调用,进入admin_admin的doadd方法,类admin_admin存在构造函数,会调用父类的构造方法,父类为admin

类admin继承common类,查看common类,构造函数调用load_form方法,完成对$_M['form']赋值过程

我们再看下类admin的构造过程,其中有一步会调用check()方法,在此处下一断点,重新调试,并使用F7跟进该调用过程

图 1.14 check()方法

阅读代码可知,会从cookie中取metinfo_admin_name,met_info_admin_pass进行判断,若判断未通过,则重定向到登录页面。

图 1.15doadd方法断点

运行到39行F7步入

图 1.16template方法

发现template方法是用于模板寻址,此处我们寻址地址为template/admin_add.php。F8跳出,进入admin_add.php文件

图 1.17admin_add.php

第7行调用后进入head.php文件,触发漏洞执行

图 1.18漏洞触发

1.5 漏洞分析总结

当管理员登录后台后,通过url传递的参数值anyid不会经过sqlinsert函数过滤,只经过addslashes处理后就返回到前台页面script标签中。

提供另一个触发链接:http://localhost/met/admin/index.php?lang=cn&n=system&c=news&a=doindex&anyid=12%3Cscript%3Ealert(1)%3C/script%3E

1.6 修复方法

修改app/system/include/function/common.func.php的daddslashes方法,当IN_ADMIN为true时,对$string进行标签过滤

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181102G0NLPF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券