题目:[护网杯 2018]easy_tornado 1
出处:https://buuoj.cn/challenges
知识点:
1.模板注入
2.百度
题面:
解题步骤:
1.看到tornade我觉得这可能是个我不知道的知识点,我决定百度一下,第一个发现是python,根据经验,基本上每次在web题里见到python,都与模板注入有关。
2.分别打开三个文件,内容如下:
/hints.txt
md5(cookie_secret+md5(filename))
/welcome.txt
render
/flag.txt
flag in /fllllllllllllag
每次点开一个文件,打开文件都会以以下形式传递参数:
file?filename=/flag.txt&filehash=3925fdff8aebe222710b301081210653
3.filehash
是个32位的东西,凭经验,它是个md5加密的数据,我猜这里只要filehash和filename的数据能对应上就可以读取filename文件中的内容。而hints.txt
中的公式很可能就是filehash的计算方法。我们验证一下这个猜测,将file?filename=/flag.txt&filehash=3925fdff8aebe222710b301081210653
中的filehash或flag.txt改成别的东西,立刻报错error,说明应该只有filehash正确,才能显示文件。
4.如此一来,我们现在只差一个cookie_secret
即可得到结果。我们知道MD5加密不可逆(但是可以口算),虽然我们有了两个已知的filehash和对应的filename但是我们无法通过已知的变量算出这个cookie_secret。这说明cookie_secret需要用其他方法获取。
5.我们知道渗透测试的特点就是要碰运气,我百度了很久也读了文档,还是没有找到cookie_secret存在哪里。目前为止这道题还没有进行任何漏洞利用,我觉得不太正常,结合前面猜测的模板注入,我们不妨先验证一下,本题的漏洞是否在这里。我们知道模板注入必须通过传输型如{ {xxx}}的执行命令,探测方式很简单,给一个参数赋值{ {22*22}}
返回484则必然存在模板注入。
6.目前已经知道的参数传递只有两个,一个是xxxx/file?filename=
,一个是xxxx/error?msg=
分别测试一下:
测试xxxx/file?filename={ {22*22}}
,报错,跳转到xxxx/error?msg=error
,
测试xxxx/error?msg={ {22*22}}
,返回一个这个,这我也没见过
我再试一下{ {1}},返回:
我大概知道了,长得这么人工的东西可能意思是发生了过滤。毕竟如果存在可以肆意利用的模板注入,就可以直接rce了,题也不用做了,直接读文件就行了。看来msg参数确实可以进行模板注入,是这题的突破口。
7.问题又回来了,现在我们知道了存在模板注入的存在,接下来要获取cookie_secret
,各种尝试与资料获取发现对于tornado框架存在附属文件handler.settings
,于是尝试输入/error?msg={ {handler.settings}}
,返回值如下,我们取得了cookie_secret
(这段直接照搬):
(好吧我在这里也卡住了,去阅读了一些wp之后,发现基本上大家的文章里都是一下子就知道了cookie_secret是怎么获取。但是恕我直言,相比模块注入,这里可能是这题比较难搞的地方,我读了半天文档还是没搞明白,读文档怎么发现handler.settings
可以获取cookie_secret
的,对于我这样不用python进行web开发的人来说,根本是云里雾里。我现在做题的量还是太少了,目前还不能确定到底这里考察的是对python的掌握还是阅读开发文档的能力。)
8.利用脚本,算出来最终的filehash
,好吧这里我又踩了一个坑,我用php写了个脚本试了好几次,才想起来这个程序是python
的,代码如下
#coding:utf-8
import hashlib
def md5(s):
md5 = hashlib.md5()
md5.update(s.encode("utf8"))
return md5.hexdigest()
def filehash():
filename = '/fllllllllllllag'
cookie_secret = '856bc928-2e49-4398-8135-69c4b317baba'
print(md5(cookie_secret + md5(filename)))
if __name__ == '__main__':
filehash()
运行之后
得到
filehash=a503491adff0b7483b471c2aaab4ea4e
以filehash和filename的正确值输入进行文件读取:
xxxxx/file?filename=/fllllllllllllag&filehash=a503491adff0b7483b471c2aaab4ea4e
得到flag:
总结:
抱歉,对于我不熟悉的领域,文章无法保证质量,这篇文章虽然我修修改改很久,但还是很不满意。我做php审计题目和注入题目比较多,平时写python也就是做做爬虫,这次这题算是恶心到我了,目前我有两个疑点:
1.我不太清楚对于使用python进行web开发的程序员来说,cookie_secret
到底是不是一个常识性的东西,以至于我不能确定到底这题获取cookie_secret
部分考察的是对python的掌握还是阅读开发文档的能力。
2.到底“一有python的web题就是模板注入”这个逻辑是不是个常态,好像我遇到的全都是这种情况。
请知道的大佬们留言告诉我,或者也许以后我做的题目多了会自己对这篇blog进行更新,水了一天,实在惭愧。
ps:
我和短短的故事不会天天更新,但我还得不时不时的提起她,短短也会不开心,也会藏起来,程序员和猫都是孤独的。