include() 为什么危险

最近在继续学习 Web 安全。

前面学文件上传的时候,我一直有个疑问:为什么很多人最后都会提到“文件包含”?

后来真正开始接触 PHP 的:include()   require()  之后。

我才慢慢发现:文件包含真正危险的地方根本不只是“读取文件”。

而是:服务器会执行它

今天就整理一下我最近学习文件包含时真正理解到的东西。

一、什么是 include()?

一开始我以为:include()

只是:把另一个文件内容复制过来

后来才发现。

它其实更像:“把另一个 PHP 文件放进当前程序一起运行”

例如:

include("header.php")

网站很多页面都会这样写。

因为:

  • 导航栏
  • 头部
  • 底部
  • 用户信息

很多内容都是重复的,所以开发会把它们拆成单独文件。

然后:include() 进来。

二、真正危险的地方出现了

关键问题是:include 不只是“读取”

它还会:解析并执行 PHP

这就非常重要了。

比如:

<?php echo "hello"; ?>

如果被 include,那么里面的 PHP 代码也会一起运行

这里我第一次真正意识到:文件包含的核心不是文件

而是:服务器会不会执行里面的内容

三、为什么 include 会形成漏洞?

很多网站会这样写: ?page=home.php

后端:include($_GET['page']);

开发本意其实很正常。

比如:

  • home.php
  • news.php
  • user.php

不同参数显示不同页面。

但问题是:用户也能控制 page 参数

这时候危险就来了。

因为服务器会:根据用户输入去读取文件

四、我第一次理解“目录遍历”

之前我一直不理解:../../../../

到底是什么。

后来真正学文件包含时才发现。

这其实是:文件路径

比如:../../

意思是:返回上一级目录

如果网站没有限制。

攻击者就可能尝试读取:系统里的其他文件

这时候我第一次真正开始有:“服务器文件系统”的概念。

以前总感觉:网站就是网页现在才发现。

网站后面其实就是:一整个服务器目录结构

五、为什么文件上传最后总会扯到文件包含?

这个是我最近最大的理解变化。

以前我一直觉得:文件上传和文件包含是两个独立漏洞。

后来才发现,它们很多时候其实是:配合出现

比如:网站禁止上传 PHP,只能上传图片。

于是很多人会研究:

  • 文件结构
  • 文件头
  • 图片内容

因为:上传成功不一定结束

真正关键的是:后面会不会被 include

这时候我第一次开始真正理解:漏洞链

六、我开始发现 Web 安全越来越像“理解服务器”

以前学习漏洞,总感觉:学 payload就行。

现在越来越发现,真正重要的是:服务器到底在干什么

比如:

  • include 到底做了什么?
  • 为什么会执行?
  • 文件路径怎么解析?
  • PHP 为什么会读取它?
  • 为什么图片有时候也会被解析?

这些东西开始串起来之后。

我第一次感觉:自己不是在背漏洞

而是在:理解 Web

七、为什么很多师傅都强调“原理”?

以前我总觉得:直接学利用不就好了现在越来越发现。

如果不知道:服务器为什么会这样运行那么环境一变,就完全不会了。

而真正理解 include() 之后。

很多东西会突然连起来:

  • 文件上传
  • 文件包含
  • phar
  • 反序列化
  • 命令执行

开始不再是:一个个独立漏洞

而是:服务器行为之间的关联

八、我现在的学习变化

以前学习 Web 安全:

现在慢慢开始变成:

服务器为什么会执行?
为什么会 include?
为什么路径能被控制?

这种感觉完全不一样。

也是我第一次真正开始觉得:

自己进入了 Web 安全“原理层”

九、总结

文件包含看起来只是:include 一个文件

但真正深入之后会发现,它本质上其实是在利用:服务器对文件和路径的处理逻辑而这些东西。

又会和:

  • 文件上传
  • 解析机制
  • 反序列化
  • 命令执行

慢慢全部串起来。

最近越学越感觉:Web 安全真正难的,不是漏洞名字。

而是:服务器到底在干什么

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐