MetInfo 6.1.3 XSS漏洞分析

0x01 分析环境准备

IDE:Phpstrom
MetInfo版本:6.1.3
Web环境:phpStudy环境
PHP版本:5.4.45

0x02 漏洞概述

漏洞类型:XSS漏洞
危险等级:中
CVE编号:CVE-2018-19050
发现者:m3lon
漏洞位置:index.php中的第23行echo输出语句
漏洞产生原因:echo输出的html代码中,langset值由外部输入获得,且没有做很好过滤
受影响版本:全部版本
修复版本:无

0x03 漏洞复现

3.1 管理员登录管理后台

使用firefox或IE浏览器访问localhost/met/admin/index.php, 登录管理后台
img

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

使用firefox访问http://localhost/m/admin/index.php?lang=cn&anyid=&n=getpassword&c=index&a=dogetpassword&langset='><script>alert(1)</script>, 触发漏洞

0x04 漏洞分析

4.1 漏洞代码

寻找漏洞代码,直接复制浏览器中的部分html代码,在metinfo文件夹中全局搜索,很快就定位到漏洞代码在app/system/getpassword/admin/templates/index.php文件23行的echo输出语句中
img
然而直接在index.php文件中并没有找到\$_M[form][langset]的来源,所以逆向回溯在这个漏洞分析中并不是很适用,于是开始下面的正向分析。

4.2 静态代码分析

首先观察漏洞触发的url: http://localhost/metinfo/admin/index.php?lang=cn&anyid=&n=getpassword&c=index&a=dogetpassword&langset='><script>alert(1)</script>, 查看metinfo/admin/index.php,

index.php中可以注意到两点:

  1. 可以看到关于url参数n、c、a的宏定义,于是我们可以理解上述url中的参数含义,n=getpassword&c=index&a=dogetpassword, 可以发现getpassword并不是模块名,c=index为index类,a=dogetpassword为类中的方法,简单查看cms的目录我们可以很快定位为getpassword文件夹下的index.class.php中的dogetpassword方法。
  2. index.php包含了../app/system/entrance.php,
    这种入口文件经常可能会是一些基本配置信息,简单查看一下可能会对之后的代码审计起到很大的帮助。

可以注意到类文件目录app/system/include/class,定位到我们第一点所说的index.class.php,于是我们便可以在index.class.php中下断点用phpstorm分析了。

4.3 动态代码分析

在app/system/include/class/index.class.php中的构造方法处下断点

F8单步调试,发现经过父类admin.class.php的构造方法后,\$_M[form][langset]被赋值,于是输入参数langset的处理发生在admin.class.php的构造方法中。结束此次调试,在parent::_construct();处下断点,重新开始调试,F7进入admin类的构造方法,发现admin类继承了common类构造方法,F7继续深入common.class.php

关注到load_form()用来进行表单过滤,分别使用daddslashes()函数对GET、POST、COOKIE数组进行处理

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

继续跟踪执行至模版输出,发现并未对\$_M[form][langset]有其他处理。

通过上面的动态调试,可以发现后台对于用户可控的参数langset的输入处理仅进行了addslashes转义处理赋值给全局变量\$_M[form][langset],且直接通过该变量输出,因此产生XSS漏洞。

0x05 漏洞分析总结

通过url传递的参数值langset不会经过sqlinsert函数过滤,只经过addslashes处理后就返回到前台页面script标签中,漏洞因此产生。

提供另一个触发链接(CVE-2018-19051 ):

http://192.168.6.232/m/admin/index.php?a=dogetpassword&anyid=&c=index&lang=cn&langset=&n=getpassword,burpsuite抓包修改POST包中的apt_type参数。 这种通过post才会产生的XSS漏洞,攻击者可以将XSS和钓鱼结合在一起,例如通过javascript代码模拟出网站的登录框,用户输入用户名和密码后,XSS将这些信息发送到服务器端,用来进行攻击。

0x06 修复方法

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

坚持原创技术分享,您的支持将鼓励我继续创作!