PHP代码审计之WEB安全系列基础文章(十三)之SSTI篇
【如需转载,请详细表明来源,请勿设置原创】
嗨,大家好,我是闪石星曜CyberSecurity创始人Power7089。
欢迎大家扫描下方二维码关注 “闪石星曜CyberSecurity” 公众号,这里专注分享渗透测试,Java代码审计,PHP代码审计等内容,都是非常干的干货哦。
今天为大家带来PHP代码审计基础系列文章第十三篇之SSTI篇。
这是【炼石计划@PHP代码审计】知识星球第二阶段的原创基础系列文章,拿出部分课程分享给零基础的朋友学习。本系列原创基础文章涵盖了PHP代码审计中常见的十余种WEB漏洞,是匹夫老师精心的创作,欢迎关注我的公众号跟着一起学习。
【炼石计划@PHP代码审计】是一个系统化从入门到提升学习PHP代码审计的成长型知识星球。这里不仅注重夯实基础,更加专注实战进阶。强烈推荐加入我们,一起来实战提升PHP代码审计。
PHP代码审计之SSTI模板注入
1.SSTI模板注入原理
SSTI(Server-Side Template Injection)服务器模板注入也是注入的一种类型,它的原理与SQL注入有些类似,SQL注入是从前端获取用户输入,然后通过后端代码带到数据库中进行查询来执行我们想要执行的SQL语句。SSTI也是一样的,从前端获取参数值,然后在后端进行渲染处理时进行语句拼接执行。
由于如今大部分框架都是基于MVC模式进行开发的,我们的输入通过 V(view) 接收,交给 C(controller) ,然后由 C 调用M(model) 或者其他的 C 进行处理,最后再返回给 V ,这样就最终显示在我们的面前了,那么这里的 V 中就大量的用到了一种叫做模板的技术,而凡是使用模板的地方都有可能存在模板注入。
1.1 PHP常见模板引擎
1 |
|
1.2 模板引擎payload格式
1 |
|
2.SSTI相关函数
在PHP中如果使用了如上所述的模板引擎,在这些模板引擎之中分别利用不同的模板函数进行模板的渲染,如果函数中存在可控参数,那么很大概率会存在SSTI模板注入,下面我们通过介绍上述不同的模板引擎来引出引擎中的SSTI相关函数。
Twig
Twig是一款灵活、快速、安全的PHP模板引擎。
如果你接触过其他基于文本的模板语言,比如 Smarty、Django、或者Jinja,你便能轻松掌握Twig。它坚持PHP的原则,并为模板环境添加了有用的功能,使其同时保持对设计师和开发者友好。
Twig由一个灵活的词法分析器和解析器驱动。这使得开发者可以自定义标签和过滤器,并创建自己的DSL。
Twig已被用于许多开源项目,比如Symfony, Drupal8, eZPublish,phpBB, Piwik, OroCRM;并且许多框架也支持它,例如Slim, Yii, Laravel, Codeigniter and Kohana。
安装
将源码(https://github.com/twigphp/Twig/tree/v1.16.1)放置phpstudy中www目录下,并在phpstudy下创建网站让其解析。
代码示例:
在根目录下创建test.php代码用于测试代码是否正常运行。
Twig 首先使用一个加载器 Twig_Loader_Array
来定位模板,然后使用一个环境变量 Twig_Environment
来存储配置信息。其中, render() 方法通过其第一个参数载入模板,并通过第二个参数中的变量来渲染模板。
1 |
|
模板加载成功
Twig 模板注入也是发生在直接将用户输入作为模板,比如下面的代码:
这里我们需要渲染的内容用户可控,所以存在以下利用方式。
1 |
|
在Twig 1.X版本中有三个全局变量
这里主要就是利用 _self
变量,它会返回当前 \Twig\Template
实例,并提供了指向 Twig_Environment
的 env
属性,这样我们就可以继续调用 Twig_Environment
中的其他方法,从而进行 SSTI。
getFilter
里发现了危险函数 call_user_func
。通过传递参数到该函数中,我们可以调用任意 PHP 函数。
通过调用registerUndefinedFilterCallback()函数调用回调函数传入call_user_func()来执行命令
paylaod如下:
1 |
|
Twig 2.X、3.X中也存在相应的模板注入问题,感兴趣的同学们可以学习一下先知社区的这篇文章:
https://xz.aliyun.com/t/10056#toc-14
Smarty
Smarty 是 PHP 的模板引擎,有助于将表示 (HTML/CSS) 与应用程序逻辑分离。
在 3.X<3.1.42 和4.X< 4.0.2 版本之前,攻击者可以通过制作恶意数学字符串来运行任意 PHP 代码。
如果数学字符串作为用户提供的数据传递给数学函数,则外部用户可以通过制作恶意数学字符串来运行任意 PHP 代码。
安装
将源码(https://github.com/twigphp/Twig/tree/v1.16.1)放置phpstudy中www目录下,并在phpstudy下创建网站让其解析,与上面Twig部署方式类似。
我们可以直接使用其demo中的代码进行漏洞演示,如果大家想创建自己的demo,必须在自己的文件夹下创建cache,config,templates,templates_c四个文件夹。
手动创建demo1文件夹,文件夹下相应创建如下目录以及文件
我们来看一下smarty.inc.php这个文件,这是一个公共文件配置代码,我们打开看看具体内容。
这里的目录路径要相对于自己的目录进行调整。
1 |
|
网站主页index.php中代码如下:
$smarty->assign(‘value’,’Hello World’);的意思为用Hello World替代模板文件index.tpl里面的value字段的位置,也就是一个替换操作,具体等会看index.tpl文件就明白。
1 |
|
templates文件夹下创建index.tpl文件
代码如下:
1 |
|
将value替换为我们上述的Hello World。
如果这里**displa()**函数中我们的内容可控就会造成模板注入。
这里name传入XSS payload
3.SSTI漏洞利用
这里我们用一道CTF靶场来进行SSTI模板注入漏洞的演示:
地址:https://buuoj.cn/challenges(注册登录即可)
该题使用了Smarty模板,那么大概率和Smarty模板注入有关了。
在页面的右上角显示了IP地址,猜测可能是通过Smarty模板获取IP地址并通过渲染显示在前端,我们可以尝试该处获取IP地址处是否可控。
很明显这里的IP地址是从XFF获取,且直接通过display()进行渲染输入。
可通过**{$smarty.version}**探测smarty版本为3.1.30
这里我们可以通过{if php代码
}{/if}的形式在{if}标签中执行任意PHP代码。
4.SSTI模板注入代码审计总结
1 |
|