百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

初学者指南——文件包含(LFI / RFI)

liebian365 2024-11-21 17:35 20 浏览 0 评论

在C语言中文件包含是指一个源文件可以将另一个源文件的全部内容包含进来。该命令的作用是在预编译时,将指定源文件的内容复制到当前文件中。文件包含是C语言预处理命令三个内容之一。一个大程序,通常分为多个模块,并由多个程序员分别编程。有了文件包含处理功能,就可以将多个模块共用的数据(如符号常量和数据结构)或函数,集中到一个单独的文件中。这样,凡是要使用其中数据或调用其中函数的程序员,只要使用文件包含处理功能,将所需文件包含进来即可,不必再重复定义它们,从而减少重复劳动和定义不一致造成的错误。

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

程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,而在JSP、ASP、ASP.NET程序中却非常少,甚至没有,这是有些语言设计的弊端。在PHP中经常出现包含漏洞,但这并不意味着其他语言不存在。

php中引起文件包含漏洞的4个函数:include()、include_once()、require()、require_once()

区别如下:

include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。

require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。

image.png

require_once() 和 include_once() 功能与require() 和 include() 类似。但如果一个文件已经被包含过了,则 require_once() 和 include_once() 则不会再包含它,以避免函数重定义或变量重赋值等问题。

当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。测试代码:

在同目录下有个phpinfo.txt,其内容为<? phpinfo(); ?>。则只需要访问

即可成功解析phpinfo。

场景

具有相关的文件包含函数。

文件包含函数中存在的动态变量,比如include $file;。

攻击者能够控制该变量,比如 $file = $_GET['file'];。

分类

文件包含分为:本地(LFI)/远程(RFI)包含

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

远程文件包含漏洞。是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。

但RFI的利用条件较为苛刻,需要php.ini中进行配置

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

另外一台需要开启apache

注:在php.ini中,allow_url_fopen默认一直是On,而 allow_url_include 从php5.2之后就默认为Off。

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

allow_url_fopen 默认为 On

allow_url_include 默认为 Off

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

PHP伪协议以及其他封装协议的利用

php://input

利用条件:

allow_url_include = On。

对allow_url_fopen不做要求。

包含姿势

命令执行

写入一句话木马,有写入的权限

php://filter

利用条件:无甚

姿势:

index2.php?file=php://filter/read=convert.base64-encode/resource=index.php的含义

首先这是一个file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.php表示目标文件为index.php。

举个例子

其他姿势:

效果跟前面一样,少了read等关键词。在绕过一些waf时也许有用。

phar协议&&zip协议

利用phar://协议特性可以在渗透过程中帮我们绕过一些waf检测此方法使用要php版本大于等于php5.3.0

phar://

利用条件:php版本大于等于php5.3.0

姿势:

假设有个文件phpinfo.txt,起内容为<?php phpinfo(); ?>,打包成zip压缩包,如下:

指定绝对路径

或者使用相对路径(这里phpinfo.zip就在当前目录下)

zip://

关于zip://

php版本大于等于php5.3.0

姿势:

构造zip包的方法同phar。

但使用zip协议,需要指定绝对路径,同时讲#编码为%23,之后填上压缩包内的文件。

注:若是使用相对路径,则会包含失败。

data:URI schema

利用条件:

php版本大于等于php5.2

allow_url_fopen = On

allow_url_include = On

姿势

执行命令:

姿势二:

加号+的url编码为%2b,PD9waHAgcGhwaW5mbygpOz8+的base64解码为:<?php phpinfo();?>

执行命令

其中PD9waHAgc3lzdGVtKCd3aG9hbWknKTs/Pg==的base64解码为:<?php system('whoami');?>

包含session

利用条件:session文件路径已知,且其中内容部分可控。

思路:结合phpmyadmin,因为phpmyadmin每次登录时,会带上session

session文件的绝对路径可在phpinfo中查看,session.save_path

常见的php-session存放位置还有这几个:

使用以下命令可查看到session文件中的登录信息

登录phpmyadmin时,用户名输入一句话木马,再包含session文件,可getshell

解决方式:

在浏览器里有你的cookie所以你可以直接去访问对应的文件包含页面,用菜刀的话是没有cookie的所以你没有办法去访问文件包含页面也就是fi那个页面。所以说会自动跳转到登录页面,显示200ok

加上cookie之后再重新链接,成功连接

包含日志文件

当我们没有上传点,并且也没有url_allow_include功能时,我们就可以考虑包含服务器的日志文件。

利用思路也比较简单,当我们访问网站时,服务器的日志中都会记录我们的行为,当我们访问链接中包含PHP一句话木马时,也会被记录到日志中。

这时候我们如果知道服务器的日志位置,我们可以去包含这个文件从而拿到shell。其实整个“包含日志文件漏洞利用”最关键的就是找日志存放的“物理路径”,只要找到日志的物理存放路径,一切就可以按部就班的完成利用了。

利用的条件:

  • 1、日志的物理存放路径
  • 2、存在文件包含漏洞

获取日志存放路径

日志默认路径:

apache+Linux日志默认路径:

/etc/httpd/logs/access_log或/var/log/httpd/access_log

apache+win2003日志默认路径:

D:\xampp\apache\logs\access.log

D:\xampp\apache\logs\error.log

IIS6.0+win2003默认日志文件:

C:\WINDOWS\system32\Logfiles

IIS7.0+win2003 默认日志文件:

%SystemDrive%\inetpub\logs\LogFiles

nginx 日志文件:

日志文件在用户安装目录logs目录下

以我的安装路径为例/usr/local/nginx,

那我的日志目录就是在/usr/local/nginx/logs里

首先,我们直接使用浏览器来构造“php一句话报错请求信息”服务自动记录此一句话信息到服务器日志文件中;

具体构造内容:

测试结果:失败

利用文件包含漏洞直接访问“服务日志文件”,发现文件包含漏洞并未对构造的php一句话进行正常解析,观察发现是构造的PHP一句话中的相关字符在记录进日志文件后,相关的字符被转码了,导致PHP解析失败,具体失败原因见“失败原因分析”

失败原因分析

一句话写入日志文件的利用过程是,利用浏览器直接构造一个关于请求资源的报错信息,消息中包含依据。报错信息服务自动记录到日志文件,但实际测试发现写入日志文件内的报错信息发生了字符转码:

日志文件内容如上图所示:

最后写入到日志文件中的一句话就变成了 %3C?php%20@eval($_POST[c]);?%3E。

失败总结

浏览器直接构造的PHP一句话中特殊字符,会被浏览器自动进行URL转义,导致最终写入日志文件中的PHP一句话包含了这些特殊字符,而这些转码后的编码PHP并不能进行正常的解析。

构造一句话,写入日志文件测试记录

burpsuit 代理抓包改包构造一句话写入日志文件

burpsuit 代理抓包,修改浏览器转码字符,写入正确的php一句话木马到服务器日志文件。

测试记录:成功

通过文件包含直接访问服务日志文件,发现一句话被执行成功;

在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log,还可以包含Apache的错误访问日志

首先,构造一个会报错的访问链接,将利用代码(PHP一句话)写入错误日志记录中

这个链接直接访问的话,一句话会被编码成%3C?php%20@eval($_POST[c]);?%3E,所以需要使用Burp suite改一下包。

对所截获的包进行修改,点击go,返回403报错,服务器错误日志文件成功将此次记录到error.log中

我们根据日志的路径构造访问路径:

客户端连接,获取一句话木马

相关推荐

go语言也可以做gui,go-fltk让你做出c++级别的桌面应用

大家都知道go语言生态并没有什么好的gui开发框架,“能用”的一个手就能数的清,好用的就更是少之又少。今天为大家推荐一个go的gui库go-fltk。它是通过cgo调用了c++的fltk库,性能非常高...

旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗

这几天老毛桃整理了几个微型Linux发行版,准备分享给大家。要知道可供我们日常使用的Linux发行版有很多,但其中的一些发行版经常会被大家忽视。其实这些微型Linux发行版是一种非常强大的创新:在一台...

codeblocks和VS2019下的fltk使用中文

在fltk中用中文有点问题。英文是这样。中文就成这个样子了。我查了查资料,说用UTF-8编码就行了。edit->Fileencoding->UTF-8然后保存文件。看下下边的编码指示确...

FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库

FLTK(FastLightToolkit)是一个轻量级的跨平台GUI库,特别适用于开发需要快速、高效且简单界面的应用程序。本文将介绍Python中的FLTK库,包括其特性、应用场景以及如何通过代...

中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux

IT之家1月29日消息,去年6月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能RISC-V处理器核心——香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后...

Linux 5.13内核有望合并对苹果M1处理器支持的初步代码

预计Linux5.13将初步支持苹果SiliconM1处理器,不过完整的支持工作可能还需要几年时间才能完全完成。虽然Linux已经可以在苹果SiliconM1上运行,但这需要通过一系列的补丁才能...

Ubuntu系统下COM口测试教程(ubuntu port)

1、在待测试的板上下载minicom,下载minicom有两种方法:方法一:在Ubuntu软件中心里面搜索下载方法二:按“Ctrl+Alt+T”打开终端,打开终端后输入“sudosu”回车;在下...

湖北嵌入式软件工程师培训怎么选,让自己脱颖而出

很多年轻人毕业即失业、面试总是不如意、薪酬不满意、在家躺平。“就业难”该如何应对,参加培训是否能改变自己的职业走向,在湖北,有哪些嵌入式软件工程师培训怎么选值得推荐?粤嵌科技在嵌入式培训领域有十几年经...

新阁上位机开发---10年工程师的Modbus总结

前言我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。我一直认为Modbus协议的存...

创建你的第一个可运行的嵌入式Linux系统-5

@ZHangZMo在MicrochipBuildroot中配置QT5选择Graphic配置文件增加QT5的配置修改根文件系统支持QT5修改output/target/etc/profile配置文件...

如何在Linux下给zigbee CC2530实现上位机

0、前言网友提问如下:粉丝提问项目框架汇总下这个网友的问题,其实就是实现一个网关程序,内容分为几块:下位机,通过串口与上位机相连;下位机要能够接收上位机下发的命令,并解析这些命令;下位机能够根据这些命...

Python实现串口助手 - 03串口功能实现

 串口调试助手是最核心的当然是串口数据收发与显示的功能,pzh-py-com借助的是pySerial库实现串口收发功能,今天痞子衡为大家介绍pySerial是如何在pzh-py-com发挥功能的。一、...

为什么选择UART(串口)作为调试接口,而不是I2C、SPI等其他接口

UART(通用异步收发传输器)通常被选作调试接口有以下几个原因:简单性:协议简单:UART的协议非常简单,只需设置波特率、数据位、停止位和校验位就可以进行通信。相比之下,I2C和SPI需要处理更多的通...

同一个类,不同代码,Qt 串口类QSerialPort 与各种外设通讯处理

串口通讯在各种外设通讯中是常见接口,因为各种嵌入式CPU中串口标配,工业控制中如果不够还通过各种串口芯片进行扩展。比如spi接口的W25Q128FV.对于软件而言,因为驱动接口固定,软件也相对好写,因...

嵌入式linux为什么可以通过PC上的串口去执行命令?

1、uboot(负责初始化基本硬bai件,如串口,网卡,usb口等,然du后引导系统zhi运行)2、linux系统(真正的操作系统)3、你的应用程序(基于操作系统的软件应用)当你开发板上电时,u...

取消回复欢迎 发表评论: