代码审计之文件包含漏洞

本文介绍了文件包含漏洞的原理,通常由服务器程序对用户参数过滤不足引起,常见于PHP应用中。文件包含漏洞分为本地文件包含和远程文件包含,涉及的函数包括include、require等。文章还详细阐述了漏洞利用的场景,例如通过动态变量控制文件路径,以及探测漏洞的方法,包括工具扫描和手工探测。最后,讨论了如何利用这些漏洞并提供了相关技巧。
摘要由CSDN通过智能技术生成

1.原理

文件包含是因为服务器端某些程序对用户提交参数过滤不当造成的,该程序一般具有以读取方式输出文件内容或者下载文件,前者也可以叫做任意文件读取,两者本质上是一样的。

1. 通常在以下情况下存在该漏洞。通过在请求参数中传入文件路径,包括相对路径和绝对路径,如:download.php?filename=index.html
2. PHP代码中存在的本地文件包含漏洞,如include、 include_ once、 require、require__once
3. 一Web目录映射到根目录,导致可直接下载任意文件,如:
htttp://127.0.0.1/etc/ passwd

2.介绍

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

程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一一个恶意文件,造成文件包含漏洞。文件包含漏洞在PHP Web Application中居多,而在JSP,ASP,ASP.NET程序中却非常少,甚至没有包含漏洞的存在。

3.导致文件包含的函数:

  • include()
  • include_ once()
  • require()
  • require_ _once()
  • fopen()
  • readfile()
    当使用前4个函数包含一个新的文件时,只要文件内容符合PHP语法规范,那么任何扩展名都可以被PHP解析。包含非PHP语法规范源文件时,将会暴露其源代码。可以使用file://和php://协议进行读取。php://filter/read/ convert. base64-encode/resource=
includerequire区别主要是,include在 包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;require函 数出现错误的时候,会直接报错并退出程序的执行。

而include_ once(),require_ once()这 两个函数,与 前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

返回1.php的源代码

http://127.0.0.1/DVWA-2.0.1/vulnerabilities/fi/?page=php://filter/read/convert.base64-encode/resource=file1.php

在这里插入图片描述在这里插入图片描述

4.文件包含的种类

1、本地文件包含

假如用户可以控制file参数,那么通过控制file的值来读取文件。如etc/passwd等等。

定义了后缀名=>使用%00(%00截断条件: magic_ quotes _gpc = Offphp版本<5.3.4)

读取其他目录=> …目录遍历
这种包含本地文件的形式的漏洞就叫做本地文件包含漏洞

<?php
$file = $_ GET['file'];
if (file_ exists( 'home/' .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值