前言

本文是初学web安全时写的,有许多地方不够严谨,逻辑上也存在问题,请见谅~

参考:https://blog.csdn.net/qq_43531669/article/details/116865660

什么是任意文件下载/读取?

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

这种漏洞通常是由于应用程序没有对用户输入进行充分的验证和过滤而导致的。攻击者可以通过构造恶意的请求来利用该漏洞,从而读取或下载他们本来无权访问的文件,如密码、私钥、证书等,会提供攻击者更多可用信息,提高被入侵的风险。

这里以 Pikachu 靶场的 unsafe filedownload 模块为例:

下载文件后复制下载链接

得到:http://192.168.127.140/pikachu/vul/unsafedownload/execdownload.php?filename=kb.png

filename通过GET方法传入后端

直接看代码

image-20241014214821984

filename传进来后直接拼接在download下了,没有进行过滤,所以引发了任意文件下载/读取漏洞

1、漏洞利用条件

1.

  1. 存在读文件的函数:

    fopen()

    1
    2
    3
    4
    5
    $file = $_GET['file']; // 用户提供的文件路径
    $fp = fopen($file, 'r'); // 打开文件
    $data = fread($fp, filesize($file)); // 读取文件内容
    fclose($fp); // 关闭文件
    echo $data; // 输出文件内容

    fread()

    1
    2
    3
    4
    5
    $file = $_GET['file']; // 用户提供的文件路径
    $fp = fopen($file, 'r'); // 打开文件
    $data = fread($fp, 1024); // 读取文件前 1024 字节的内容
    fclose($fp); // 关闭文件
    echo $data; // 输出文件内容

    include()

    1
    2
    $file = $_GET['file']; // 用户提供的文件路径
    include($file); // 包含文件并输出内容

    readfile()

    1
    2
    $file = $_GET['file']; // 用户提供的文件路径
    readfile($file); // 读取并输出文件内容

    file_get_context()

    1
    2
    3
    $file = $_GET['file']; // 用户提供的文件路径
    $data = file_get_contents($file); // 读取文件内容
    echo $data; // 输出文件内容

    file()

    1
    2
    3
    $file = $_GET['file']; // 用户提供的文件路径
    $data = file($file); // 将文件读入数组中
    echo implode('', $data); // 输出文件内容

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

    3.输出了文件内容

漏洞类型

1
2
3
4
5
6
index.php?f=../../../../../../etc/passwd

index.php?f=../index.php

index.php?f=file:///etc/passwd

当参数 f 的参数值为php文件时, 若是文件被解析则是文件包含漏洞,若显示源码或提示下载则是文件查看与下载漏洞。