2021-07-02 14:51:51
文件包含漏洞主要分为本地文件包含(LFI)和远程文件包含(RFI)两种类型,其核心成因是应用程序未对用户提供的文件路径进行充分验证或过滤,导致攻击者可利用恶意文件执行任意代码。以下是具体分类及防御措施:
一、本地文件包含(Local File Inclusion, LFI)读取敏感文件:例如通过路径遍历(如../../etc/passwd)获取系统用户信息。
暴露源代码:包含应用程序的配置文件或脚本文件,分析漏洞逻辑。
输入验证:使用白名单机制,仅允许访问预定义的目录和文件。
路径规范化:通过操作系统函数(如PHP的realpath())消除路径中的../等特殊字符。
文件类型校验:限制仅允许特定类型文件(如图片),通过MIME类型检查防止脚本执行。
植入Web Shell:攻击者上传恶意脚本到远程服务器,通过RFI获取服务器控制权。
分布式攻击:利用多台受控服务器发起大规模攻击。
禁用远程包含:在PHP配置文件中设置allow_url_include=Off。
输入过滤:即使禁用远程包含,仍需校验用户输入,防止绕过限制。
网络隔离:限制服务器访问外部资源的权限,减少攻击面。
输入验证与白名单:
严格校验用户提供的文件路径,仅允许字母、数字及特定符号(如-、_)。
预定义可访问的目录列表,拒绝所有非白名单路径。
路径规范化处理:
使用语言内置函数(如Python的os.path.normpath())消除路径遍历字符。
示例:将用户输入../../etc/passwd规范化为无效路径。
文件类型与内容校验:
通过文件头签名(Magic Number)或MIME类型验证文件真实性。
示例:仅允许image/jpeg类型的文件上传,拒绝text/x-php等脚本类型。
安全编码实践:
避免直接拼接用户输入到文件路径中,改用参数化查询或模板引擎。
示例:PHP中使用__DIR__常量拼接路径,而非用户输入。
定期安全审计:
通过静态代码分析工具(如SonarQube)检测潜在漏洞。
模拟攻击测试(如渗透测试)验证防御效果。
总结:文件包含漏洞的防御需结合输入验证、路径控制、类型校验及安全编码,同时通过定期审计持续优化。安全是一个动态过程,需从开发到运维全链条落实防护措施。