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 安全真正难的,不是漏洞名字。
而是:服务器到底在干什么