PHP¶
WEB · 语言专题。PHP 特性利用是国内 CTF Web 的最大票仓。标签:弱类型特性、其他语言特性、变量覆盖、PHP特性、反序列化、伪协议。
触发特征¶
PHPSESSID、X-Powered-By: PHP/x.y、.php后缀、报错页带Warning:。- 源码审计题给出 PHP 片段,考比较、哈希、正则、序列化。
弱类型特性¶
==松散比较:"admin"==0(PHP7)、0e科学计数法哈希相等(md5('2406107085')=='0e...')、true与任意字符串相等。md5()/sha1()数组绕过:传a[]=1&a[]=2返回 NULL,md5($a)==md5($b)成立;strcmp、strpos、preg_match同理(AceBear 2018:hash_hmac数组参数返回 NULL 绕过校验)。in_array第三参不严 → 类型混淆;switch松散比较;json_decode后的弱比较。
PHP特性(过滤对抗)¶
strpos子串黑名单可嵌入绕过(TUCTF 2018);全角字符$绕过^锚点正则(Hack.lu CTF 2018)。- PCRE 回溯上限 100 万次,超长 payload 使
preg_match返回 false 跳过过滤(SECUINSIDE 2017)。 parse_str()变量注入(TokyoWesterns 2018);extract()/register_globals变量覆盖(SecuInside 2013);$$var可变变量(bugs_bunny 2017)。- 顺序替换过滤绕过:替换即消除的循环逻辑用嵌套构造(Tokyo Westerns 2017);双写、编码、递归
....//(35C3 2018)。 (int)强转取前导数字做路径穿越(35C3 2018);log()/INF数学相等 + 递归 urldecode(Pragyan CTF 2019)。
变量覆盖¶
extract($_GET)/parse_str覆盖$password、$flag等业务变量。$$动态变量拼接;compact()反向泄露;import_request_variables(老版本)。- foreach 引用遍历导致的键值覆盖(常见于框架路由分发)。
反序列化¶
unserialize()→ POP 链:从__destruct/__wakeup入口找 gadget;常见链:各种 composer 组件(参考 phpggc)。- 序列化长度篡改:过滤词替换导致长度膨胀,用长属性名吃掉后续字段(0CTF 2016)。
SoapClient.__call()发 CRLF 请求 → SSRF(N1CTF 2018);unserialize+curl双重 URL 编码 LFI(FireShell CTF 2019)。phar://触发元数据反序列化:file_exists('phar://evil.jpg')即可打点,配合上传图片马绕过无上传解析的限制(35C3 2018.phar黑名单绕过思路同源)。- Cookie 序列化直接控对象(见 [server-side-exec] 的 PHP Cookie 反序列化套路)。
伪协议¶
php://filter/convert.base64-encode/resource=index.php读源码;read=convert.iconv.utf-8.utf-16做编码过滤绕死亡 exit。php://input写入 POST 体执行;data://text/plain,<?php ...;zip:///phar://读包内文件——PNG+ZIP polyglot 后zip://a.png#shell.phpLFI(PlaidCTF 2016)。php://input+ NULL 字节 +~按位取反绕 base64 过滤(DefCamp 2018);file=参数黑名单用/dev/fd/符号链接绕/proc过滤(Google CTF 2017)。file://、http://、ftp://、expect://(需扩展)、glob://列目录。
命令执行/代码执行入口¶
eval/assert(字符串求值,CSAW 2016)/preg_replace('/x/e',...)(PHP<7,PlaidCTF 2014)/create_function注入(FireShell 2019)/call_user_func。- 反引号执行受字符限制时:
current(getallheaders())从头注入绕正则(RCTF 2018)。 - disable_functions 绕过:LD_PRELOAD + mail()/imap、PHP7 OPcache 二进制 webshell(ALICTF 2016)、
scandir替代目录列举(MetaCTF Flash 2026)。 - 其他入口:日志包含(
session.upload_progress、NGINX access log)、session文件包含。
模板注入(PHP 侧)¶
- Twig:
{{7*7}}探测;RCE 走{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}(Twig <3.14 常用链);新版用map/filter回调。 - Smarty:
{php}标签(旧版)、{$smarty.template}信息泄露;CVE-2017-1000480(注释注入getStreamVariable)、CVE-2021-26120({math}执行);静态方法{Smarty_Internal_Write_File::...}。 - 文件读取:模板引擎的 include/display 路径可控 → 任意文件读(→ 文件泄露 衔接)。
框架漏洞(指纹命中即打 N-Day)¶
- Laravel:debug 模式(
/_ignition/execute-solutionRCE,CVE-2021-3129)、APP_KEY泄露 → 反序列化 RCE(phpggc Laravel 链)。 - ThinkPHP:5.x
s=路由 RCE(2018 年国内爆发,\think\app\invokefunction)、多版本反序列化链;国内赛事与实战出现率最高。 - Yii/CodeIgniter/CakePHP:cookie 反序列化、phar 入口扫描。
- 通用路径:composer.json 定位框架与版本 → phpggc 找链 → 找反序列化入口(cookie/phar/上传)。
代码审计(面向 PHP 源码题)¶
- 入口追踪:路由分发 → 参数接收(
$_GET/$_POST/php://input)→ 危险函数汇(eval/system/include/unserialize/extract/preg_replace)。 - 审计工具:Seay(国内)、RIPS 思路;
grep -rn "危险函数"+ 人工回溯数据流。 - 代码混淆:php-obfuscator/源码加密(eval-gz-inflate 套娃)→ 动态 dump(
hook eval打印解密后源码)。 - 衔接:反序列化 POP 链与伪协议见上文;变量覆盖三件套见上文。
工具速查¶
# filter 读源码
curl "URL?file=php://filter/convert.base64-encode/resource=index" | base64 -d
# phpggc 生成 POP 链
phpggc Laravel/RCE5 "system('cat /flag');" -b # -b 输出 URL 编码