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进行标签过滤
领取专属 10元无门槛券
私享最新 技术干货