深入浅出Flask PIN

最近搞SSTI,发现有的开发开了debug,由此想到了PIN,但一直没有对这个点做一个深入剖析,今天就完整的整理Flask Debug PIN码的生成原理与安全问题 。
PIN是什么?

PIN是 Werkzeug(它是 Flask 的依赖项之一)提供的额外安全措施,以防止在不知道 PIN 的情况下访问调试器 。您可以使用浏览器中的调试器引脚来启动交互式调试器 。
请注意,无论如何,您都不应该在生产环境中使用调试模式,因为错误的堆栈跟踪可能会揭示代码的多个方面 。
调试器 PIN 只是一个附加的安全层,以防您无意中在生产应用程序中打开调试模式,从而使攻击者难以访问调试器 。
——来自StackOverFlow回答
werkzeug不同版本以及Python/ target=_blank class=infotextkey>Python不同版本都会影响PIN码的生成
但是PIN码并不是随机生成,当我们重复运行同一程序时,生成的PIN一样,PIN码生成满足一定的生成算法
探寻PIN码生成算法笔者环境
  • Python 3.10.2
  • Flask 2.0.3
  • PyCharm 2021.3.3 (Professional Edition)
  • windows 10 专业版 21H2
  • Docker Desktop 4.7.0
先写一个简单的Flask测试程序
from flask import FlaskApp = Flask(__name__)@app.route("/")def hello():return '合天网安实验室-实践型网络安全在线学习平台;真实环境,在线实操学网络安全 。'if __name__ == "__main__":app.run(host="0.0.0.0", port=8080, debug=True)运行,控制台状态如下
深入浅出Flask PIN

文章插图
 
浏览器如下则成功
深入浅出Flask PIN

文章插图
 
接下来开始调试程序,顺藤摸瓜找到生成PIN码的函数
PIN码是werkzeug的策略,先找到flask中导入werkzeug的部分
【----帮助网安学习,以下所有学习资料关注我,私信回复“资料”获取----】
【深入浅出Flask PIN】 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(Android/ target=_blank class=infotextkey>安卓+IOS)
调试在run.app行下断点,点击调试
深入浅出Flask PIN

文章插图
 
点击步入
深入浅出Flask PIN

文章插图
 
转到了flask/app.py,直接Ctrl+F搜索werkzeug
深入浅出Flask PIN

文章插图
 
发现程序从werkzeug导入了run_simple模块,而且try部分有run app的参数
我们直接按住ctrl点击run_simple进去看看
此时进入了seving.py,找到了负责Debug的部分,PIN码是在debug状态下才有的,那这个部分很有可能存有PIN码生成部分,进去看看
深入浅出Flask PIN

文章插图
 
此时进入了__init__.py,经过一番审计,先来看一看pin函数
深入浅出Flask PIN

文章插图
 
主要是get_pin_and_cookie_name函数,进去看看


推荐阅读