1.文件包含小知识

1.1 包含函数

  1. PHP共有4个与文件包含相关的函数:

include

require

include_once

require_once

  1. include与include_once的区别:

(1)include:会将指定的文件载入并执行里面的程序;重复引用的情况下加载多次。

例如:

这里include两次1.php文件,所以就会包含1.php两次。

(2)Include_once:会将指定的文件载入并执行里面的程序;此行为和include语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。

例如:

这里include_once了两次1.php文件,但只会包含1.php一次。

(3)require和requireonce的用途与上面两个一样,但区别就是require和requireonce会加载页面最开始执行。Include和include_once会按代码顺序执行。

1.2 支持的协议和封装协议

file:// ------访问本地文件系统
http(s):// ------访问HTTP(s)网址
ftp:// ------访问FTP(s) URLs
php:// ------访问各个输入/输出流(I/O streams)
zlib:// ------压缩流
data:// ------数据(RFC 2397)
glob:// ------查找匹配的文件路径模式
phar:// ------PHP归档
ssh2:// ------Secure Shell 2
rar:// ------RAR
ogg:// ------音频流
expect:// ------处理交互式的流

1.3 常用伪协议

  1. file://

(1)这个协议可以展现本地文件系统,默认目录是当前的工作目录。

(2)例如:file:///etc/passwd、file://key.txt

  1. php://

(1) php://input是个可以访问请求的原始数据的只读流,可以访问请求的原始数据的只读流,将post请求中的数据作为php代码执行。

(2) php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。

  1. phar://

(1)phar://数据流包装器自PHP5.3.0起开始有效

(2)例如:phar://E:/phpstudy/www/1.zip/phpinfo.txt | phar://1.zip/phpinfo.txt

1.4 伪协议利用方式小总结

2.getshell总结

2.1 Getshell之session

条件:session文件路径已知,且session文件中内容部分可控。

获取session文件路径:

  1. session文件的保存路径可以在phpinfo的session.save_path看到。

  1. 默认路径:

    /var/lib/php/sess_PHPSESSID

    /var/lib/php/sess_PHPSESSID

    /tmp/sess_PHPSESSID

    /tmp/sessions/sess_PHPSESSID

    session的文件名格式为sess_[phpsessid]。而phpsessid在发送的请求的cookie字段中可以看到

利用:

1.要包含并利用的话,需要能控制部分sesssion文件的内容。可以先包含进session文件,观察里面的内容,然后根据里面的字段来发现可控的变量,从而利用变量来写入payload,并之后再次包含从而执行php代码。

2.例如现在有一个session.php可控用户会话信息值:

3.可以看到这个session.php文件中的用户会话信息username的值是用户可控制的,那我们就可以传入恶意代码进行攻击利用。

4.将恶意代码传入以后,接下来就要利用文件包含漏洞去包含这个恶意代码。

5.从返回结果来看,我们的payload和恶意代码已经正常解析和执行。

2.2 Getshell之日志

2.2.1 访问日志

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

日志存储默认路径:

1.apache+Linux日志默认路径:/etc/httpd/logs/accesslog或/var/log/httpd/accesslog

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

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

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

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

利用:

1.多数情况,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在/etc/httpd/logs/下。

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



3.正常的php代码已经写入了 /etc/httpd/logs/access.log。然后包含即可执行代码。



4.但有的时候,log的存放地址会被更改。这个时候可以通过读取相应的配置文件后,再进行包含。

中间件默认配置文件存放路径:

1.apache+linux 默认配置文件
/etc/httpd/conf/httpd.conf或/etc/init.d/httpd 2. IIS6.0+win2003 配置文件
C:/Windows/system32/inetsrv/metabase.xml 3. IIS7.0+WIN 配置文件
C:\Windows\System32\inetsrv\config\applicationHost.config

2.2.2 SSH log

条件:需要知道ssh-log的位置,且可读。

ssh日志默认路径:

1./var/log/auth.log

2./var/log/secure

利用:

1.用ssh连接:

ssh \'\<?php phpinfo(); ?>\'\@remotehost

之后会提示输入密码,随便输入就可以。

2.然后利用文件包含,包含日志文件:

2.3 Getshell之environ

条件:

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

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

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

利用:

  1. proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到environ中。之后再包含它,即可。

  2. 例如我们现在访问一个网站,使用burpsuite抓包,将恶意代码插入到user-agent中。

3.利用文件包含漏洞去包含proc/self/environ,成功执行php代码。

2.4 Getshell之利用phpinfo

条件:

存在phpinfo页面并且存在文件包含漏洞

原理:

1.当我们给PHP发送POST数据包时,如果数据包里包含文件区块,PHP就会将文件保存成一个临时文件,路径通常为:/tmp/php[6个随机字符],这个临时文件,在请求结束后就会被删除。

2.因为phpinfo页面会将请求上下文中的所有变量打出来,所以我们如果向phpinfo页面发送包含文件区块的数据包,就可以在返回包里找到临时文件名,也就是\$_FILES变量中的内容。

利用:

原理:

那么为什么vulhub的脚本是如何做到在临时脚本文件删除前去包含的呢,其实就是用到了条件竞争,具体流程大致如下:

1.首先发送包含webshell的数据包给phpinfo页面,并用大量的垃圾数据将header和get等位置填满。

2.因phpinfo页面会将所有数据打印出来,第一个步骤中的垃圾数据就会将phpinfo页面撑的非常大。而php默认输出缓冲区大小为4096,也可以理解为php每次返回4096个字节给socket连接。

3.所以,这里直接操作原生socket,每次读取4096个字节。只要我们读取到字节里包含临时文件名,就立刻发送文件包含漏洞利用的数据包。因为第一个数据包的socket连接没有结束,所以临时文件还没有删除,我们就可以文件包含成功。

2.5 Getshell之上传文件

条件:

有上传点,知道上传上去的文件名和存放目录。

利用:

  • 这里用一个靶场简单演示一下,找个文件上传点,上传一个带有php恶意代码的图片。

  • 我们现在已知文件名称和路径,可以利用文件包含漏洞去包含这个图片,就可以成功执行php代码了。

3.防护措施

1、在很多场景中都需要去包含web目录之外的文件,如果php配置了open_basedir,则会包含失败。

2、对可以包含的文件进行限制,可以采用白名单的方式,或设置可以包含的目录。

3、对危险字符进行过滤。

4、尽量不使用动态包含等等

Refer:https://mp.weixin.qq.com/s/IT6bbaG7zBbnrvcNPYr1_w

PHP文件包含总结的更多相关文章

  1. PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)

    摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...

  2. Linux C编程学习之C语言简介---预处理、宏、文件包含……

    C的简介 C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的 C语言的表达能力十分强大.C语言兼顾了高级语言和汇编语 ...

  3. PHP 文件包含总结 include require 命名空间 autoload spl_autoload_register 读取文件路径

    总结: 1. include或require包含其他文件 使用./或者 ../,这里的当前路径和上一层路径,取决于运行脚本的路径,会存在如下问题. 在写PHP程序时,经常要用到include或requ ...

  4. ORACLE查看数据文件包含哪些对象

    在上篇ORACLE查看表空间对象中,我介绍了如何查询一个表空间有那些数据库对象,那么我们是否可以查看某个数据文件包含那些数据库对象呢?如下所示 SELECT  E.SEGMENT_TYPE       ...

  5. PHP任意文件包含绕过截断新姿势

    前言 此方法是@l3m0n叔叔给我分享的,原文已经发布在90sec 我没有90sec的账号,所以自己实践一下,顺道安利给访问我博客的小伙伴. 适用情况 可以控制协议的情况下,如果%00无法截断包含,可 ...

  6. error C2504 类的多层继承 头文件包含

    error C2504:头文件包含不全 今天碰到了很烦的问题,继承一个类之后,感觉头文件都包含了,可还是出现父类未定义的问题,最后发现,子类的子类在实现时,需要在cpp文件中包含所有他的父类的定义.因 ...

  7. c++ 头文件包含问题-include&class

    http://blog.csdn.net/jiajia4336/article/details/8996254 前向声明概念(forward declaration) 在程序中引入了类类型的B.在声明 ...

  8. phpmyadmin任意文件包含漏洞分析(含演示)

    0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...

  9. Linux Shell系列教程之(十七) Shell文件包含

    本文是Linux Shell系列教程的第(十七)篇,更多Linux Shell教程请看:Linux Shell系列教程 通过文件包含,可以引用其他文件的内容,也可以将复杂内容分开,使程序结构更加清晰. ...

  10. C语言 预处理一(文件包含--#include)

    //预处理命令不需要在结束末尾加":" //#inlude可以包含任意类型的文件 //#inlude 将一个源文件的全部内容包含到另一个源文件中,成为它的一个部分,文件包含的一般格 ...

随机推荐

  1. pandas之sql操作

    我们知道,使用 SQL 语句能够完成对 table 的增删改查操作,Pandas 同样也可以实现 SQL 语句的基本功能.本节主要讲解 Pandas 如何执行 SQL 操作.首先加载一个某连锁咖啡厅地 ...

  2. [VMware]常见问题处理

    参考文献 [1] VMware 无法打开虚拟机 该虚拟机似乎正在使用 - 百度经验 [2] 233 http://10.0.8.46:8080/cas/autologin?username=admin ...

  3. 【Diary】CSP-S 2020 游记

    一年 好快 从三百多天倒计时 一点一点掂着 又回来了 但是时间永远不会等待你. --??? CSP-J1/S1 CSP-J1/S1 Day0 请了一上午假. 这段时间都在摸鱼,作业没写( 多备赛一个上 ...

  4. Java 开源项目整合

    在JAVA学习过程中,学习到的简单项目,在这里记录下. SSM框架的整合 使用到的框架:SpringMVC + Spring + MyBatis 地址:https://github.com/liyif ...

  5. .NET Core MongoDB数据仓储和工作单元模式实操

    前言 上一章节我们主要讲解了MongoDB数据仓储和工作单元模式的封装,这一章节主要讲的是MongoDB用户管理相关操作实操.如:获取所有用户信息.获取用户分页数据.通过用户ID获取对应用户信息.添加 ...

  6. 从ReentrantLock角度解析AQS

    是它,是它,就是它,并发包的基石: 一.概述 闲来不卷,随便聊一点. 一般情况下,大家系统中至少也是JDK8了,那想必对于JDK5加入的一系列功能并不陌生吧.那时候重点加入了java.util.con ...

  7. Linux 阶段二

    1.2 安装JDK JDK具体安装步骤如下: 1). 上传安装包 使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux 由于上述在进行文件上传时,选择的上传目录为根目录 /,上 ...

  8. TiDB在X86和ARM混合平台下的离线部署和升级

    [是否原创]是 [首发渠道]TiDB 社区 背景 在之前我们团队发布了TiDB基于X86和ARM混合部署架构的文章:TiDB 5.0 异步事务特性体验--基于X86和ARM混合部署架构,最近有朋友问到 ...

  9. win10 双开微信 微信双开

    方法1:鼠标连续点击实现Windows微信双开在桌面上找到微信图标,鼠标左键连续点击2次为打开一个微信,连续点击8次就打开了4个微信. 注意:不要连续点开太多防止卡顿. 方法2:回车键双击微信图标实现 ...

  10. [C++基础入门] 4、 程序流程结构

    文章目录 4 程序流程结构 4.1 选择结构 4.1.1 if语句 4.1.2 三目运算符 4.1.3 switch语句 4.2 循环结构 4.2.1 while循环语句 4.2.2 do...whi ...