LFI(Local File Include)漏洞

漏洞简介

下面是纯bb,了解过的跳过这部分;

解释:LFI是能够打开并包含本地文件的漏洞;

这里区别一下RFI,远程文件包含漏洞;

意义:文件包含漏洞是"代码注入"的一种,包含即执行,可干的坏事可想而知,看i春秋总结的危害有如下几种:

PHP包含漏洞结合上传漏洞;

PHP包含读文件;

PHP包含写文件;

PHP包含日志文件;

PHP截断包含;

PHP内置伪协议利用。

PHP中文件包含函数有以下四种:

require()

require_once()

include()

include_once()

include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。

而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

最简单的漏洞代码:<?php include($_GET[file]);?>

当使用这4个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP的内核并不会在意被包含的文件是什么类型。即你可以上传一个含shell的txt或jpg文件,包含它会被当作PHP代码执行(图马)。

这个玩意儿与CTF的渊源(协议基础)

php://伪协议 >> 访问各个输入/输出流;

php://filter

解释:php://filter是一种元封装器,设计用于"数据流打开"时的"筛选过滤"应用,对本地磁盘文件进行读写。简单来讲就是可以在执行代码前将代码换个方式读取出来,只是读取,不需要开启allow_url_include;

用法:?file=php://filter/convert.base64-encode/resource=xxx.php

?file=php://filter/read=convert.base64-encode/resource=xxx.php 一样

php://input

解释:上面filter既然能读文件,肯定还能写文件,这就可以利用input将数据POST过去,即php://input是用来接收post数据的;

用法:?file=php://input 数据利用POST传过去

注意:如果php.ini里的allow_url_include=On(PHP < 5.30),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去一句话,如,即可执行;

例子:

碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项;

并且可以用data伪协议来绕过,由于这个题由于存在extract()函数,存在变量覆盖漏洞;直接?flag=1&shiyan=即可;

练习题目源码文件见input1文件夹;

2016华山杯有一道题,源码见本地data文件夹,这个可以利用data流;

data://伪协议 >> 数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的;

data://text/plain

解释:

用法:?file=data://text/plain;base64,base64编码的payload

注意:

<?php phpinfo();,这类执行代码最后没有?>闭合;

如果php.ini里的allow_url_include=On(PHP < 5.30),就可以造成任意代码执行,同理在这就可以理解成远程文件包含漏洞(RFI);

例子:

和php伪协议的input类似,碰到file_get_contents()来用;

练习题目源码文件见data文件夹;

phar://伪协议 >> 数据流包装器,自 PHP 5.3.0 起开始有效,正好契合上面两个伪协议的利用条件。说通俗点就是php解压缩包的一个函数,解压的压缩包与后缀无关。

phar://

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

注意:

PHP版本需大于等于 5.3,这就说明上述协议已经挂掉了,但又出来了phar协议前赴后继;

压缩包一般是phar后缀,需要代码来生成,但是zip后缀也可以;

压缩包需要是zip协议压缩,rar不行,tar等格式待测;

利用url的压缩包后缀可以是任意后缀;

例子:

本地:phar1文件(SWPU2016,限制上传类型)

本地:phar2文件(限制上传类型,上传重命名)

上述说的php.ini文件的限制如下:

allow_url_fopen = On 默认打开 ,允许URLs作为像files一样作为打开的对象;

allow_url_include = On 默认关闭 ,允许include/require函数像打开文件一样打开URLs;

函数解释

file_get_contents():这个函数就是把一个文件里面的东西 (字符)全部return出来作为字符串。

除此之外,通过实践我发现这个函数如果直接把字符串当作参数会报错,但如果包含的是http协议的网址,则会像curl命令一样,把源码读出来。而php伪协议也是识别http协议的,所以说上面php://input可以将POST的数据读过来来赋值给参数,这就造成了上述那个例子的漏洞。

include():(就是require,reqiuire_once,include_require这一类)include是针对文档的代码结构的。也就是说,include进来,成了这个文件的其中一部分源代码,这类函数就是文件包含漏洞的罪魁祸首。

include把导入的字符串当成当前文件的代码结构,而file_get_contents只是返回字符串,这是两个函数最大的不同。关于字符串执行的问题,file_get_contents返回的字符串失去了被执行的能力,哪怕字符串里面有,一样能拿出来但不执行。而include导入的字符串,如果被导入的文件有外的一部分。

简单有趣的Web题

本地包含、代码注入:

源码文件见:命令执行文件夹

);用来闭合var_dump()方法,echo`command`;执行命令,//注释。

php://input伪协议:

源码文件见input2文件夹

php://input协议读取POST过来的数据并执行。

Tips

上述filter伪协议利用的是encode编码为base64再带出来,filter还有decode解密语句,可利用场景如下(文字摘自phithon博客):

源码存在eval(xxx),但xxx长度限制为16个字符,而且不能用eval或assert,怎么执行命令。题目源码文件见tips.php,那么利用这个代码怎么拿到webshell?

利用file_put_contents可以将字符一个个地写入一个文件中,大概请求如下:

file_put_contents的第一个参数是文件名,我传入N。PHP会认为N是一个常量,但我之前并没有定义这个常量,于是PHP就会把它转换成字符串'N';第二个参数是要写入的数据,a也被转换成字符串'a';第三个参数是flag,当flag=8的时候内容会追加在文件末尾,而不是覆盖。

除了file_put_contents,error_log函数效果也类似。

但这个方法有个问题,就是file_put_contents第二个参数如果是符号,就会导致PHP出错,比如param=$_GET[a](N,

于是微博上 @买贴膜的 想出一个办法,每次向文件'N'中写入一个字母或数字,最后构成一个base64字符串,再包含的时候使用php://filter对base64进行解码即可。

这时候就利用了decode了,成功getshell。

# 每次写入一个字符:PD9waHAgZXZhbCgkX1BPU1RbOV0pOw

# 最后包含

param=include$_GET[0];&0=php://filter/read=convert.base64-decode/resource=N

参考博文

ctf本地包括_GitHub - SewellDinG/LFIboomCTF: 本地文件包含漏洞实践源码及相应协议利用指南...相关推荐

  1. 文件包含漏洞特点和php封装伪协议

    渗透学习 文件包含漏洞 文章目录 渗透学习 前言 *本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任.* 一.文件包含漏洞 二.实验步骤 1.文件包含特点 2.本 ...

  2. phpinfo.php ctf,这你不是你所常见的PHP文件包含漏洞(利用phpinfo)

    0x01 前言 看到文件包含(+phpinfo ) 的问题,在上次众测中出现此题目,如果没打过CTF,可能真的很少见到这种问题,当然作为小白的我,也是很少遇到,毕竟都是第一次,那就来总结一波经验和操作 ...

  3. fopen打开ftp文件_PHP文件包含漏洞利用思路与Bypass总结手册(一)

    作者:Qftm 合天智汇 前言 这个手册主要是记录针对PHP文件包含漏洞的利用思路与Bypass手法的总结. 相关函数 四个函数 php中引发文件包含漏洞的通常主要是以下四个函数: 1.include ...

  4. PHP文件包含漏洞利用思路与Bypass总结手册(一)

    本文作者:Qftm 目录 前言 相关函数 四个函数 函数功能 函数差异 漏洞原因 漏洞分类 包含姿势 php伪协议 php://filter file:// php://input file_get_ ...

  5. 文件包含漏洞 文件伪协议利用

    目录 0x0 文件包含漏洞原理 0x1 检测文件包含漏洞 0x2 文件包含漏洞类型 0x3 文件协议流 0x4 实战 简介 #文件包含漏洞 原理,检测,类型,利用,修复等 #文件包含各个脚本代码 AS ...

  6. 文件包含漏洞总结都在这里了

    一.文件包含与伪协议 什么是文件包含 通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入.未经检验,文本当代码使用. 环境要求 ...

  7. 【web安全】——文件包含漏洞

    作者名:Demo不是emo  主页面链接:主页传送门 创作初心:一切为了她​​​​​​​ 座右铭:不要让时代的悲哀成为你的悲哀 专研方向:网络安全,数据结构 每日emo:可后来,除了梦以外的地方,我再 ...

  8. Apache Tomcat文件包含漏洞(CNNVD-202002-1052、CVE-2020-1938)

    文章目录 [漏洞描述] 1,xml配置文件中的修复方法: 2,springboot对应方法: springboot开启AJP方法 开启了AJP的springboot如何升级内置tomcat版本 [漏洞 ...

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

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

  10. 【文件包含漏洞-03】文件包含漏洞的利用及如何利用本地文件包含漏洞GetShell

    文件包含漏洞的利用 读取敏感文件 我们可以利用文件包含漏洞读取任意文件,读取文件的时候有利用条件 目标主机文件存在(目标文件的路径.绝对路径.相对路径) 具有文件可读权限 提交参数http://loc ...

最新文章

  1. 京东抢购服务高并发实践
  2. ML:推荐给小白入门机器学习一系列书籍
  3. 转,mysql的select * into
  4. 分享3段平时很实用的微代码,高手莫喷
  5. .NET 开发系统 -知识 点
  6. ECCV 2020 论文大盘点-3D人体姿态估计篇
  7. android 画中画模式自定义,Android 8.0 Oreo 画中画模式
  8. mysql文档 主从_Mysql主从文档
  9. Scp远程批量执行命令
  10. 华为s2600t java_华为服务器RH2288H V2连接 华为存储S2600T
  11. linux常用命令和关闭防火墙
  12. android65535错误实现,Android 65535问题的解决方法
  13. 轻量型目标检测算法一次看个够
  14. Android 继承于PopuWindow的自定义弹出窗体
  15. 后端返回JSON数组转Tree树形格式,展示到element-ui的tree树形组件
  16. 浅谈光耦电路在开关量采集电路中的设计
  17. VS2015正式版出炉-----
  18. 《文本大数据情感分析》读书报告
  19. opencv 二维图像 特征检测 特征描述 特征匹配 平面物体识别跟踪
  20. java swing actionlistener_关于Java swing Jcomponent的ActionListener

热门文章

  1. 面象对象与面象过程内存分区
  2. 最近的shell脚本(updating)
  3. [原创]如何有效的考核测试人员
  4. android edittext不可复制_【EditText】Android设置EditText不可编辑 | 学步园
  5. Spring IOC源码笔记(一)
  6. Spring Cloud Alibaba入门简介
  7. ES6 将数组根据某个属性进行分组的方法
  8. MyCat的zookeeper集群模式总结
  9. mysql的索引(二)
  10. mysql的架构及查询sql的执行流程(一)