文件包含漏洞篇
文件包含漏洞原理
程序开发人员通常会把可重复使用的执行函数写在单个文件内,在使用某个函数的时候,直接可以通过文件包含函数,直接调用执行函数文件,无需多次或再次编写,这种调用文件的过程通常被称为包含
产生的原因:
为了代码更加的灵活,开发者会把被包含的文件设置为变量,进行动态调用,从而导致客户端可以调用任意文件,假设攻击者构造恶意代码,并包含了该恶意代码执行文件。
文件包含漏洞可以解析含PHP代码的文件内容 如果文件内 包含php可执行代码 则php程序会被解析并正常执行
产生原因
???PHP文件包含会将一切的文件当成PHP脚本执行
文件包含是php的正常功能,如果包含的文件用户可以控制。且后端代码没有进行严格验证,就会造成文件包含漏洞。
Java、ASP是完全面向对象的语言 不存在文件包含漏洞
产生代码思路
<?php
$filename=$_GET['filename'];
include($filename);
?>
???PHP文件包含常用函数:
-
include include "db_connect.php" 包含db_connect.php脚本文件
- 如果脚本文件不存在,则网站提示报错,不影响执行 -
include_once incluede_once "db_connect.php" 只包含一次php脚本文件
- 如果脚本文件不存在,则网站提示报错,不影响执行程序继续执行 -
require incluede_once "db_connect.php" 包含db_connect.php脚本文件
- 如果脚本文件不存在,则网站出现致命错误并终止执行 -
require_once incluede_once "db_connect.php" ** 只包含一次php脚本文件
- 如果脚本文件不存在,则网站出现致命错误**并终止执行
代码审计思路:搜索可能产生漏洞的函数
include
include_once
require
require_once
防御方法
对文件包含内容做判断;文件包含处写死
文件包含漏洞利用
文件包含漏洞分类
本地文件包含
allow_url_fopen=On/Off(php默认就是On)
allow_url_include=On/Off(php默认是Off)
远程文件包含
allow_url_fopen=On/Off(php默认就是On)
allow_url_include=On/Off(php默认是Off,远程文件包含需要手动开启很少遇见)
利用方法
- 读取任意文件 绝对路径?file=/etc/passwd
- 相对路径?file=../../../../etc/passwd
- 和文件上传漏洞共同利用,包含图片马
利用核心
php文件包含会把一切的文件都当做php脚本执行
??windows 本地host 文件C:/windows/system32/drivers/etc/hosts
绕过方法:
%00截断
条件:
1.magic_quotes_gpc = Off
2.php 版本低于5.3.4
3.远程文件包含
远程文件包含可以包含任意的url链接进行调用
绕过方法:
- ?绕过
-
绕过 在url中#需要编码
- %20空格绕过
- 攻击机主动更改后缀名
PHP伪协议
file://访问本地系统文件 必须跟上绝对路径 读取本地文件
(allow_url_fopen和allow_url_include无论开关都可以)
php://filter 常用于读取文件/源码
(allow_url_fopen和allow_url_include无论开关都可以)
读取php文件时可以防止其执行 所以使用该伪类协议 对文件内容进行编码输出的处理
base64编码方法
?path=php://filter/read=convert.base64-encode/resource=文件.php txt
rot13加密方法
?path=php://filter/string.rot13/resource=文件.php
php://filter协议和file://协议的区别
file://伪协议只能使用绝对路径
php:filter//伪协议可以相对路径和绝对路径都可以使用
php://input 接收POST请求体当作PHP代码执行
接收POST体当作php代码执行
allow_url_fopen off/on
offallow_url_incluede On 必须开启
burpsuite 执行演示
其它伪协议的使用方法
zip:// 读取Zip文件内容
allow_url_fopen;allow_url_include 无论开关
【必须是绝对路径】包含读取zip文件中内容
?id=zip://D/phpStudy/www/file.zip%23test.txt
data://text/plain 把GET请求参数中的一部分字符串当作PHP脚本执行
allow_url_fopen;allow_url_include 都需打开
伪协议编码
data://text/plain,<?php phpinfo()?>
对base64编码后的字符进行php代码执行
data://text/plain;base64,[执行脚本]
base64编码是 出现+号 在URL中 出现 需要二次编码