文件包含漏洞

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件, 而无需再次编写,这中文件调用的过程一般被称为文件包含。 程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用, 但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。 几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多, 而在JSP、ASP、ASP.NET程序中却非常少,甚至没有,这是有些语言设计的弊端。 在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。

0x001 常见文件包含函数

include()

执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行

require()

只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本

include_once()和require_once()

若文件中代码已被包含则不会再次包含

0x002 利用条件

*程序用include()等文件包含函数通过动态变量的范式引入需要包含的文件

*用户能够控制该动态变量

注:PHP中只要文件内容符合PHP语法规范,包含时不管扩展名是什么都会被PHP解析,
若文件内容不符合PHP语法规范则会暴漏其源码

0x003 分类

  • LFI(Local File Inclusion)
    本地文件包含漏洞,顾名思义,指的是能打开并包含本地文件的漏洞。大部分情况下遇到的文件包含漏洞都是LFI。简单的测试用例如前所示。

  • RFI(Remote File Inclusion)
    远程文件包含漏洞。是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。
    但RFI的利用条件较为苛刻,需要php.ini中进行配置

    allow_url_fopen = On
    allow_url_include = On

两个配置选项均需要为On,才能远程包含文件成功。

0x004 包含姿势

下面例子中测试代码均为:

<?php
	$file = $_GET['file'];
	include $file;
?>

allow_url_fopen 默认为 On
allow_url_include 默认为 Off

若有特殊要求,会在利用条件里指出。

  • php伪协议

php://input
利用条件:

allow_url_include = On。

对allow_url_fopen不做要求。
姿势:
使用php流,来向文件中写入数据。实现包含
在这里插入图片描述

  • php://filter

利用条件:无

index.php?file=php://filter/read=convert.base64-encode/resource=index.php

通过指定末尾的文件,可以读取经base64加密后的文件源码,之后再base64解码一下就行。虽然不能直接获取到shell等,但能读取敏感文件危害也是挺大的。

import base64
base64.b64decode("PD9waHAgDQoJJGZpbGUgPSAkX0dFVFsnZmlsZSddOw0KCWluY2x1ZGUgJGZpbGU7DQo/Pg==")

b"<?php \r\n\t$file = $_GET['file'];\r\n\tinclude $file;\r\n?>"

各系统中敏感文件

windows

c:\boot.ini
c:\windows\systems32\inetsrv\MetaBase.xml
c:\windows\repair\sam
c:\windows\php.ini           php配置文件
c:\windows\my.ini            mysql配置文件

linux

普通权限:
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值