草庐IT

【web安全】——文件包含漏洞

白昼安全 2023-10-09 原文

作者名:Demo不是emo 

主页面链接:主页传送门
创作初心:
一切为了她​​​​​​​
座右铭:不要让时代的悲哀成为你的悲哀
专研方向:网络安全,数据结构

每日emo:可后来,除了梦以外的地方,我再也没有见过你

目录

一:初识文件包含漏洞

1.简析文件包含

2.文件包含漏洞

二:常见的文件包含函数

三:文件包含漏洞分类 

1、本地文件包含

2、远程文件包含漏洞

四:通过php伪协议进行包含

1、通过file://包含 

[1]、条件:     

2、通过php://包含

[1]、条件:     

[2]、作用:   

3.通过Zip:// & zlib:// 协议包含 

[1]、条件:  

[2]、作用:   

4.data://协议包含

[1]、条件:     

[2]、作用:

[3]、用法:

 5.phar://协议包含: 

[1]、条件:   


一:初识文件包含漏洞

1.简析文件包含

 在程序员开发过程中,通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无需在此编写,这种调用文件的过程一般被称为文件包含

2.文件包含漏洞

 随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。

二:常见的文件包含函数

1、include()
当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,然后继续向下执行。

2、include_once()
功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次

3、require()
Require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。

4、require_once()
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

5、highlight_file()、show_source()
函数对文件进行语法高亮显示,通常能看到源代码

6、readfile()、file_get_contents()、
函数读取一个文件,并写入到输出缓冲

7、fopen()
打开一个文件或者url

几乎所有的脚本语言中都提供文件包含的功能,但文件包含漏洞在PHP中居多,而在JSP\ASP\ASP.NET程序中非常少,甚至没有文件包含漏洞的存在。 

三:文件包含漏洞分类 

1、本地文件包含

当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。

2、远程文件包含漏洞

本地文件包含和远程文件包含造成漏洞的原因是一样的,

当php.ini 中的配 置选项allow_url_fopen和allow_url_include为ON的话,则包含的文件可以 是第三方服务器中的文件,这样就形成了远程文件包含漏洞。

所以远程文件包含条件:     需要满足两个条件在php.ini中。当php.ini 中的配置选项  

 allow_url_fopen:on   

 allow_url_include:on 

四:通过php伪协议进行包含

PHP伪协议事实上就是PHP支持的协议与封装协议

1、File://          -- 访问本地文件系统 
2、http://          --访问http(s)网址 
3、Phar://           --PHP归档 
4、Php://          --访问各个输入/输出流 
5、Zlib://          --压缩流 
6、Data://          --数据
7、Glob://   		--查找匹配的文件路径模式
8、ftp://   		--访问ftp(s)URLs
9、ssh2:// 		--Secure Shell 2
10、rar:// 		--RAR
11、ogg:// 		--音频流
12、expect:// 		--处理交互式的流

1、通过file://包含 

[1]、条件:     

(1)    allow_url_fopen:off/on 都可以     

(2)     allow_url_include:off/on都可以 [2]、作用:     用于访问本地文件系统,通常用于读取本地文件而且不会收到allow_url_fopen和allow_url_include的影响。     在include()/require()/include_once()/require_once()参数可控的情况下,如果导入非.php的文件,则仍按照php语法进行解析,因为这个是include()函数决定的。 

2、通过php://包含

[1]、条件:     

(1)allow_url_fopen:off/on都可以     

(2)allow_url_include: 仅php://input 、php://stdin php://memory、 php://temp 需要on

[2]、作用:   

 Php://伪协议有很多的用法,常用的就是

php://filter 用于读源码。

Php://input用于执行php代码 

Php://filter参数详解:

该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:

resource=<要过滤的数据流>                  必须项。它指定了你要筛选过滤的数据流。

read=<读链的过滤器>            可选项。可以设定一个或多个过滤器名称,以管道符隔开

write=<写链的过滤器>            可选项。可以设定一个或多个过滤器名称,以管道符隔开

<;两个链的筛选列表>                      任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况                                                    应用于读或写链 

转换过滤器:非常重要

convert.base64-encode
//等同于base64_encode(),base64编码

convert.base64-decode   
//等同于base64_decode(),base64解码

还有很多的过滤器,这里就不多讲了,后期会出一期博客专门来介绍 

  例子:使用php://filter配合转换器读取flag.php文件

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

利用php://input :   

 此协议需要allow_url_include为on,可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。 

php://input 是个可以访问请求的原始数据的只读流。 所以enctype="multipart/form-data" 的时候 php://input 是无效的。 

3.通过Zip:// & zlib:// 协议包含 

[1]、条件:  

allow_url_fopen:off/on都可以的   

allow_url_include :off/on都可以的 

[2]、作用:   

 zip:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。 

4.data://协议包含

[1]、条件:     

allow_url_fopen:on  

allow_url_include :on

[2]、作用:

自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。

[3]、用法:

Data://text/plain   

Data://text/plain;base64,

 5.phar://协议包含: 

phar://协议与zip://类似,同样可以访问zip格式压缩包内容。

[1]、条件:   

allow_url_fopen:off/on都可以的     

allow_url_include :off/on都可以的

有关【web安全】——文件包含漏洞的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  9. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐