01.什么是包含漏洞的文件?
攻击者利用了包含的特性,而应用本身并没有严格控制文件(包含),最终导致任意的文件包含。(包含文件的内容将被解析为PHP脚本文件,忽略文件扩展名)
总之,文件包含不是漏洞,只是对包含的文件失去了控制,导致了文件包含漏洞。
本地文件包含称为LFI(本地文件包含),远程文件包含称为RFI(远程文件包含)。默认情况下,PHP不打开远程文件包含。
02.相关函数
include
:PHP运行到include然后去调用被包含文件执行,如果包含文件不存在则报错,但是会继续往下执行;
require
:PHP在运行前,就先去把被包含文件的内容提取出来然后整合成新的PHP一齐执行,如果包含的文件不存在则报错,不会继续执行;i
nclude_once|require_once
:如果文件已经被包含一次就不会重复包含。
举例,网站根目录下有一个名为 “test.txt” 的文本文件,内容如下:
比如有一个网站叫“test.txt & # 8221的文本文件,包含以下内容:
图1 test.txt
在一张页面中引用这个文件,我使用了include语句,内容如下:
为了在页面中引用这个文件,我使用了include语句,其内容如下:
图2 include.php
使用浏览器访问带有文件包含的页面时,效果如下:
使用浏览器访问包含文件的页面时,效果如下:
图3访问页面
03.漏洞描述
CVE-2018-12613漏洞来自于phpMyAdmin中部分代码的重定向和加载,以及白名单页面的不正确过滤,导致攻击者能够读取服务器下的任意文件。
影响版本:
PhpMyAdmin 4.8.0和4.8.1
代码审计
1.首先,该文件包含位于/index.php文件中的目标参数。
第55-63行:
第55-63行:
图4 index.php
这里声明您想要执行包含文件代码include $ _ REQUEST[‘目标’],需要满足以下五个条件:
$_REQUEST[‘target’] 不为空;$_REQUEST[‘target’] 是字符串;$_REQUEST[‘target’] 开头不是index;$_REQUEST[‘target’] 不在 $target_blacklist 中;Core::checkPageValidity($_REQUEST[‘target’]) 为真。
所以,回过头来看看变量$target_blacklist包含了什么。
在同一文件下50-52行:
在同一文件下,第50-52行:
图5目标_黑名单
此时此刻很清楚,当$ _ REQUEST[‘目标’]不是import.php或export.php,即可以实现文件包含。
其次,接下来找到另一个限制,即
/libraries/classes/core . PHP文件中的checkPageValidity()方法。
位于443-478行处:
在第443-478行:
图6 checkPageValidity方法
分析该方法中包含的几个if判断:
首先$whitelist为空,赋值为self::$goto_whitelist
图7白名单内容
如果$page在白名单中,就会返回true,但是我们的$page带有参数,就要进行一下判断若$page存在$whitelist中的某个值则返回true;
函数的作用是:返回”在$page中?“位置,然后substr()函数截取并返回结果$_page到$page问号前面的部分。如果$_page在白名单中,它将返回true。
最后可以得出,若传入target=db_sql.php%253f/../../test.txt(%253f是?的url二次编码),经过两次解码后(GET传参默认解码一次url)变回?,分割后取出前面的字符串为db_sql.php,会进入最后一个 if 判断返回 true
因为php会改变之前的db_sql.php?作为一个目录,所以您需要添加一个额外的/../退出目录。你可以用& Symbol。
所以只要taget参数的值构造得当,就可以实现绕过其检测,实现文件包含漏洞。
05.漏洞重现
有效载荷:
http://[phpmyadmin_ip]/index.php?target=db_sql.php%253f/../../../../etc/passwd
http://[phpmyadmin _ IP]/index . PHP?target=db_sql.php%253f/../../../../etc/密码
图8漏洞利用
可以看到/etc/passwd文件已经被成功读取,除此之外,还可以利用这个漏洞用sql语句写入木马后的getshell。感兴趣的朋友可以深入研究,发现更多的利用手势。
06.防御措施
1.在建站过程中,将allow_url_include和allow_url_fopen设置为,不需要时关闭;
2.如果需要包含文件,应该限制中包含的文件,白名单方法或设置可以包含目录,比如open _ basedir;
3.严格检查用户输入,以及目录跳线,如..参数中不允许出现/符号;
4.严格检查include类文件的include函数中的参数是否
可由外界控制。
本文来自清杉投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/493217.html