PHP SSTI(Twig)

学习文章

进入环境,左上角有flag,hint

都检查看看

SSTI 学习笔记SSTI 学习笔记

flag页面显示ip,hint页面源代码有提示

SSTI 学习笔记SSTI 学习笔记

SSTI 学习笔记SSTI 学习笔记

 考虑XFF头或者referer头

SSTI 学习笔记SSTI 学习笔记

测试一下

SSTI 学习笔记SSTI 学习笔记

注:这里不用加上“;”

SSTI 学习笔记SSTI 学习笔记

出来了

SSTI 学习笔记SSTI 学习笔记

 

python flask ssti

学习文章

原理:因为对输入的字符串控制不足,把输入的字符串当成命令执行。

漏洞产生主要原因:render_template渲染函数的问题

渲染函数在渲染的时候,往往对用户输入的变量不做渲染,
即:{undefined{}}在Jinja2中作为变量包裹标识符,Jinja2在渲染的时候会把{undefined{}}包裹的内容当做变量解析替换。比如{undefined{1+1}}会被解析成2。因此才有了现在的模板注入漏洞。往往变量我们使用{undefined{这里是内容}}
真因为{undefined{}}包裹的东西会被解析,因此我们就可以实现类似于SQL注入的漏洞

像文件包含,有一个include函数,sql注入,似乎都有些共同点,都是利用某个函数或者其他的东西,执行恶意的命令

因为我们需要执行一些命令,例如,file、read、open、ls等等

就需要去调用这些函数

这就需要用到这个魔术对象

__class__  :返回类型所属的对象
__mro__    :返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__   “返回该对象所继承的基类
// __base__和__mro__都是用来寻找基类的

__subclasses__  获取当前类的所有子类
__init__  类的初始化方法
__globals__  对包含(保存)函数全局变量的字典的引用

通过魔术对象调用我们需要的函数,例如

>>> [].__class__.__base__.__subclasses__()[2]
<class 'weakcallableproxy'>
>>> [].__class__.__base__.__subclasses__()[3]
<class 'weakproxy'>
>>> [].__class__.__base__.__subclasses__()[40]
<class 'wrapper_descriptor'>

Bugku Simple_SSTI_1

进入环境

SSTI 学习笔记SSTI 学习笔记

查看源代码

SSTI 学习笔记SSTI 学习笔记

 意思是我们需要传一个flag变量,并且提示我们有个secret_key

SSTI 学习笔记SSTI 学习笔记

 测试下有没有ssti

SSTI 学习笔记SSTI 学习笔记

 有的,我们去看看sectet_key

SSTI 学习笔记SSTI 学习笔记

这里是需要大写的

SSTI 学习笔记SSTI 学习笔记

 

Bugku Simple_SSTI_2

进入环境

SSTI 学习笔记SSTI 学习笔记

源代码并没有提示,只是让我们传一个pass变量

SSTI 学习笔记SSTI 学习笔记

 这里证明有ssti那就看看目录

SSTI 学习笔记SSTI 学习笔记

 一个一个看下,先看app

SSTI 学习笔记SSTI 学习笔记

 有flag目录

SSTI 学习笔记SSTI 学习笔记

Bugku Flask_FileUpload

进入环境

SSTI 学习笔记SSTI 学习笔记

 源代码里有提示

SSTI 学习笔记SSTI 学习笔记

 上传文件,会用Python执行文件返回结果

先随便上传个文件试试

SSTI 学习笔记SSTI 学习笔记

发现只能上传jpg或者Png

SSTI 学习笔记SSTI 学习笔记

 那就改下后缀继续上传

SSTI 学习笔记SSTI 学习笔记

 会在源代码里返回执行的结果,那么可以试试命令执行

SSTI 学习笔记SSTI 学习笔记

SSTI 学习笔记SSTI 学习笔记

抓flag

SSTI 学习笔记SSTI 学习笔记

 

SSTI 学习笔记SSTI 学习笔记