前言
MetInfo企业建站系统采用PHP+Mysql架构,是一款对SEO非常友好、功能全面、安全稳定、支持多终端展示并且使用起来极其简单的企业建站软件。用户可以在不需要任何编程的基础上,通过简单的设置和安装就能够在互联网搭建独立的企业网站,能够极大的降低企业建站成本。2017年08月01日,metinfo官方发布了新版本,修复了一个SQL注入漏洞。
我下载了 MetInfo5.3.5 版本的建站源码,对这个注入漏洞进行了简单的分析复现。
漏洞分析
漏洞出现在 /include/global.func.php 文件的 jump_pseudo 函数,函数部分源码如下:
上图中标记出了漏洞触发过程中比较关键的几步。$_SERVER[HTTP_X_REWRITE_URL] 将请求 header 中的 X_REWRITE_URL 字段取出赋值给 $pseudo_url,之后使用斜线对 $pseudo_url 变量进行分割,然后将该数组中的倒数第二个元素赋值给 $dir_dirname 变量,最后将 $dir_dirname 变量拼接到 SQL 语句,传入数据库。所以只要将 $dir_dirname 变量控制为合理的 SQL 语句,就会导致注入。
通过分析逻辑关系可以看出,如果想要执行 $query="select * from $met_column where foldername='$dir_dirname' and lang='$lang' and (classtype='1' or releclass!='0') order by id asc",需要满足几个条件:
-
if($met_pseudo),判断是否开启了伪静态,默认安装的 metinfo 是关闭的,只用开启时才会导致注入。
-
if($pseudo_jump!=1),通过源码可知,只要存在 HTTP_X_REWRITE_URL ,$pseudo_jump 变量就不为1。
-
switch($dir_filenames[0]){ case 'index.php',需满足 $dir_filenames[0] 为 index.php,这个值在构造恶意请求时是可以由攻击者控制的。
-
if(!$class1&&!$class2&&!$class3),需满足 class1、class2、class3 没有值,请求中不传入这三个参数时则满足条件。
-
if($index!='index'),$index 变量同样可控,请求时 index 参数不等于 ‘index’ 即可。
-
if($lang!=$met_index_type), $met_index_type 变量为安装 metinfo 时设置的默认语言,正常是 cn,也就是当 $lang 不为 cn 时满足,但是第一个条件伪静态设置是针对语言的,在默认 cn 状态下,设置 $lang 为其他语言伪静态则为关闭状态。这时需要利用 MySQL 的一个特性,utf8_general_ci 格式的表对大小写不敏感,所以设置 $lang=Cn 则可以绕过判断。
-
if($id),只要不传入 class1、class2、class3 参数就可以绕过。
漏洞复现
首先安装 metinfo,除了数据库用户名密码外,一切默认即可,安装成功后首页如下:
在后台管理页面开启伪静态化:
再次访问首页时抓取数据包,根据上面的分析,设置恶意的 X-Rewrite-Url 字段内容:
成功通过注入 SQL 语句查询到管理员的密码。
参考
https://www.leavesongs.com/PENETRATION/metinfo-5.3.17-sql-injection.html
作者: JenI 转载请注明出处,谢谢
Comments !