打开flag界面发现有个输入点,抓包看看嘛
发现cookie,而且输入的username在返回中看到了,sql注入不存在,所以应该是ssti模板注入
之前做题做到过,但是没做完整,这次趁这个机会学习一下!模板的开发初衷也是为了让业务代码和逻辑代码分离,大大提高开发效率,良好的设计也让代码重用变得更加容易。与此同时,它也拓展了黑客的攻击面,之前的XSS可以通过诸如带模板触发,除此之外,RCE也可以,虽然模板引擎会提供沙箱机制,但是还是会有很多手段饶过他,攻防无绝对嘛!
什么是服务端模板注入为什么要在模板注入前面加服务端,是为了和jQuery,KnockoutJS 产生的客户端模板注入区别开来。前者可以让攻击者执行任意代码,而后者只能 XSS。
通过模板,Web英语可以把输入转化成特定的HTML文件或者email格式。就拿一个销售软件来说,我们假设它会发送大量的邮件给客户,并在每封邮件前SKE插入问候语,它会通过Twig(一个模板引擎)做如下处理:
$output = $twig->render( $_GET['custom_email'] , array("first_name" => $user.first_name) );
我是在大佬那学到的这个,现在仔细读读发现可以XSS,但是问题不止如此。这行代码其实还有问题,假设我们发送的请求是
custom_email={{7*7}}
那么返回的会是
49 //$output结果
很明显服务器执行了我们传过去的数据,而不是简单解析。每当服务器用模板引擎执行用户的输入时,这类问题都有可能发生。除了常规的输入外,攻击者还可以通过 LFI(文件包含)触发它。模板注入和 SQL 注入的产生原因有几分相似——都是将未过滤的数据传给引擎执行。
探测 文本类大部分的模板语言支持我们输入HTML,比如:
smarty=Hello {user.name}
Hello user1
freemarker=Hello ${username}
Hello newuser
any=Hello
Hello
未经过滤的输入会产生 XSS,我们可以利用 XSS 做我们最基本的探针。除此之外,模板语言的语法和 HTML 语法相差甚大,因此我们可以用其独特的语法来探测漏洞。虽然各种模板的实现细节不大一样,不过它们的基本语法大致相同,我们可以发送如下 payload:
smarty=Hello ${7*'7'}
Hello 49
freemarker=Hello ${7*'7'}
Hello 49
来确认漏洞是否阳性
代码类在一些环境下,用户的输入也会被当作模板的可执行代码。比如说变量名:
personal_greeting=username
Hello user01
这种情况下,XSS 的方法就无效了。但是我们可以通过破坏 template 语句,并附加注入的HTML标签以确认漏洞:
personal_greeting=username
Hello
personal_greeting=username}}
Hello user01
通过这种方式可以判断属于哪种模板引擎,绿色代表成功返回,红色失败;原理是同一个可执行的 payload 会在不同引擎中返回不同的结果,比方说{{7*'7'}}会在 Twig 中返回49,而在 Jinja2 中则是7777777
举点栗子吧 SmartSmarty 是一款 PHP 的模板语言。它使用安全模式来执行不信任的模板。它只运行 PHP 白名单里的函数,因此我们不能直接调用 system()。然而我们可以从模板已有的类中进行任意调用。而文档表示我们可以通过 $smarty 来获取许多环境变量(比如当前变量的位置 $SCRIPT_NAME)。后面,我们又发现了 getStreamVariable:
这个函数能任意读取有读写权限的文件:
{self::getStreamVariable("file:///proc/self/loginuid")}
1000
{self::getStreamVariable($SCRIPT_NAME)}
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?