本文共 1365 字,大约阅读时间需要 4 分钟。
在web后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用“包含”函数功能。比如把一系列功能函数都写进fuction.php中,之后当某个文件需要调用的时候就直接在文件头中写上一句<?php include fuction.php?>
就可以调用函数代码。
文件包含漏洞:
有时候因为网站需求,会让前端用户选择需要包含的文件(或者在前端的功能中使用了“包含”功能),又由于开发人员没有对包含的这个文件进行安全考虑,就导致攻击者可以通过修改包含文件的位置来让后台执行任意文件(代码)。
分类:
本地文件包含漏洞:攻击者通过传入后端服务器固定的配置文件让包含函数去执行,从而使本地的一些配置文件信息被暴露出去。
远程文件包含漏洞:读取远程的php文件加载到本地去执行。
通过include()或require()语句,可以将PHP文件的内容插入另一个PHP文件(在服务器执行它之前)
include和require语句是相同的,除了错误处理方面:
如图,url中通过提交文件名的方式,进行执行并返回
所以我们尝试用目录切换的方式执行一些系统的固定配置文件,从而获取一些敏感信息。
尝试替换url中的文件名:…/…/…/…/…/…/…/etc/passwd
如果是windows,替换为:…\…\…\…\…\…\…\Windows\System32\config\test
为搭建符合条件的测试环境,需要更改php.ini文件
vim /etc/php/7.4/apache2/php.ini
然后重启apache2 service apache2 restart
搭建一个站点,编写一个txt文件http://192.168.31.212/pikachu/vul/fileinclude/fi_remote_exp.txt
该txt文件是一句话木马,文件被远程包含后将会运行该木马,获取shell
---------------------------------------fi_remote_exp.txt
将参数替换为远程文件的路径后,并在后面追加x参数,如ifconfig,则后台将会执行该命令,并将结果返回:
在功能设计上尽量不要将文件包含函数对应的文件放给前端进行选择和操作(文件操作不放前端)。
若一定要在前端操作,那就要过滤各种例如…/…/,http://
,https://
等目录切换或远程调用的特殊字符(过滤危险字符)。
配置php.ini文件
allow_url_fopen = off
Allow_url_include = off
magic_quotes_gpc = on //在一些旧的版本
通过白名单策略,仅允许包含运行指定的文件,其他的都禁止(白名单策略)。
如果php配置了open_basedir则会包含失败,不过一个大佬写了。
尽量不适用动态包含。
转载地址:http://qgph.baihongyu.com/