什么是文件包含漏洞:
1. PHP文件是可以直接执行包含的文件的代码,包含的文件格式是不受限制的,只要能正常执行即可。
2. 文件包含不是漏洞但是能被攻击人员控制就是漏洞了
文件包含分为本地文件包含(local file include,LFI)是只能包含本地文件,大多出现在模块加载,模板加载,cache调用的地方。远程文件包含(remote file include,RFI)是指可以包含远程文件的漏洞但是需要设置allow_url_include=On,php5.2之后此选项可修改范围是PHP_INI_ALL
文件包含函数:
1. include 在包含文件出错时依然往下执行
2. require 在包含文件出错时直接报错退出执行
3. include_once()和require_once如果文件被包含过一次,就不在重复包含
本地复现:
发现包含函数中存在变量
跟进发现4个条件
要想执行到61行则要满足这4个条件(1,传入的target变量是字符串 2,传参中不能以index开头 3,传参非$target_blacklist数组中的 4,满足Core类中的checkPageValidity函数)
跟进$target_blacklist
发现数组中有import.phpexport.php
定位 checkPageValidity函数
发现$_page在$whitelist中时返回true
我们不会传入第二个形参,所以$whitelist=self::$goto_whitelist
跟进$goto_whitelist
发现白名单。
假设我们用db_sql.php?/../../../aaa.txt来绕过白名单限制进行包含文件但这种格式并不能跨路径包含,因为php程序把?号后面的东西当成是传入db_sql.php文件的参数
但是
第三个和第二个对比多出了个 urldecode()函数,我们可以利用 双重编码绕过,将?经过两次编码 %253f就可以绕过白名单验证,当 %253f传入时,首先会被自动解码一次,变成%3f。然后urldecode()再解码一次,就变成了 ?。成功绕过了白名单限制。
因为在mysql文件夹中有对应数据库的目录,里面有frm文件
frm关于表字段文件,所以我们可以进入phpmyadmin中修改或添加带有一句话木马的字段
所以我们构建poc:http://10.101.41.38/phpMyAdmin/phpMyAdmin-4.8.1-all-languages/index.php?target=db_sql.php%253f/../../../../MySQL/data/zkaq/login.frm&8=phpinfo();
防御策略:
1、无需情况下设置allow_url_include和allow_url_fopen为关闭
2、对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir
3、建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现../之类的目录跳转符。
4、严格检查include类的文件包含函数中的参数是否外界可控。
原文始发于微信公众号(是恒恒呐):phpMyAdmin-4.8.1文件包含漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论