详解php文件包含原理(读取文件源码、图片马、各种协议、远程getshell等)

作者是namezz

(看完图相当于做了一轮实验系列)

现有文件代码如下

include和include_once、require、require_once用处差不多,故只举include例说明。话不多说,开始正文。(正文太啰嗦了,直接看总结吧)

功能说明

分别包含aaa和zzz,效果如下图所示

读取到zzz文件的内容<?phpecho __FILE__;并解析执行了,而aaa文件识别不为php,故直接输出源码内容。故包含/etc/passwd同理

用readfile读文件如图所示

由于加了图片头header,所以浏览器识别为图片类型。f12或抓包能看到响应包情况,能看到与include等不同的是,readfile是直接读文件内容,而不解析的。file_get_content同理(用法自行百度)。

原理说明:文件包含究竟包含了啥

首先,include函数和readfile函数都是先读取指定的内容(注意,这里是指定的内容而不是文件的内容,后面解释),而include函数会试图解析读取的内容,是否为php代码,如若是则执行,否则直接输出

如图所示,使用file协议、http协议、php协议(官方文档:http://php.net/manual/zh/wrappers.php)效果分别如下

因为默认配置是没开allow_url_include的,所以使用http协议读文件会失败(开了就是远程包含,后面会说)

以上使用file协议和php协议都读到了文件的源码,并执行了

在使用php://filter/read=convert.base64-encode/和php://filter/string.rot13/对读取的内容进行编码看看

这里由于<?php经rot13后转为<?cuc直接输出给浏览器,而浏览器不认识<?cuc标签,所以也没显示出来,但是查看源码也是能看到的

发现,同样是php协议,读取了文件的内容,但是使用了base64或者rot13对内容进行编码,直接输出了,直接读到了zzz的源码,

读其他页面源码也是同理。还有需要一提的是这里不要直接包含i.php,因为用的是include而不是incloude_once,会无限包含调用自身,导致死循环(要理解递归,必先理解递归)。

还是看不懂,不知道包含了啥?

可以理解为包含了一个数据流

如readfile('zzz')或include('zzz')打开一个数据流,内容为zzz文件的内容,而include('php://filter/read=convert.base64-encode/resource=zzz')为打开一个数据流,内容为zzz文件的base64编码内容,所以我这里有一个文件,内容为<?phpphpinfo();的base64编码,

再用php://filter/read=convert.base64-decode/resource=p.php去包含它,可以发现是执行了的

allow_url_fopen和allow_url_include对文件包含的影响

首先,看字面意思,allow_url_fopen是允许来自url的fopen,allow_url_include是允许来自url的include。下面用几个例子来说明一下

r.php?a=http://127.0.0.1/zzz

r.php?a=data:text/plain,qweraaa

r.php?a=data:text/plain;base64,cXdlcmFhYQ==

r.php?a=php://input

接下来把allow_url_fopen关了再试一下

修改php.ini然后重启httpd服务

发现failed了,但是php://input这个是不受allow_url_fopen影响的,关了也能读到post数据。

而allow_url_include,字面意思,控制include类函数能引用的数据流来源,是否允许直接包含来自url获取的数据流,只要开了的话就能直接远程包含getshell,举例说明如下

i.php?a=zzz

i.php?a=file:///var/www/html/zzz

i.php?a=php://filter/read=/resource=zzz

i.php?a=http://127.0.0.1/zzz

i.php?a=php://input

i.php?a=data:text/plain,<?phpsystem('date');?>

i.php?a=data:text/plain;base64,PD9waHAgc3lzdGVtKCdkYXRlJyk7Pz4=

关闭allow_url_include的情况下,除了前三个是本地包含,后面的都走远程包含的全都报错,如图所示

打开allow_url_include后远程包含就行了,至此可以直接包含shell了

图片马以及使用php协议绕过过滤进而getshell1、存在本地文件包含且只允许上传图片文件

这是一个图片

打开后长这样

包含它,是乱码

在理解文件包含原理后,往图片添加php代码

打开图片,还是长这样,没变化

不过源码已经带了php代码

包含图片

php代码已经被执行了。2、存在本地文件包含且只允许上传图片文件且校验包含文件后缀是否为php

代码示例如下:

$f=$_GET[f];

if ( isset( $f )&&strtolower( substr( $f, -4 ) ) == ".php" )

{

require( $f );

}

使用zip或者phar协议

新建shell文件

压缩为zip

重命名为jpg

然后上传

打开当然显示图片损坏

然后使用phar协议或zip协议包含

本地文件包含利用之一:包含日志文件getshell

这是一个空的日志文件

当然是404,但是在日志里面已经记录了这个请求了

不过发现get请求的uri是经过url编码的,这样是不能被识别为php代码解析执行的。我们修改ua为<?phpphpinfo();?>再次访问

好的ua这里日志记录进去了,接下来包含日志就能执行php代码了

注意,这里有的默认配置日志文件夹仅允许root可读写,httpd默认用户apache是没权限的,会报错failed to open stream

ermission denied总结

file_get_content、readfile类函数先读取对象的数据流,从文件或者php协议或者file协议或者http协议等读取数据流,而include、require类函数读取数据流后尝试对其进行解析与执行。故可以对数据流进行编码包含输出,导致读取源码或者任意文件下载,还可以花式编码解码绕过waf。

zzz、php://filter/read=/resource=zzz、http://127.0.0.1/zzz、file:///var/www/html/zzz、phar://s.jpg/s.php、zip://s.jpg%23s.php的数据流内容为对应的php代码,包含以上数据流就相当于包含对应php代码,相应协议的具体用法自行百度。

图片马本质是包含解析执行图片里面的php语句。

包含日志文件getshell原理一样,利用httpd日志记录访问情况,控制其中ua字段(由于uri字段会被编码,导致不被识别为php代码),再包含日志实际上也是包含对应的php代码。

so文件包含的目的是直接包含精心构造的恶意php代码,进而直接任意命令执行,当然如果能够直接上传.php文件并解析执行那就更好了,不用绕弯子绕文件包含那么麻烦。然而事情总不会是一帆风顺,在无法直接命令执行的时候(例如无法上传文件,不给上传恶意php代码等),就用文件包含去读源码,读配置文件,万一就找到其他地方存在漏洞了。

LFI(本地文件包含)和RFI(远程文件包含)的区别就在于allow_url_include的设置。allow_url_include=1基本就可以为所欲为了。

一些多余的东西

data:,<文本数据>

data:text/plain,<文本数据>

data:text/html,<HTML代码>

data:text/html;base64,<base64编码的HTML代码>

data:text/css,<CSS代码>

data:text/css;base64,<base64编码的CSS代码>

data:text/javascript,<Javascript代码>

<scriptsrc="data:text/javascript,alert('hello')"/>

data:text/javascript;base64,<base64编码的Javascript代码>

data:image/gif;base64,base64编码的gif图片数据

扫码投喂作者,打多打少是个缘

<imgsrc="https://img-blog.csdnimg.cn/2022010708584723654.png"height="80" width="80"/>

data:image/png;base64,base64编码的png图片数据

data:image/jpeg;base64,base64编码的jpeg图片数据

data:image/x-icon;base64,base64编码的icon图片数据

data:text/html,<html><body><p><b>Hello,world!</b></p></body></html>

-------------------------------------------------------------------------------------------------------

发个小福利

在前30评论中抽一个带入门,传授多年学习(装x)经验,妹子优先,会卖萌会撒娇会嘤嘤嘤者更佳

-------------------------------------------------------------------------------------------------------

include详解 shell_详解php文件包含原理(读取文件源码、图片马、各种协议、远程getshell等) ......相关推荐

  1. php读取图片文件流,详解php文件包含原理(读取文件源码、图片马、各种协议、远程getshell等)...

    详解php文件包含原理(读取文件源码.图片马.各种协议.远程getshell等) 作者是namezz (看完图相当于做了一轮实验系列) 现有文件代码如下 1.png (21.16 KB, 下载次数: ...

  2. php本地文件包含漏洞,php文件包含漏洞利用小结

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

  3. 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】

    卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...

  4. 【多输入模型 Multiple-Dimension 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人 (6/10)】

    多输入模型 Multiple-Dimension 数学原理分析以及源码源码详解 深度学习 Pytorch笔记 B站刘二大人(6/10) 数学推导 在之前实现的模型普遍都是单输入单输出模型,显然,在现实 ...

  5. 基础IO(文件接口、安装内核源码超详细步骤图解、静态库与动态库)

    基础IO C语言的文件操作接口 fopen fclose fread fwrite fseek 系统调用文件接口 open close read write lseek 安装内核源码 文件描述符&am ...

  6. 【CTF题】使用文件包含漏洞读取网页代码

    [CTF题]使用文件包含漏洞读取网页代码 按照我的理解文件包含漏洞是指网页后端php(或其他)代码中使用了include等文件包含语句,而且所包含的文件由变量控制,恰恰此变量又能通过GET或POST等 ...

  7. VC++设置文件最后修改时间(附源码)

      VC++开发常用功能一系列文章 (欢迎订阅,持续更新...) 第21章:VC++设置文件最后修改时间(附源码) 源代码demo已上传到百度网盘:永久生效  ,代码实现了设置文件最后修改时间 上一篇 ...

  8. c语言请按照格式输出英文诗,C措辞文件包含与头文件写法(国外英语资料).doc

    C措辞文件包含与头文件写法(国外英语资料) 袜厦起佬宽方陵驶金网耳创子恩壤减棚逞涎鞭癌授诊湍支腐写蛛浦峻讼鹰募乌摊念楔渊幌化嘘沼串晨蛹沾单盅粉耻箔薯破炬惑抹坏鄂怕彰干腿讣髓雌愚枯翅喘奏侠薄向憎咬诛隋垒 ...

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

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

最新文章

  1. WPS 2019 更新版(8392)发布,搭配优麒麟 19.04 运行更奇妙!
  2. 算法基础知识科普:8大搜索算法之二叉搜索树(中)
  3. 用专业的说一句情话 计算机,用电脑专业说一句情话
  4. Nginx(一)------简介与安装
  5. c5.0 java_机器学习-AdaBoosting及其Java实现
  6. 双硬盘奇怪问题...
  7. TOP100summit:【分享实录-QQ空间】10亿级直播背后的技术优化
  8. ypid编码是什么_国家药品供应保障综合管理信息平台YPID编码规则与应用
  9. 高德地图经纬度比较并返回范围内要求个数可用
  10. 二维码图片如何快速生成
  11. 第一、二、三代半导体的区别在哪里?
  12. [Math]常见矩阵分解及复杂度 Cholesky QR LU
  13. 共享体脂秤为公众号增粉100%真粉活粉吗?
  14. [笑语天下]风景、照片与评论古今
  15. input的type属性值
  16. 思科cisoc 路由器IKEv2配置ipsec tunnel口隧道
  17. 流程银行柜面业务系统规划
  18. Oh!兄嘚,想要提高技能?先从锁的优化开始吧
  19. 4月27日----5月1日二年级课程表
  20. 简易温度检测器电路原理

热门文章

  1. 利用单应性变换方法将自动驾驶汽车拍的照片变换为鸟瞰图
  2. 《自己的伞》——孙溟㠭展篆刻书画
  3. linux 搜索文件内容 包含某个单词,grep命令 查找包含某内容的文件
  4. 仿支付宝金额滚动代码
  5. [c语言]——转义字符表
  6. 跨平台笔记工具-为知笔记
  7. 打印机无法连接计算机,win7系统下打印机无法连接电脑的解决方法
  8. Linux- 系统随你玩之--玩出花活的命令浏览器下
  9. python特性无需修改_python – 2to3说“不需要更改”,然后是“需要修改的文件”...
  10. 异步就是异步,根本就没有 异步非阻塞IO这个说法。阻塞 非阻塞,同步I/O 异步I/O 的区别