文件包含能上线吗?哎呦,这个问题可算问到我的心坎里了!
先别急,咱们今天就把这个“文件包含能不能上线”的事儿,像剥洋葱一样,一层层给你掰扯清楚,说实话,我当初刚接触这个漏洞的时候,脑子里也是俩字:迷茫!心想这玩意儿不就是读读文件吗?能有多大能耐?结果,现实直接给我上了生动的一课,那叫一个“刻骨铭心”啊!

文件包含到底是啥?先别嫌我啰嗦
咱得先温习一下基础,不然聊到后面你该犯迷糊了,文件包含,英文叫File Inclusion,就是咱们程序员在写代码的时候,为了省事儿,喜欢把一些通用的函数或者页面,比如页头、页脚、配置信息,单独写成个文件,当用户访问某个页面时,代码就“动态”地把这个文件给“包含”进来一块儿执行。
问题就出在这个“动态”上! 如果这个“包含”进来的文件名,是直接由用户在URL地址栏里“点菜”决定的,比如?page=about.php,那黑客兄弟可就不客气了,他完全可以不点“about.php”这道菜,非要塞进来一个“../../../../etc/passwd”或者一个远程的恶意脚本,这就叫文件包含漏洞,分本地(LFI)和远程(RFI)两种。
这时候肯定有哥们儿要问了:“你说的这么热闹,那文件包含能上线吗?” 咳咳,这里的“上线”可不是指咱们的程序员把代码部署到服务器上嗷,在咱们安全圈儿里,“上线”指的是——哎嘿,我能不能用它直接拿到一台服务器的控制权(Shell)!
光读文件不算本事,拿到Shell才算真“上线”
说句掏心窝子的话,如果你只把文件包含用来读个 /etc/passwd,看看系统里有哪些用户,那真的就跟用大炮打蚊子一样,太浪费感情了!这充其量算个低危的信息泄露,真正的“上线”,是那种你一操作,直接弹回来一个命令行交互界面,美滋滋地敲着whoami、ls -la,感觉整个服务器都在你股掌之间的那种快感。
那到底文件包含能上线吗?我的答案是:不但能,而且花样多得很! 但要分几种情况看,这中间的门道,我得跟你好好絮叨絮叨。
第一种:本地文件包含里的“日志投毒”
这是最经典的戏码了,你本地包含(LFI)没法直接读源码?没关系!咱可以“借刀杀人”,你想啊,服务器上不是有日志文件(比如Apache的access.log)吗?日志会把咱们的“用户代理”(User-Agent)给记录下来,这时候,咱就不当个好人了,直接在User-Agent里塞一段PHP恶意代码,比如<?php eval($_POST['cmd']); ?>。
服务器一看,“哎呦,这什么玩意儿?”,但它还是会老老实实地把你的UA写进日志,你用文件包含去“包含”这个日志文件,因为你UA里的那段PHP代码已经存进日志了,当被包含执行的时候,PHP引擎一看:“哦?这里有段代码,那我得跑一下!” 你的WebShell就这么“上线”了!嘿,你说这事儿妙不妙?只要日志路径猜得准,上线那就是分分钟的事儿!
第二种:配合文件上传,曲线救国
要是人家网站过滤得严,日志投毒不好使咋办?别急,咱还有后手!如果对方网站允许你上传图片,但又不让你执行PHP,这时候文件包含漏洞就成了“神助攻”。
你可以先上传一个长得像图片的木马,比如下图里藏了一句<?php @eval($_POST['x']); ?>,因为你检查了文件头是GIF89a,所以上传成功了,它现在待在服务器上就是个普通图片,然鹅,这时候你利用文件包含漏洞去包含这个图片文件,会怎样?PHP引擎在执行的时候,可不管你是图片还是文本,只要是<?php ?>标签里的内容,它就照单全收地执行了!
这时候,你再拿蚁剑或者冰蝎去连接它,是不是就美滋滋地拿到了服务器的权限?这波操作下来,文件包含不仅上线了,还是“曲线救国”上的线,那叫一个妙手回春!
第三种:远程文件包含直接拉满
如果PHP配置里开着allow_url_include=On,那简直就是给咱们开着大门送人头,本地文件包含直接升级成远程文件包含(RFI),咱也不用在人家服务器上费劲儿找文件了,直接在自己的一台VPS上放一个写着恶意代码的.txt文件,然后让目标网站去包含你VPS上的这个文件地址,这不比刚才那两种都痛快?直接异地“上线”,干净利落脆!
但话说回来,这“上线”咋就这么难呢?
你别看上面说得热闹,理想很丰满,现实很骨感,你要真去测一个现网的站,你会发现到处是坑。
哎呀,我包含路径总是写不对怎么办? 这很正常,你得靠报错信息去猜目录结构,有时候你猜了半天,发现人家在最外层加了过滤,把给吞了,或者把http://给拦了,这时候我就忍不住想吐槽:“哥们儿,你这代码写的也太不讲究了,这不是逼着我跟你玩脑筋急转弯吗?”
还有啊,明明日志文件就在那儿,我包含进去咋啥反应没有? 可能是日志文件太大,包含的时候内存爆了,也可能你UA里写的代码被转义了,遇到这种时候,我经常会急得想拍桌子:“大哥大姐们,能不能给条活路啊!”
你说文件包含能上线吗?能!但绝大部分情况下,它需要天时(环境允许)、地利(路径可猜)、人和(代码有缺陷),许多时候,它更像是一个“辅助位”,帮我们绕过认证,或者读取到关键配置文件(比如/root/.ssh/id_rsa),拿到密钥后咱再SSH直接登录,这也是个“上线”的捷径嘛!
我的实战碎碎念
我用我的切身经历跟大家交个底,有一次我摸到一个站,有个参数特别可疑,我测了老半天LFI,死活读不到源码,但我发现它能包含/proc/self/environ(环境变量文件)!嘿,我立马在User-Agent里塞了代码,再包含回去,嘿,这不就上钩了吗! 当时我激动得差点把咖啡洒在键盘上,那种感觉怎么说呢?就像在沙漠里渴了三天,突然看见一瓶冰镇可乐! 所以啊,各位同行们,不要轻言放弃,“文件包含能上线吗”这个问题,你的坚持和技术积累就是最终的答案。
只要你思路够宽,懂得结合场景去利用,文件包含绝对不只是个“读文件”的玩具,它完全具备上线的潜质!但要是你问我在挖洞时最怕啥?我最怕是明明有漏洞,却因为服务器装了个奇葩WAF(Web应用防火墙),搞得我各种姿势都被封印,那就真的只能对着屏幕干瞪眼,空悲切了!
好了,今天的嗑就唠到这儿,下次你再遇到文件包含的站,心里可以默默念叨一句:“兄弟,看你今天能不能让我上个线!” 祝各位好运,早日拿到属于自己的最高权限!