PHP伪协议全解析:利用php://input和php://filter玩转CTFHub Web-RCE
PHP伪协议实战指南从CTFHub Web-RCE到高级漏洞利用在网络安全竞赛和渗透测试中PHP伪协议就像一把瑞士军刀看似简单却能在关键时刻打开各种技术瓶颈。今天我们不谈那些基础概念而是直接切入实战场景看看如何用php://input和php://filter这两个协议在CTF比赛中大显身手。1. 伪协议的核心机制与流处理PHP伪协议本质上是对I/O流的抽象封装理解其工作原理比记住payload更重要。当PHP遇到php://协议时会启动特定的流处理器将数据源转化为可操作的资源流。php://filter的工作流程分为三个关键阶段元数据解析识别/resource后的路径作为数据源过滤链构建处理/read或/write指定的转换规则流处理执行按从左到右的顺序应用过滤器// 典型filter链式处理示例 file_get_contents(php://filter/readconvert.base64-encode/resource/etc/passwd)而php://input则是直接读取HTTP请求体原始数据这在处理POST请求时尤为有用。与$_POST不同它不会解析表单数据而是获取原始二进制流。注意php://input在enctypemultipart/form-data时不可用这是常被忽视的细节2. 文件包含漏洞的深度利用当遇到文件包含漏洞时常规的路径遍历可能被过滤这时伪协议就派上用场了。我们来看几个进阶技巧绕过死亡代码当目标文件有exit()或die()时可以用base64过滤器直接获取源码?filephp://filter/convert.base64-encode/resourceprotected.php多级过滤器组合通过叠加过滤器实现复杂操作// 先rot13再base64编码 php://filter/readstring.rot13|convert.base64-encode/resourceconfig.php内存操作技巧利用php://temp和php://memory创建临时流$fp fopen(php://temp, r); fwrite($fp, 恶意代码); rewind($fp); include(php://filter/readconvert.base64-decode/resourcephp://temp);3. 命令注入与伪协议的协同攻击在真实场景中伪协议常与其他漏洞形成组合拳。比如当遇到命令注入限制时限制条件绕过方案示例禁用空格使用${IFS}或重定向符catflag.txt过滤关键词使用通配符或转义c\at fl*禁用目录分隔符使用cd命令切换目录;cd path;ls多限制组合使用base64编码管道echo bHMgLw | base64 -d | sh# 实际CTF中的复合payload示例 /?ip127.0.0.1%0acd${IFS}fl*_dir%0abase64${IFS}fl*4. 防御策略与实战检测了解攻击手段是为了更好防御。针对伪协议攻击可采取以下措施输入验证使用白名单验证文件路径过滤所有php://、data://等危险协议环境加固; php.ini关键配置 allow_url_include Off allow_url_fopen Off动态检测监控异常的文件流操作记录所有包含操作的调用栈在CTF比赛中遇到这类题目时我的经验是先用php://filter探测目标环境?filephp://filter/resource/proc/self/cwd/index.php如果返回空白可能意味着文件不存在权限不足输出被过滤这时可以尝试编码输出或更换协议策略。记住渗透测试是不断试错和调整的过程。