php发展

首页 » 常识 » 问答 » 攻防实验室文件包含高危漏洞最佳安全参
TUhjnbcbe - 2025/5/9 17:11:00

在一些业务场景中,功能实现时候可能会用到外部输入,通过文件包含一起执行WEB程序脚本。当程序对其没做过滤或者过滤不严谨,就会造成文件包含高危漏洞。

实验步骤

0x1文件包含漏洞介绍0x2文件包含漏洞复现0x3文件包含漏洞修复

实验环境说明

ubuntu:16、php:7.1、apache:2.2靶场语言:PHP实验默认关闭allow_url_fopen配置,无法造成更低级的远程文件包含漏洞。实验室功能支持,拦截请求、代码审计,你可以通过拦截更好完成实验,通过代码审计了解漏洞是如何形成和漏洞是如何修复;让攻击和防御用代码来说话。

文件包含漏洞场景

常见cms主要体现在后台管理,对一些新增栏目或者主题模板切换,没有对选择分类做好过滤或者过滤不严谨。php常见文件包含方法有:include(),require(),include_once(),require_once();打开

代码审计

查看

file_include_code.php

就可以得知本实验用到include()。

在代码审计工作过程中,我们可以通过发现哪里使用了include()方法,再根据这个方法去查找哪里存在外部输入变量可以改变业务状态,这样就可以进一步确认是否存在文件包含漏洞。例如1

include($filename);

直接存在变量进行文件包含,但漏洞的前提是要确认$filename是否存在外部输入变量改变业务状态。

例如2

if($_GET[page]){include$_GET[page];}else{include”home.php”;}

程序执行顺序:1、先判断get提交过来的page参数,2、如果不为空就执行page参数的文件包含。3、如果为空那就else执行home.php文件包含。这就很危险了,因为是$_GET全局变量提交过来的,没有做过滤和严格的参数定义,又存在外部输入变量改变业务状态,从而引发文件包含漏洞。

例如某些cms或者开发框架:

凡诺CMS2.1thinkphp5.0.0~5.0.18、5.1.0~5.1.10yii2.0.0~2.0.17PHPcmsV9.6.3phpMyAdmin4.8.1等等…

所以,文件包含漏洞和我们的安全工作息息相关,特别是代码审计。目前危害最大的应该是前台存在文件包含漏洞,常见的是变量覆盖形成了前台文件包含高危漏洞。例如TinyRise、discuz插件等…

0x2文件包含漏洞复现

复现利用的价值:可包含目标服务器里面的文件,造成敏感信息泄露和任意执行程序脚本造成服务器提权。复现利用的方法:绝对路径包含、日志包含、*协议包含(file://或php://input)大致复现利用常见:1、已知系统敏感信息位置进行包含获取敏感信息。2、上传图片木马或者文件木马进行文件包含运行木马;

漏洞复现初步分析

打开

代码审计

查看

file_include_code.php

0x2.1敏感信息泄露

输入payload

/etc/passwd

程序包含Linux的passwd文件,并在index主页显示出来,这个就是造成敏感信息泄露。同时整个服务器的文件于目录你可以随意浏览。

*小提示:如果你输入的payload不存在文件或者文件为空,程序将无错误回显。

0x2.2程序脚本执行

由于我们靶场不存在文件上传,所以我们在本地目录放了3个phpinfo();方法调用的文件:

phpinfo.txtphpinfo.jpgphpinfo.php

输入payload

phpinfo.jpg

此时你会发现,index主页包含运行了

phpinfo.jpg

,并成功执行了图片文件里面的phpinfo()方法。那么同样道理,给你的上传文件的入口,你想干什么都可以了!这个就是文件包含高危漏洞。

0x3文件包含漏洞修复

在我们前面漏洞复现的实验中,你已经认识到文件包含漏洞的危害性,那么接下来的实验安全的漏洞修复。

打开

代码审计

查看

file_include_code.php

去掉9、10、11、13行代码注释,保存代码,开启白名单模式的严谨参数定义过滤处理。

?phperror_reporting(0);//文件名称$filename=isset($_GET[filename])?$_GET[filename]:;//判断$filename是否为空if(empty($filename)){$result=;}else{if($filename!=phpinfo.txt){$result=错误提示:文件未找到!;}else{include($filename);}}

0x3.1程序运行流程

1、用isset判断_GET提交过来的参数filename是否声明2、用empty判断$filename变量是否为空,如果为空,那就$result输出空值,如果不为空进入下一条件执行。3、判断$filename变量是否等于phpinfo.txt,如果判断条件为0,不相等则$result错误提示:文件未找到!;如果判断条件为1,相等则进行include($filename);文件包含。

总结:通过一个条件判断,只允许phpinfo.txt进行文件包含,这就启到了防御的作用。当然比较老的的web服务可能存在00截断,这就不细说,毕竟安全不是绝对的。

0x3.2测试是否修复

分别输入我们之前可以成功利用的payload

/etc/passwdphpinfo.jpg

接下来你可以输入,满足文件包含条件的phpinfo.txt试试

phpinfo.txt

你会发现,程序将执行,你想要的。

0x3.3安全参考

1、禁止使用allow_url_fopen,避免远程包含2、存在外部变量进行文件包含功能时候要做好过滤或者严格参数定义3、换一种更安全的实现方式,远离使用它。

安全龙攻防实验室:%模拟真实的攻击与防御环境,以“红蓝对抗”促进安全开发思想提升!

实验室网址*仅支持pc端

1
查看完整版本: 攻防实验室文件包含高危漏洞最佳安全参