文章目录
前言
概述
在web后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用“包含”函数功能。比如把一系列功能函数都写进function.php中,之后当某个文件需要调用的时候就直接在文件头中写上一句<?php include function.php?>就可以调用函数代码。
但有些时候,因为网站功能需要,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对要包含的这个文件进行安全考虑,就导致攻击者可以通过修改包含文件的位置来让后台执行任意文件(代码)。
这种情况称为“文件包含漏洞”。分为 “本地文件包含漏洞” 和 “远程文件包含漏洞” 两种情况。
包含函数
通过include()或require()语句,可以将PHP文件的内容插入到另一个PHP文件(在服务器执行它之前)。
include和require语句是相同的,除了错误处理方面:
require会生成致命错误(E_COMPILE_ERROR)并停止脚本
include只生成警告(E_WARNING),并且脚本会继续
一、本地文件包含漏洞
流程:
(1)随便选择一位球员姓名,就可以查看到他的信息,观察URL可以发现,每位球员都调用了一个对应的文件file*:
(2)在此处做修改,比如在pikachu目录的vul下放置了一个o.txt文件,那么就可以通过修改访问到o.txt:
注意:如果对方使用的是linux系统,那么就会有passwd文件泄露的风险。
二、远程文件包含漏洞
远程包含漏洞的前提:如果使用的include和require,则需要php.ini配置如下:
allow_url_fopen=On //默认打开
allow_url_include=On
或者直接在phpstudy中将php设置中的文件包含按钮打开。
流程:
(1)随便选择一位球员,查看他的信息,并观察URL:
(2)构造恶意站点,编写一个一句话木马文件:
(3)将(1)红框中的filename改为一句话木马文件的路径:
提交之后可以发现,在后端多了一个一句话木马文件:
内容为:
(4)通过对x的赋值进行操作:
比如这样就可以查看到IP地址。
防范措施
1.在功能设计上尽量不要将文件包含函数对应的文件放给前端进行选择和操作。
2.过滤各种…/…/ , http:// ,https://
3.配置php.ini配置文件:
allow_url_fopen=off
Allow_url_include=off
magic_quotes_gpc=on
4.通过白名单策略,仅允许包含运行制定的文件,其他的都禁止。