freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

一次对文件包含漏洞的代码审计(CVE-2018-12613)
2021-06-28 15:28:21

image.png

01、什么是文件包含漏洞?

攻击者利用包含的特性,加上应用本身对文件(包含)控制不严格,最终造成攻击者进行任意文件包含。(包含的文件内容会被当成PHP脚本文件来解析,忽略文件后缀名)

一句话来说就是:文件包含并不属于漏洞,但是由于对包含进来的文件不可控,导致了文件包含漏洞的产生。

本地文件包含叫做LFI(local file include),远程文件包含叫做RFI(remote file include),默认PHP不开启远程文件包含。

02、相关函数

include:PHP运行到include然后去调用被包含文件执行,如果包含文件不存在则报错,但是会继续往下执行;

require:PHP在运行前,就先去把被包含文件的内容提取出来然后整合成新的PHP一齐执行,如果包含的文件不存在则报错,不会继续执行;

include_once|require_once:如果文件已经被包含一次就不会重复包含。

举例,网站根目录下有一个名为 "test.txt" 的文本文件,内容如下:

image.png

图1 test.txt

在一张页面中引用这个文件,我使用了include语句,内容如下:

image.png

图2 include.php

使用浏览器访问带有文件包含的页面时,效果如下:

image.png

图3 访问页面

03、漏洞描述

CVE-2018-12613漏洞来自phpMyAdmin中的一部分代码被重定向和加载,以及对白名单页面进行不正确的过滤,导致攻击者能够读取到服务器下的任意文件。

影响版本:

phpMyAdmin 4.8.0 和 4.8.1

04、代码审计

1、首先文件包含利用位于/index.php文件中的target参数

第55-63行:

image.png

图 4 index.php

这里写明了想执行包含文件代码include $_REQUEST['target'],需要满足以下5个条件:

$_REQUEST['target'] 不为空;

$_REQUEST['target'] 是字符串;

$_REQUEST['target'] 开头不是index;

$_REQUEST['target'] 不在 $target_blacklist 中;

Core::checkPageValidity($_REQUEST['target']) 为真。

于是,往前追溯找到变量$target_blacklist具体含有哪些内容。

在同一文件下50-52行:

image.png

图 5 target_blacklist

这时清楚了当$_REQUEST['target']不是import.php或export.php,即可以实现文件包含。

二、接下来定位另一个限制,在/libraries/classes/core.php文件中的checkPageValidity()方法。

位于443-478行处:

image.png

图6 checkPageValidity方法

分析该方法中包含的几个if判断:

  • 首先$whitelist为空,赋值为self::$goto_whitelist

image.png

图7 白名单内容

如果$page在白名单中,就会返回true,但是我们的$page带有参数,就要进行一下判断若$page存在$whitelist中的某个值则返回true;

mb_strpos()函数的意思是返回$page中" ? "的位置,然后substr()函数进行截取,返回结果$_page去的是$page问号前面的部分。如果$_page在白名单中就会返回ture。

最后可以得出,若传入target=db_sql.php%253f/../../test.txt(%253f是?的url二次编码),经过两次解码后(GET传参默认解码一次url)变回?,分割后取出前面的字符串为db_sql.php,会进入最后一个 if 判断返回 true

因为php会将前面的db_sql.php?当成目录,所以需要多加一个/../来跨出目录。如果包含的文件需要传参的时候可以使用&符号。

所以,只要taget参数的值构造得当,就可以实现绕过它的检测,实现文件包含漏洞。

05、漏洞复现

payload:

http://[phpmyadmin_ip]/index.php?target=db_sql.php%253f/../../../../etc/passwd

image.png

图 8 漏洞利用

可以看到成功读取了/etc/passwd文件,除此之外还能使用该漏洞配合sql语句写入木马后getshell,感兴趣的小伙伴可以深入研究,发现更多的利用姿势。

06、防御措施

1. 在建站的过程中,非必须的情况下设置allow_url_include和allow_url_fopen为关闭

2. 如果需要文件包含,应对包含的文件进行限制,使用白名单方式或设置可包含目录,如open_basedir;

3. 对用户输入进行严格检查,参数中不允许出现../之类的目录跳转符;

4. 严格检查include类的文件包含函数中的参数是否外界可控

# 漏洞分析 # 漏洞复现 # 文件包含漏洞
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录