SSRF漏洞配合Flask的巧妙利用 - 内网漫游

倾旋
倾旋
技术分享|2020-3-21|最后更新: 2023-6-22|
type
status
date
slug
summary
tags
category
icon
password
URL

SSRF 服务器请求伪造

SSRF(Server-side Request Forge, 服务端请求伪造)。由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务。

常见的功能点

notion image
  • Net-NTLM && NTLM Relay
  • 获取服务器真实IP
  • 端口扫描
  • 网页代理
  • ……

网页代理 - HTTP Proxy

notion image
客户端应用HTTP代理后,可通过代理服务器访问内网HTTP协议资源
而在SSRF场景,需要SSRF具备支持HTTP两大请求方式:GET、POST,且有响应Body

Flask 框架

Flask是一个用Python编写的Web应用程序框架,它基于Werkzeug WSGI工具包和Jinja2模板引擎。
Flask也被称为“microframework” ,因为它使用简单的核心,用extension增加其他功能,它没有默认使用的数据库、窗体验证工具。
notion image

Flask 框架的请求流程

  1. befor_first_request
  1. befor_request
  1. after_request
  1. teardown_request → 异常处理
  1. after_this_request
notion image
Flask的默认端口是:5000
notion image
插件名称:SwitchyOmega
notion image
通过把代理服务器设置为5000(Flask默认)端口,浏览器的所有请求都会经过这五个装饰器,在每个装饰器中,可以写自己的检测规则。由于许多的SSRF漏洞接口返回的Content-Type始终都是一样的,因此会产生图片、JS等静态文件无法加载,下面我们将解决这个问题。

解决文件类型问题

遇到这个问题,首先分析浏览器为什么无法加载。
  1. SSRF漏洞接口返回的Content-Type是Json,那么我们还需要将Json转化为一个字典,把DATA取出。
  1. 根据SSRF漏洞请求的URI来定义MIME Type,Response返回对应的MIME Type即可解决
这里定义了一些常见的MIME类型,通过截取URI的文件扩展名来找到对应的MIME类型,默认找不到就以HTML返回,不知道还有没有更赞的办法,如果有欢迎分享。

Content-Encoding问题

Accept-Encoding 和Content-Encoding是HTTP中用来对采用哪种编码格式传输正文进行协定的一对头部字段。
通过SSRF漏洞接口返回的通常可能是附带Content-Encoding头的响应,但与SSRF目标返回的不匹配,会造成网页展示不完全的情况。(本质上是接口取回的内容已经是解码后的,但接口本身可能又有编码头)
这里的解决方式是剔除编码头 Content-Encoding。
 
 
©2021-2024 倾旋. All rights reserved.