文件包含

PHP是一种非常流行的Web开发语言,PHP的语法过于灵活,这也给安全工作者带来了一些困扰。同时,PHP也存在很多历史遗留的安全问题。

常见的导致文件包含的函数如下:

1
2
3
4
5
PHP:include(),include_once(),require(),require_once(),fopen(),readfile(),...
JSP/Servlet:ava.io.File(),java.io.FileReader(),...
ASP:include file,include virtual,...

文件包含是PHP的一种常见用法,主要由4个函数完成:

1
2
3
4
5
6
7
include()
require()
include_once()
require_once()

当使用这4个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核并不会在意该被包含的文件是什么类型。所以如果被包含的是txt文件、图片、远程URL,也都将作为PHP代码执行。

想要成功利用文件包含漏洞,需要满足下面两个条件:
(1)include()等函数通过动态的方式引入需要包含的文件;
(2)用户能够控制改动态变

本地文件包含

常用技巧:

1、包含用户上传的文件。
2、包含data://或php://input等伪协议。(allow_url_include设置为ON,PHP5.2.0后支持data:伪协议)

3、包含Session文件。(条件比较苛刻,默认在/tem目录下)
4、包含日志文件,比如Web Server的/etc/httpd/logs/access_log。(需要一定的读权限)

使用burpsuit抓包访问 ,绕过浏览器编码<>
curl 访问不存在的url
curl http://192.168.1.104/LFI/a.php?=<?php phpinfo(); ?>
访问:http://192.168.1.104/LFI/LFI.php?RcoIl=/etc/httpd/logs/access_log
5、包含/proc/self/environ文件。
6、包含其他应用创建的文件,比如数据库文件、缓存文件、应用日志等,需要具体情况具体分析。

注意:

  • 如果在不知道默认后缀是什么的时候,直接使用截断处理(%00)
  • 包含日志时,要确认是否有读取access.log的权限,而且要确保在日志中存储的payload没有被转义。
  • 可用php://filter/convert.base64-encode/resource=test.php读取php源码

远程文件包含

如果php的配置选项allow_include为ON的话,则include/require函数是可以加载远程文件的。

注意:

1、远程包含时,不要包含远程的php文件,这样会当做是访问远程的php文件,而不是执行,建议是txt文件。
2、一些经验丰富的开发者会考虑将被包含文件的扩展名写死,所以使用进行截断。(不使用截断,就会提示找不到文件,不一样的系统,截断的方式不大一样)

测试:

理解了RFI攻击原理,防御也就简单了。在配置层面,保持PHP的默认设置,将“allow_url_include”关闭;在代码层面,如果一定要动态包含文件,最好明确规定包含哪些文件,进行白名单比对。同时,也可以在包含函数中加入目录限制。

本地测试环境:本地文件包含漏洞&&PHP利用协议&&实践源码

参考:

谈一谈php://filter的妙用
LFI EXPLOITATION VIA PHP://INPUT
Bypassing PHP Null Byte Injection protections

!坚持技术分享,您的支持将鼓励我继续创作!