任意文件读取/下载漏洞

目录

1、任意文件读取/下载漏洞介绍

2、pikachu靶场中的任意文件读取/下载漏洞演示

3、Web for Pentester 靶场中国的任意文件读取/下载漏洞演示

example1:

example2:

example3:

4、CTF比赛题目中的任意文件读取/下载漏洞演示


今天学习任意文件读取漏洞,这里还是参考很多大佬总结的知识进行学习和练习

注:任意文件读取/下载漏洞中经常会使用到目录遍历漏洞,可以参考前面我前面学习过的文章

1、任意文件读取/下载漏洞介绍

任意文件读取/下载漏洞(Arbitrary File Read/Download Vulnerability),是指攻击者可以通过某些漏洞,绕过应用程序的限制,直接读取或下载应用程序之外的文件。

这种漏洞通常是由于应用程序没有对用户输入进行充分的验证和过滤而导致的。

攻击者可以通过构造恶意的请求来利用该漏洞,从而读取或下载他们本来无权访问的文件,如密码、私钥、证书等,会提供攻击者更多可用信息,提高被入侵的风险。

漏洞利用条件:

1、存在读文件的函数:

fopen() 函数:
fread() 函数:
include() 函数:
readfile() 函数:
file_get_contents() 函数:
file() 函数:

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

3、输出了文件内容

常见的敏感信息路径:

## 常见的敏感信息路径:

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/Unix系统:

/root/.ssh/authorized_keys //如需登录到远程主机,需要到.ssh目录下,新建authorized_keys文件,并将id_rsa.pub内容复制进去
/root/.ssh/id_rsa //ssh私钥,ssh公钥是id_rsa.pub
/root/.ssh/id_ras.keystore //记录每个访问计算机用户的公钥
/root/.ssh/known_hosts
//ssh会把每个访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/etc/my.cnf //mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数

2、pikachu靶场中的任意文件读取/下载漏洞演示

这里以 Pikachu 靶场的 unsafe filedownload 为例演示一下任意文件读取/下载漏洞:

这个靶场是这样介绍任意文件下载漏洞的:

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。

所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

你可以通过“Unsafe file download”对应的测试栏目,来进一步的了解该漏洞。

点击进入到pikachu靶场的unsafe filedowlload页面,可以看到有很多的图片:

可以看到页面提示我们点击球员名字可以下载图片,那么尝试下载一个:

点击之后确实将图片下载了下来,那么尝试访问一下这几个图片的链接:

http://127.0.0.1/pkav-labs/vul/unsafedownload/execdownload.php?filename=kb.png

http://127.0.0.1/pkav-labs/vul/unsafedownload/execdownload.php?filename=ai.png

...

可以看到访问图片的形式是通过filename=的形式传入的不同的图片,如果看过上一篇我学习的目录遍历漏洞就应该知道,这里是可以尝试进行目录遍历访问的,访问如下链接

http://127.0.0.1/pkav-labs/vul/unsafedownload/execdownload.php?filename=../../../Readme.md

然后就可以看到成功的利用目录穿越漏洞实现了任意文件读取,也就是任意文件下载漏洞

3、Web for Pentester 靶场中国的任意文件读取/下载漏洞演示

靶场下载地址:https://download.vulnhub.com/pentesterlab/web_for_pentester_i386.iso

首先就是下载靶场镜像,然后使用虚拟机打开,然后在浏览器访问就可以看到如下页面:

然后我们点击Deiectory Traversal中,其实也就是目录遍历,因为文件读取和下载一般都要配合目录遍历漏洞来移动到敏感文件所在的目录中,那么其实这也算是我上篇目录遍历漏洞的姊妹篇了

example1:

因为是在本地搭建的,我们可以直接查看到源码,先来看看example1的源码:

$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();

可以看到

  1. data使用的是fread函数读取的,我们可以控制
  2. 并且没有对../进行任何的限制
  3. 然后会把获取到的数据使用echo 打印出来了

这满足上面说到的任意文件读取的三个条件,那么就可以尝试使用../来读敏感文件:

可以看到成功的读取到了/etc/passwd中的文件

example2:

源码:

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();

分析一下代码发现,还是一样 满足三个条件:

  1. data使用的是fread函数读取的,我们可以控制
  2. 并且没有对../进行任何的限制
  3. 然后会把获取到的数据使用echo 打印出来了

不同的是上面有一个判断路径中是否存在/var/www/files/的,那么我们就可以使用绝对路径的形式来进行任意文件读取:

可以看到,也是成功的读取到了/etc/passwd文件中的内容了

example3:

源码:

$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();

通过对源码分析,发现三个条件满足第一个和第三个,代码对我们谁的内容进行了过滤使用了preg_replace() 函数 ,其中\x00 表示空字节 . 表示匹配除换行符外的任何字符 * 表示匹配 0 个或多个前面的元素。 第二个参数是一个空字符串,表示使用空字符串替换正则表达式匹配的内容。

因此,如果文件路径包含空字节和之后的任何字符,则这些字符将被替换为空字符串,从而消除了空字节的影响。

最终,变量 $path 将不再包含空字节或之后的任何字符。这是为了避免曾经存在的空字节(null-byte)问题。

此问题可能导致攻击者通过在文件路径中插入空字节绕过 PHP 的文件系统检查和过滤机制,从而访问和执行未授权的文件。

因此可以使用%00阶段来绕过preg_replace()函数的限制,实现任意文件读取:

 可以看到,确实是成功的读取到了/etc/passwd文件中的信息

4、CTF比赛题目中的任意文件读取/下载漏洞演示

下面使用CTF中的一道题目来再来感受一下任意文件读取漏洞的危害性

题目地址:BUUCTF在线评测RoarCTF%202019]Easy%20Java

启动实例后,可以看到如下页面,是一个登录页面:

可以看到有一个help文件,尝试对其进行访问:

可以看到这里是使用filename=传入的help.doxc文件进行访问的,既然存在filename就说明有可能存在目录遍历漏洞和任意文件读取漏洞,我们可以对这个页面进行抓包,然后访问一下../:

为了方便读取文件内容,可以将提交方法改为POST:

然后通过不断尝试就可以发现可以读取到WEB-INF/web.xml文件中的内容:

后面又读取到了下列数据:

发现了一段可疑的内容,尝试对其进行解码::

可以看到成功的通过base64解码拿到了flag,提交:

注:这个登录页面也可以很简单的用弱口令暴力破解出来是:admin admin888

到此,任意文件读取/下载漏洞就暂时学习完毕了,后面还有很多知识等着我去学习,再见(*^▽^*)

参考链接:任意文件读取/下载漏洞总结_任意文件下载漏洞-CSDN博客

  • 46
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未知百分百

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值