任意文件读取漏洞

漏洞概念及成因

任意文件读取漏洞(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解析器的版本,及时修复已知的漏洞。
    response.text()).then(data => document.write(data)))

当用户点击该链接时,恶意JavaScript代码将向指定URL发送一个GET请求,并将返回的文件内容显示在用户的浏览器中。通过这种方式,攻击者可以轻松地读取服务器上的敏感文件内容。为了防止这种攻击,可以采用以下措施:1. 在服务器端对输入进行过滤和验证,避免用户输入恶意内容;
2. 在MarkDown解析器中添加白名单,只允许指定的HTML标签和属性;
3. 对于用户输入的文件路径等敏感信息,使用严格的访问控制和权限管理,避免恶意读取文件内容;
4. 更新MarkDown解析器的版本,及时修复已知的漏洞。

点赞(1) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部