buuctf_模板注入_[护网杯 2018]easy_tornado 1

题目:[护网杯 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

我和短短的故事不会天天更新,但我还得不时不时的提起她,短短也会不开心,也会藏起来,程序员和猫都是孤独的。

猜你喜欢

转载自blog.csdn.net/ratear/article/details/109621240
今日推荐