相关函数
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 代码就可以
data://
data://text/plain/;base64,php 马的 base64 形式,注意 + 要 url 编码
日志文件
在 linux 下,日志一般都在 var/log 下面
通过 bp 抓包,改请求头上的内容,比如就可以让日志文件包含我们需要的内容,通过包含日志文件就可以了,但是通常情况用户是没有权限去读取日志文件的
系统环境 mark 一下以后在写
session
PHP 默认生成 session 文件在/tmp 下
在 php.ini 文件中存在 session.upload_progress.enabled 这个参数,默认开启,会在上传过程中生成上传进度文件,它的存储路径可以在 phpinfo 中找到
看烦了,先看点别的