相关函数

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.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
image.png

例题:http://106.12.37.37:10008

data://

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

image.png
image.png

日志文件

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

系统环境 mark 一下以后在写

session

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

看烦了,先看点别的