文件包含漏洞原理

程序开发人员通常会把可重复使用的执行函数写在单个文件内,在使用某个函数的时候,直接可以通过文件包含函数,直接调用执行函数文件,无需多次或再次编写,这种调用文件的过程通常被称为包含
产生的原因:
为了代码更加的灵活,开发者会把被包含的文件设置为变量,进行动态调用,从而导致客户端可以调用任意文件,假设攻击者构造恶意代码,并包含了该恶意代码执行文件。
文件包含漏洞可以解析含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

防御方法

对文件包含内容做判断;文件包含处写死

文件包含漏洞利用

image

image

文件包含漏洞分类

本地文件包含

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,远程文件包含需要手动开启很少遇见)

利用方法

  1. 读取任意文件 绝对路径?file=/etc/passwd
  2. 相对路径?file=../../../../etc/passwd
  3. 和文件上传漏洞共同利用,包含图片马

利用核心

php文件包含会把一切的文件都当做php脚本执行
⭐⭐windows 本地host 文件C:/windows/system32/drivers/etc/hosts

image

绕过方法:
%00截断
条件:
1.magic_quotes_gpc = Off
2.php 版本低于5.3.4

3.远程文件包含
远程文件包含可以包含任意的url链接进行调用
image

image

image

绕过方法:

  1. ?绕过
  2. 绕过 在url中#需要编码

  3. %20空格绕过
  4. 攻击机主动更改后缀名

PHP伪协议

file://访问本地系统文件 必须跟上绝对路径 读取本地文件

(allow_url_fopen和allow_url_include无论开关都可以)

image

php://filter 常用于读取文件/源码

image

(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代码执行

image

image

allow_url_fopen off/on
offallow_url_incluede On 必须开启

burpsuite 执行演示

image

其它伪协议的使用方法

image

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中 出现 需要二次编码

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/Webkio/p/16394819.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!