SimpleTemplate 模板引擎ssti注入和内存马学习
1674701160110592 WEB安全 806浏览 · 2025-02-17 23:02

简介

Bottle自带了一个快速,强大,易用的模板引擎,名为 SimpleTemplate 或简称为 stpl 。它是 view()template() 两个函数默认调用的模板引擎。

而SimpleTemplate类是继承了BaseTemplate类的



漏洞一:Bottle注入

如何检测框架

图片加载失败


里面的函数可以帮我们检测一下框架

图片加载失败


在vnctf2025的学生管理系统,题目描述说:”某个单文件框架“,搜索或者问 ai 都能知道 python 本体的单文件框架是 bottle 框架。 绕长度限制,题目主页面也有提示“一行一个名字”,输入

会发现回显 了 49 和 64。



python3.8+版本

由于3.8以后的版本可以利用海象符来进行赋值,那么就可以避免单行长度大于23了



漏洞二:Bottle v0.13.2内存马学习

个人对内存马的学习,就是自定义一个路由,里面的路由调用了一个函数,而那个函数执行了什么内容,返回了啥,全由你自己决定,那么我们就可以利用这个特点,来执行命令了。

步骤一:路由

那么既然要找这个路由,我们就要先找哪个类的方法能去注册一个新的路由。

图片加载失败


我们点进去看看route这个方法

图片加载失败


然后他就会进入callable判断,

如果 path 是一个可调用对象,例如一个函数、字符串……(这也许也是在阐述python万物皆对象吧)

则交换 path 和 callback 的角色,将原本作为 path 的值赋给 callback,并将 path 设置为 None

如果判断成功他就会调用

下面是我测试的结果

其实就是把元组,集合,字符串,字典,整数转换为列表,然后把空值返回空列表,总的来说就是不管你是啥,你传进去了什么,就都返回列表给你。

那么

这段代码在apply和skip为空的情况下,pluains和skiplist也都为空

然后往下看就知道剩下的代码定义了一个装饰器decorator函数,专门用来接收callback参数,然后下面一段都是生成路由的规则

图片加载失败


步骤二:方法(method)

那么这个.route默认的方法是'GET',当然你也可以传一个POST进去

步骤三:callback

这里回扣到第一步,到底我们要传个什么样的值才能够成功生成一个函数呢?

所以我们目前需要探索的是如何不写一个完整的def的情况下自定义一个函数

这就不得不提到python自己默认自带的lambda表达式。

网上对

的讲解已经是非常深入了,这里就不再提咋用了。

简单的写一个

lambda : print(1)

图片加载失败




这里可以看到已经是成功了。

那么剩下的就是构造payload和绕waf的问题了。

这里我就放到后面再讲,写讲讲如果不走route方法还有哪些呢?



hook类

在flask框架中,调用钩子非常常见,我也阅读了这部分代码

图片加载失败


add_hook有讲怎么去调用这些函数

图片加载失败


这里就是看你传的是after_request就调用insert,不是就调用其他的。

图片加载失败


发现他后端会有,但是前端界面并不显示

在respond头回显

这里搜response

图片加载失败


发现有好几个类都是以BaseResponse作为父类

图片加载失败


图片加载失败


这里我们利用utf8加密,同时也利用base64加密一下内容。

这里在/memshell执行成功之后

图片加载失败


在/才能看到结果。

abort方法妙用

bottle框架中的一个内置函数abort

图片加载失败


直接就把异常给抛出来了,同时也是把结果给抛出来

图片加载失败




总结hook类poc

上面只提到了before_request,那么还有剩下的几个,看看能否打进内存马。

after_request

这个其实跟before_request一样,可以直接调用的





app_reset

图片加载失败


根据源码这里,其实就是跟route挺像的

开始我想着用这样来去添加,但最后发现不行,反复测试了好几次,感觉应该是不支持app_reset这个钩子的

但是看到文档里面也是有写着的

图片加载失败


还是太菜了,留给各位师傅挖掘吧。

0 条评论
某人
表情
可输入 255