分享好友 最新动态首页 最新动态分类 切换频道
2. SSTI(模板注入)漏洞(cms实例篇)
2024-12-26 21:27

上篇《SSTI(模板注入)漏洞(入门篇)》主要介绍了PHP/Python/Java常见的几种模板注入,本篇主要通过cms实例来更好的理解并且挖掘SSTI。

以下cms的源码地址:https://github.com/bmjoker/Code-audit/

先给出漏洞payload:

通过搜索代码执行常用的字段(eval,assert...),定位到此处

查看 maccms_php_v8.xinccommon emplate.php 文件,判断变量是否可控:

可以看到如果想构造代码执行,需要控制变量 $strif ,通读上下文发现一条数据链:

最原本的传进来的数据是 $this->H ,经过 preg_match_all() 函数进行正则匹配,把匹配到的结果赋值给 $iar 这个二维数组,进入for循环遍历数组,将 $iar[2][$m] 所指的元素传入 asp2phpif() 方法进行安全过滤,最后的返回值就是 $strif 。 

这里看到 asp2phpif() 方法仅是对一些字符的替换。

先来追踪一下 ifex() 函数在哪里被调用:

最后定位到了 maccms_php_v8.xindex.php 文件,发现了调用的地方 $tpl->ifex(),那么 $this->H 参数从哪里传进来呢?

最上面看到了这样一段代码:$m = be('get','m'),跟进 be() 这个方法:

再结合网站的请求:

大概了解了网站接收参数的方法。 $m = be('get','m'):就是通过get请求获取m的参数。然后获取到的参数被 explode() 方法以 - 分割成数组传递给 $par,取数组的第一个元素赋值给$ac,判断 $ac 所指的元素是否在 $acs 的数组中,如果存在的话就使用 include 包含 /inc/module/ 目录下以 $ac 所指元素命名的php文件。

根据payload,进入vod.php文件,这里给出关键代码:

当我们调用 search 方法时,就会进入此分支,通过 be("all","wd") 获取用户传进来的wd的参数,传入 chkSql 方法,然后赋值给 $tpl->P["wd"]

仅是使用 htmlEncode() 方法对一些字符判空,转义。

$tpl->H 就是传入ifex() 方法中的 $this->H 参数,因为 $tpl = new AppTpl()。上图代码中 $tpl->H 加载文件 vod_search.html 然后展示给前端。

$colarr$valarr两个参数数组,经过 str_replace() 方法,将 vod_seach.html 中的类似 {page:des} 的字段替换成 $tpl 所指向的字段,漏洞导致的关键是这个 $tpl->P["wd"] 是我们前端可控的参数。

执行完上面的赋值,回到index.php中下一步就调用 ifex() 方法

$tpl->H 就是替换过后的 vod_search.html 文件

这样的话再倒过来看最初的 template.php 文件,是不是就清楚多了

通过for循环一次一次的匹配到类似  {if-A:"{page:typepid}"="0"}  的字段,赋值给变量 $strif,传入eval方法导致代码执行漏洞 

下面就是如何构造合适的payload绕过正则表达式:{if-([sS]*?):([sS]+?)}([sS]*?){endif-1}

 类似这样即可:

真正代码调试过的人,可能有的人会有疑问,因为使用上面payload的话  if (strpos(",".$strThen,$labelRule2)>0),if (strpos(",".$strThen,$labelRule3)>0) 两个循环都无法进入,所以真正的漏洞出发点在 else:

漏洞演示效果:

静态插桩打印 $iar 的值:

打印 $strif 的值:

参照上面打印 $iar 的值,第三个 phpinfo() 进入else分支的eval函数中,导致代码执行。

ofcms是由JFinal开发的内容管理系统。

从pom.xml可以看到引入freemarker-2.3.21依赖

JFinal允许多模板共存,如果想要使用freemarker模板,需要在configConstant配置

然后再使用 JFinal.me() 调用模板,使用 put 用来替换原来输出response html代码输出到浏览器

到这里我们是不是可以理解为网站的html文件由FreeMarker模板进行渲染。

ofcms后台模板文件

任意选择一个html文件,再文件中插入我们的payload:

保存,在前台访问404.html界面

FreeMarker解析了404.html文件中我们插入的payload,导致命令执行

由于74CMS是基于Thinkphp3的语法魔改而成。建议先去大概看一下Thinkphp3的开发手册:http://document.thinkphp.cn/manual_3_2.html#

先来看一下漏洞代码:ThinkPHPLibraryThinkView.class.php

在第122行,include $templateFile 典型的文件包含,如果 $templateFile 可控就可以getshell。

通读 fetch() 函数代码,发现如果想要文件包含,传进来的参数 $content 必须为空,才能进入if循环与下面的三元表达式。把前端获取的 $templateFile 传进 parseTemplate() 方法:

啊...这?传进来的参数 $template 经过 is_file() 仅仅是做了文件是否存在以及是否为正常的文件,就直接把 $template return ...

当使用PHP原生模板时会进入下面的if循环,紧接着就 include $templateFile 。

什么是PHP原生模板?

由开发者手册可知,如果要使用PHP代码时尽量采用php标签,也就是 <php>...</php> 这种形式

大概知道这些,我们就可以通过上传内容为PHP原生模板的文件,再使用 include 包含。

继续回溯代码,寻找哪里调用 fetch() 这个函数,包括参数从哪里传过来

同文件下的 display() 方法里调用了fetch() 方法,看过模板手册的都知道,渲染模板输出最常用的是使用display方法,继续查找 display() 在哪里被调用

可以看到在 Controller.class.php 中有调用

直接在 MController.class.php 文件中就可以看到 display() 函数的调用

熟悉Tp框架的应该知道 I 方法时用来接收参数,而第20行 I('get.type'...) 说明 $type 可以通过get方式从前端获取

可见,这里将 $type 参数传入 display() 函数,display() 函数是 ThinkPHP 中展示模板的函数。然后又将参数传入 View 类的 display() 函数,最后调用 fetch() 函数,导致文件包含漏洞

使用自带的 favicon.ico 做下试验,看是否能成功包含:

成功包含。

如果想要包含我们构造的恶意文件,需要满足两个条件:

  1. 可以将恶意文件上传到服务器

  2. 有文件的绝对路径

注册一个账户,登录后台寻找文件上传的地方:

个人用户创建简历后支持上传 docx 格式的简历。上传一个内容为PHP原生模板的 docx 文件,将其作为模板。数据包如下:

上传文件的绝对路径为:/74cms_v4.1.5/upload/data/upload/word_resume/2009/14/5f5f8bdb56593.docx

再将这个文件名作为type的值,成功执行代码:

首先通过搜索关键字定位到导致漏洞的代码:coreviewView.php  ——>  parser()

根据payload,参数大概调用过程如上图

漏洞的关键点是 include $tpl_c_file,文件包含模板文件导致getshell。

parser() 方法接受传过来的模板文件 $file,经过 preg_replace() 方法来过滤掉相对路径(例如:https://www.cnblogs.com/bmjoker/,..),这里使用了不安全的替换,因为 preg_replace() 匹配到不安全的字符不是直接exit,而是选择替换成空,利用这个可以尝试构造绕过,像下图这样:

然后将替换过后的 $file 传入if 循环,第一个if判断 $file 是否是以 / 开头,第二个elseif判断 $file 是否包含 @ ,如果都不满足进入else拼接,$tpl_file = 模板路径 + / + $file

$tpl_file 是模板文件,$tpl_c_file 是要编译的文件。

继续看代码发现在121行又做了一次拼接,$tpl_c_file = 模板路径 + / + md5($tpl_file) + .php。紧接这是一个if判断,判断文件是否存在,判断 $tpl_c_file 文件的修改时间是否小于 $tpl_file,判断读取配置文件是否成功,很尴尬,全都是false,直接跳过if循环,到达关键地方,直接 include 包含我们构造的文件,导致漏洞产生。

这里可能有的人会有疑问,因为在到达 include 的时候,$tpl_c_file是 模板路径 + / + md5($tpl_file) + .php 这种形式,我们构造的文件路径早已面目全非。这个地方需要注意这个漏洞的根本原因是PbootCMS2.07内核处理缺陷导致的一个前台任意文件包含漏洞,他的内核函数在生成编译文件的时候造成任意文件读取。

parser() 方法已经分析完毕,现在需要寻找调用了parser函数的地方,且参数可控

进入 Controller.php 文件

这里看到显示模板,解析模板都有调用到 parser 方法,继续跟踪判断哪里调用

显示模板 display() 方法发现没有参数可控,但是解析模板 parser() 方法,发现有变量传入

先来看 SearchController.php 文件

index() 方法中,接收前端传递过来的参数,进入正则匹配,这正则匹配任意的字符,还包括-,.,/,最后直接传入 parser() 方法中,直接构造利用读取robots.txt:

同样构造利用的还有 TagController.php 文件

包含写入shell的txt文件:

最新文章
公司地址进高德地图怎么弄-商家新开门店地图定位
2024年01月14日吴经理100地图标注 , 地图定位 , 导航地图标记网络技术服务;信息技术咨询服务;技术服务、技术开发、技术咨询、技术交流、技术转让、技术推广;日用百货销售;化妆品零售;互联网销售(除销售需要许可的商品);化妆品批发;服
打造企业互联网品牌形象,关键步骤解析
品牌建设搭建是塑造企业互联网形象的关键步骤。它包括品牌定位、核心价值提炼、品牌视觉识别系统设计、线上线下传播策略制定等。通过系统化、专业化的品牌建设,企业可在互联网上树立独特、有吸引力的形象,提升市场竞争力。确立品牌定位定
百度快速收录:让你的网站飞速腾飞!
网站结构优化:合理的网站结构能够帮助搜索引擎更好地理解和索引网页。清晰的URL结构、良好的内部链接布局等都是优化网站结构的关键。网站提交与验证:主动提交网站URL到百度站长平台,并验证网站所有权。这样可以加速百度搜索引擎对网站的
高清美女写真一键生成!探索最新AI绘画神器!
在这个日新月异的数字时代,科技飞速发展,越来越多的平台开始涉足AI生成艺术领域。作为一个喜欢拍照和追求视觉美感的宝子们,或许你也曾幻想过,能否有一种工具能够让我们的想象画面变为现实?今天,就让我来给大家介绍几款超棒的AI绘画工
连点器一秒200下怎么设置?简单3步教会你鼠标连点(图文详解)
第二步:设置连点器一秒200下点击在软件主界面中,可以发现有四个功能模块,包括鼠标连点、键盘连点、键鼠录制及鼠标宏。我们点击【鼠标连点】功能。然后在界面右侧,设置您想要点击的鼠标按键、点击方式、点击位置。在每次点击间隔时间中
seo搜索优化公司
SEO搜索优化公司专注于提升网站在搜索引擎中的排名,以增加网站流量和客户。他们提供全面的SEO服务,包括关键词研究、网站内容优化、链接建设等,帮助企业提升在线可见度和品牌知名度。这些公司利用最新的SEO技术和策略,确保客户的网站在
张家口智能操控装置ZN-CK80-6厂家+2025排名一览
张家口智能操控装置ZN-CK80-6厂家+2025排名一览 1. 产品概述 - WSK - S-(TH)智能温湿度控制器是一种能够对环境温湿度进行精确监测和控制的设备。它结合了先进的传感器技术和智能控制算法,用于维持环境温湿度在设定的范围内。2. 功能特点 -
黑客发起持续近一年大规模行动,窃取超39万个WordPress登录凭证
IT之家 12 月 16 日消息,据 BleepingComputer 上周六报道,威胁行为者 MUT-1244 通过一项持续近一年的大规模行动,窃取了超过 39 万个 WordPress 登录凭证。这些凭证是通过一个带有木马的 WordPress 凭证检查器盗取的,目标是其他网络攻击
胎教
现代医学证实,胎儿确有接受教育的潜在奇能,主要是通过中枢神经系统与感觉器官来实现的。孕26周左右胎儿的条件反射基本上已经形成。在此前后,科学地、适度地给予早期人为干预,可以使胎儿各感觉器官在众多的良性信号刺激下,功能发育得更
湖南百度推广(湖南百度推广收费标准)
竞价是按点击收费的。靠前次开户,5000元的存款费600元的客服费(据说明年要涨到8000元1200元)。可以设置搜索关键词的点击价格,在搜索多数网名时根据价格和输入字段的匹配度来决定排名。最好和你签合同的业务员搞好关系。首次缴费明细:
相关文章
推荐文章
发表评论
0评