您当前的位置: 首页 > 

姜小孩.

暂无认证

  • 6浏览

    0关注

    51博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

[BJDCTF2020]Cookie is so stable(ssti模板注入从0到1学习笔记)

姜小孩. 发布时间:2022-03-31 14:01:54 ,浏览量:6

打开题目,看名字觉得和cookie注入有关,打开后看看hint的源代码发现了这个

打开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

举点栗子吧 Smart

Smarty 是一款 PHP 的模板语言。它使用安全模式来执行不信任的模板。它只运行 PHP 白名单里的函数,因此我们不能直接调用 system()。然而我们可以从模板已有的类中进行任意调用。而文档表示我们可以通过 $smarty 来获取许多环境变量(比如当前变量的位置 $SCRIPT_NAME)。后面,我们又发现了 getStreamVariable:

这个函数能任意读取有读写权限的文件:

{self::getStreamVariable("file:///proc/self/loginuid")}
1000
{self::getStreamVariable($SCRIPT_NAME)}
            
关注
打赏
1652274937
查看更多评论
0.0339s