一、文件包含漏洞:不止是“偷梁换柱”那么简单
说起网络安全漏洞,文件包含绝对算得上一个“老油条”。但你以为它只是简单地把恶意代码塞进服务器?Too naive!这玩意儿,本质上就是一场精心策划的“谍战”,黑客通过控制输入,让服务器乖乖执行ta的“秘密指令”。
就像PHP里常用的include()
、require()
,本意是为了代码复用,结果一不小心就成了黑客的“后门”。区别?require()
找不到文件直接撂挑子不干,include()
则会睁一只眼闭一只眼,继续执行。但无论哪个,都可能引狼入室。
举个栗子:
<?php include $_GET['test']; ?>
这段代码看似人畜无害,实际上却暗藏杀机。黑客只需在URL里动点手脚,就能让服务器执行任意PHP文件。
更骚的是:
就算你把PHP文件改成.txt
、.jpg
,照样防不住!include()
函数可不管你文件类型,只要里面有PHP代码,它就敢解析。所以,那些以为把木马藏在图片里就万事大吉的,醒醒吧!
所以说,文件包含漏洞,是文件上传漏洞的最佳拍档!
二、本地文件包含(LFI):黑客的“顺手牵羊”
LFI,顾名思义,就是能“顺走”服务器本地文件的漏洞。
看这段代码:
<?php $file = $_GET['filename']; include($file); ?>
有了它,黑客就能像逛自家后花园一样,读取服务器上的各种敏感文件。
怎么玩?
- 绝对路径:
直接指明文件位置,简单粗暴。 - 相对路径:
通过 ./
、../
等符号,在目录间穿梭,技术含量稍高。
黑客最爱“光顾”的地方:
- Windows:
C:oot.ini
:系统版本信息,知己知彼。 C:windowssystem32inetsrvMetaBase.xml
:IIS配置文件,服务器的“命门”。 C:ProgramFilesmysqlmy.ini
:MySQL配置,数据库密码可能就在里面。 - Linux/Unix:
/etc/password
、 /etc/shadow
:用户账户信息,直接关系到服务器控制权。/etc/httpd/conf/httpd.conf
:Apache配置文件,网站的“骨架”。 /etc/my.conf
:MySQL配置文件,同上。
三、LFI的“花式”利用:黑客的工具箱
1. 文件上传 + LFI:双剑合璧,天下无敌?
如果找不到文件上传漏洞?没关系,先上传一个“图片马”,再用LFI来解析它。
步骤:
-
上传一个包含恶意代码的图片文件(例如 webshell.jpg
)。 -
利用LFI漏洞,让服务器执行这个图片文件里的PHP代码。
注意: 为了避免“水土不服”,最好先用图片马生成一个.php
文件,再连接它。
2. 包含Apache日志:从“蛛丝马迹”中寻找突破口
没有文件上传点?那就利用Apache的日志文件!
前提:
-
日志文件可读。 -
知道日志文件存储目录。
原理:
Apache会将用户的请求写入access.log
,错误信息写入error.log
。我们可以通过构造特殊的请求,将恶意代码写入日志文件,再用LFI来执行它。
例如:
访问http://127.0.0.1/<?php phpinfo();?>
,虽然网页会显示403,但恶意代码已经被写入access.log
。
坑:
-
日志存储目录可能会被修改。 -
日志记录的信息可能会被编码。
3. 包含Session文件:控制变量,操纵全局?
先尝试包含Session文件,再根据文件内容寻找可控变量,构造payload插入到文件中,最后包含即可。
条件:
-
找到Session内的可控变量。 -
Session文件可读写,并且知道存储路径。
Session文件存储路径:
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
注意:PHPSESSID
可以在Cookie字段中找到。
4. 包含临时文件:与时间赛跑的艺术
PHP上传文件时会创建临时文件,在临时文件被删除前,可以利用时间竞争的方式包含该临时文件。
临时文件存储路径:
-
Linux: /tmp
-
Windows: C:windowsemp
难点:
需要知道临时文件名。
解决方案:
-
暴力猜解(Windows下可行)。 -
利用 phpinfo()
页面获取上传文件的存储路径和临时文件名。
四、远程文件包含(RFI):当“引狼入室”变成“远程操控”
如果PHP的配置选项allow_url_include
、allow_url_fopen
状态为ON,那么include/require
函数就可以加载远程文件,这就是RFI。
风险:
黑客可以直接控制服务器执行远程的恶意代码。
绕过:
如果PHP版本小于5.3.4,可以使用%00
截断。或者使用?
号截断。
五、PHP伪协议:黑客的“障眼法”
PHP内置了很多URL风格的封装协议,可以用于文件系统函数。
1. file://
协议:读取本地文件的“万能钥匙”
不受allow_url_fopen
与allow_url_include
的影响,可以直接读取本地文件。
用法:
file://[文件的绝对路径和文件名]
2. php://
协议:读取源码、执行代码的“瑞士军刀”
php://filter
:读取源代码并进行base64编码输出。 php://input
:执行php代码。
用法:
php://filter/convert.base64-encode/resource=文件路径
file=php://input
(配合POST请求)
3. ZIP://
协议:解压即执行?
可以访问压缩包里面的文件,当它与包含函数结合时,zip://
流会被当作php文件执行。
用法:
zip://[压缩包绝对路径]#[压缩包内文件]
(注意#
要URL编码成%23
)
4. data://
协议:直接控制输入流
与php://input
类似,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://
流会被当作php文件执行。
用法:
data://text/plain,<?php phpinfo();?>
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
(base64编码)
六、文件包含漏洞的“防火墙”:安全措施,一个都不能少
- 过滤危险字符:
使用 str_replace
等方法,过滤掉../
、http://
等危险字符。 - 配置
open_basedir
:
将PHP所能打开的文件限制在指定的目录树中,防止目录遍历。 - 升级PHP版本:
防止 %00
截断。 - 重命名上传的文件:
防止被恶意读取。 - 设置白名单:
对于动态包含的文件,只读取白名单中的文件。 - 最小权限化:
做好管理员权限划分,做好文件的权限管理, allow_url_include
和allow_url_fopen
最小权限化。
总而言之,文件包含漏洞就像一个“潘多拉魔盒”,一旦被打开,后果不堪设想。只有时刻保持警惕,采取有效的防御措施,才能避免成为黑客的“猎物”。
```
黑客/
原文始发于微信公众号(龙哥网络安全):文件包含漏洞:一场网络安全的“谍影重重”?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论