文件包含心得体会

极客

一个让我又爱又恨的技术点,聊聊我的真实感受

说起来你们可能不信,文件包含心得体会这东西,我一开始真的是被它折磨得够呛,那是刚入行不久的时候,第一次接触到PHP的文件包含功能,满脑子都是"这不就是个include吗,有啥难的?"结果呢?啪啪打脸。

文件包含心得体会

今天就想跟大家唠唠我在文件包含这个知识点上的酸甜苦辣,也算是给自己做个阶段性的小总结吧,如果你也在学这个,或者正准备学,希望我的这些心得体会能给你一点点帮助,少踩几个坑。

最初的我:天真得可爱

还记得第一次写include 'header.php'的时候,我心想:哇,这也太方便了吧!一个网站的头部、尾部、导航栏,全都拆成单独的文件,需要的时候包含进来就行,改一处全站生效,简直是懒人福音啊!

那会儿我逢人就夸:"文件包含真是个好文明!"现在想想,真是too young too simple。

后来老师讲到了include和require的区别,我才知道原来这俩兄弟性格完全不一样。include比较温柔,文件找不到就给你个警告,然后继续往下跑;require就比较刚,文件找不到直接罢工,整个脚本拜拜,还有include_once和require_once,专门用来防止重复包含的。

说实话,那时候做实验,我故意把路径写错,就为了看那几个Warning和Fatal error长啥样,虽然有点无聊,但确实让我对这几个函数的脾气摸得更清楚了,这算是我最早的一点文件包含心得体会吧——别怕犯错,报错信息其实是最好的老师。

转折点:当"方便"变成了"危险"

真正让我对文件包含刮目相看的,是学到安全那部分的时候。

你们知道吗?就是那个看起来人畜无害的include,如果参数是用户可控的,那可就出大事了,什么本地文件包含(LFI)、远程文件包含(RFI),听得我头皮发麻,原来一个小小的?page=about.php,攻击者可以改成?page=../../../../etc/passwd,直接把系统敏感文件读出来!

那一刻我的心得体会功能越灵活,责任越大,文件包含本身没毛病,毛病出在使用它的人身上,就像一把菜刀,切菜是好帮手,用错了地方就是凶器。

后来我专门去查了怎么防御,什么白名单校验、路径过滤、关闭allow_url_include……这些知识点我一个个记在笔记本上,说实话,那阵子睡觉都在想"如果是我来写这个页面,我会怎么防?"

实操中的那些小心得

光看不练假把式,我在本地搭了个环境,自己写了个小demo,故意留了个文件包含的漏洞,然后自己攻击自己,你还别说,当看到/etc/passwd真的显示在页面上的时候,那种震撼感是看多少篇文章都比不了的。

这里分享几个我实操中总结的文件包含心得体会:

第一,路径问题真的很烦人。 相对路径、绝对路径、、,搞不好就包含错了,我建议新手阶段尽量用__DIR__这种魔术常量来拼路径,稳得多。

第二,伪协议是个好东西。 php://filter、php://input、data://这些,在做CTF题的时候简直是神器,前提是你要搞清楚它们各自的使用场景和限制条件。

第三,日志文件包含是个思路。 有时候没法直接包含目标文件,但可以通过包含Apache的access.log或者SSH日志,把自己写的代码带进去执行,这个技巧我第一次见的时候,真的是拍案叫绝。

现在的我:敬畏且热爱

学到现在,我对文件包含的感情挺复杂的,它就像一把双刃剑,用好了能极大提高开发效率,用不好就是灾难现场。

但不管怎么说,文件包含心得体会这个主题,我觉得核心就一句话:理解原理,敬畏边界。

你得知道include到底是怎么找文件的——先在include_path里找,再在当前目录找,最后才报错,你得知道远程包含为什么危险——因为它允许执行外部服务器上的代码,你得知道php://filter为什么能读源码——因为它对流进行了base64编码。

这些原理搞懂了,不管是写代码还是做安全,心里都有底。

给正在学的朋友几句话

如果你也在学文件包含,我想说:

  • 别嫌基础枯燥,include、require、include_once、require_once这四个兄弟的区别一定要烂熟于心。
  • 一定要动手搭环境,光看视频不动手,你永远不知道坑在哪里。
  • 安全思维要从一开始就养成,别等出了事再补救。
  • 多去CTF平台刷刷题,文件包含的题目特别多,做多了自然就有感觉了。

好啦,以上就是我关于文件包含心得体会的一些碎碎念,写得比较随意,但都是真情实感,如果你有什么不同的看法,或者也有自己的心得体会,欢迎一起交流呀!毕竟技术这东西,越聊越通透嘛。

希望这篇文章能帮到你,咱们下篇见!👋

文章版权声明:除非注明,否则均为极客网安-咸鱼原创文章,转载或复制请以超链接形式并注明出处。

目录[+]