文件包含
开发一般会把重复使用的函数写到单个文件中,在使用某些函数时直接调用此文件,该调用文件过程称为文件包含;若该包含的文件是可控的(eg:通过 URL 参数来控制包含哪个文件),则可能存在文件包含漏洞;
【大多数出现在 PHP 中,当然 Java 中也有,不过相对较少;且一般会受到配置和版本的影响。】

| 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:
include、require、include_once、require_once等;
(include 若包含过程中出错,会抛出警告,继续执行;require 出错时会报错并退出程序执行)
Java:
java.io.File、java.io.FileReader等;ASP.NET:
System.IO.FileStream、System.IO.StreamReader等;
黑盒主要观察参数传递的数据和文件名是否对应;
eg:path、dir、file、page、archive、eng、语言文件等相关字眼;
利用思路
本地利用:
配合文件上传;
无文件上传包含日志文件利用(需知道路径,默认路径测试);
- 利用日志记录 UA 等信息的特性,抓包修改使其写入日志文件中,再用默认路径尝试访问;
无文件上传包含 SESSION 利用(需知道路径,默认路径测试);
- 利用
PHP_SESSION_UPLOAD_PROGRESS进行文件包含;
- 利用
1 |
|
数据包中设置:Cookie:PHPSESSION=自定义session名
- 伪协议利用;
1 | 文件读取: |
远程利用:创建可访问的远程 URL 包含文件;
修复
- 白名单:代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较;
- 路径限制:限制被包含的文件只能在某一文件夹内,PHP 配置文件中有
open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP 仅仅在该目录内搜索文件; - 关闭危险配置:PHP 配置中的
allow_url_include选项如果打开,PHP 会通过Include/Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的; - 过滤危险字符:严格检查用户输入,参数中不允许出现
../之类的目录跳转符; - 尽量不要使用动态包含,可以在需要包含的页面固定写好,如:
include(‘head.php’)。
参考学习:
https://blog.csdn.net/unexpectedthing/article/details/121276653 (好像还要 CSDN VIP,我丢
了)







