buuctfweb刷题wp详解及知识整理----【护网杯】easy_tornado(模板注入+md5)

写在前面

服务端模板注入也是一种注入攻击(简称为SSTL)
这又涉及到了本人的知识盲区
借这个题学习补充一下知识

自己走过的路加wp辅助

信息收集加思路推理

在这里插入图片描述点击一下/welcome.txt
回显 render
而且url处有异常
在这里插入图片描述同理测试其他选项
在这里插入图片描述在这里插入图片描述通过猜测可知filehash的值就是/hint.txt中的算法得到的
从而
我们只要得到cookie_secret的值即可通过脚本的到于/fllllllllllllag对应的filename的值

模板注入拿到cookie_secret

get传参

?filename=/fllllllllllllag&filehash=

回显
在这里插入图片描述发现可疑参数msg
结合上面提示render
进行测试
msg={{1}}
发现有回显,存在漏洞
查找大佬的wp得知(来源,非常感谢大佬)
在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量
于是访问如下参数
在这里插入图片描述拿到了cookie_secret

小小的脚本

import hashlib

filename = '/fllllllllllllag'
cookie_secret = '7012f546-ae20-45cb-8b05-19bf1e96d0bf'
file_md5 = hashlib.md5(filename.encode(encoding='UTF-8')).hexdigest()

print(hashlib.md5((cookie_secret+file_md5).encode(encoding="UTF-8")).hexdigest())

访问拿到flag
在这里插入图片描述

知识点总结(参考各种大佬的文章,非原创)

1.模板渲染

参考senntyou师傅的文章
前端与后端最初的渲染方式是后端模板渲染,就是由后端使用模板引擎渲染好 html 后,返回给前端,前端再用 js 去操作 dom 或者渲染其他动态的部分。
在这里插入图片描述
前端请求一个地址 url
后端接收到这个请求,然后根据请求信息,从数据库或者其他地方获取相应的数据
使用模板引擎(如 java > jsp、php > smarty)将这些数据渲染成 html
将 html 文本返回给前端

个人觉得就是后端模板引擎对数据的一种处理成html的方式

关于tornado模板的介绍

<html>
   <head>
      <title>{{ title }}</title>
   </head>
   <body>
     <ul>
       {% for item in items %}
         <li>{{ escape(item) }}</li>
       {% end %}
     </ul>
   </body>
 </html>

渲染代码

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        items = ["Item 1", "Item 2", "Item 3"]
        self.render("template.html", title="My title", items=items)

在引擎下, Tornado模板被直接转换为Python. 包含在你模板中的表达式会 逐字的复制到一个代表你模板的Python函数中.

2.SSTl攻击

先推荐一个大佬在黑客大会发的东西
https://www.blackhat.com/docs/us-15/materials/us-15-Kettle-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-wp.pdf
就引用一下niubl大佬的文章`
以Twig为例

<?php
require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php';
Twig_Autoloader::register(true);
 
$twig = new Twig_Environment(new Twig_Loader_String());
$output = $twig->render("Hello {{name}}", array("name" => $_GET["name"]));  // 将用户输入作为模版变量的值
echo $output;

使用 Twig 模版引擎渲染页面,其中模版含有 {{name}} 变量,其模版变量值来自于 GET 请求参数 $_GET[“name”] 。
但是,如果渲染的模版内容受到用户的控制,情况就不一样了。修改代码为:

<?php
require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php';
Twig_Autoloader::register(true);
 
$twig = new Twig_Environment(new Twig_Loader_String());
$output = $twig->render("Hello {$_GET['name']}");  // 将用户输入作为模版内容的一部分
echo $output;

上面这段代码在构建模版时,拼接了用户输入作为模板的内容,现在如果再向服务端直接传递 JavaScript 代码,用户输入会原样输出
注入攻击的真谛:永远不要相信用户的输入

3 python3的md5()方法使用

在python3的标准库中,已经移除了md5,而关于hash加密算法都放在hashlib这个标准库中,如SHA1、SHA224、SHA256、SHA384、SHA512和MD5算法等
hexdigest()在英语中hex有十六进制的意思,因此该方法是将hash中的数据转换成数据,其中只包含十六进制的数字。

# 或者可以这样(最常见的写法,常用于图片的命名)
>>> hashlib.md5(b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'
 
# 也可以使用hash.new()这个一般方法,hashlib.new(name[, data]),name传入的是哈希加密算法的名称,如md5
>>> hashlib.new('md5', b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'

对中文进行加密时

>>> import hashlib
>>> data = '你好'
>>> hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值