0x00 漏洞介绍

smarty是一个基于PHP开发的PHP模板引擎。它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。由于SmartySmarty_Internal_Runtime_TplFunction模块通过引擎编译生成模板文件,攻击者可利用该漏洞在获得权限的情况下,构造恶意数据,最终造成远程代码执行。

0x01 漏洞环境

  • 攻击机:192.168.91.1 windows10
  • 目标机:192.168.91.142 Ubuntu 18.04-server(64)
  • 工具:火狐浏览器
  • Tiki Wiki版本:Tiki Wiki CMS 21.1, Smarty 3.1.38

0x02 漏洞搭建

1、docker搭建

1、Ubuntu-18.04-serverdockerdocker-compose安装与Ubuntu-20-server不一致,这里介绍18的,20的安装参考

https://github.com/sukusec301/vulhub

apt install docker docker-compose proxychains
proxychains wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip
unzip vulhub-master.zip
cd vulhub-master/tikiwiki/CVE-2020-15906/
docker-compose up -d

2、安装完毕后,ubuntu打开防火墙,ufw allow 8080

随后访问http://192.168.91.142:8080即可。如果访问不到,清理缓存,然后多试几次,有延迟。

3、设置docker容器开机自启动

因为当搭好服务之后,关机再看容器就exit了,那么只能再次docker start containerID了。

当我们建立起来了一个容器服务后,输入这条命令docker update --restart=always,下次再开机就好了,不用我们费事再start

2、CMS源码安装

https://tiki.org/Download在官网下载CMS

1、安装apache2、mysql、php、unzip、lrzsz

apt install -y unzip
apt install -y lrzsz
apt install -y apache2
apt install -y mysql-server
apt install -y php php-curl php-gd php-xml php-mbstring php-xmlrpc php-zip php-soap php-intl php-mysql php-xsl php-zip
mysql_secure_installation systemctl restart apache2
systemctl restart mysql

2、之后将源码拖进系统,解压缩,输入chown -R www-data:www-data tiki然后再访问,即可安装

3、之后这个邮箱可以忽略

4、新建一个数据库叫tiki,并且再新建一个用户root_sql,拥有管理员权限。然后下方填写新建用户的账号与密码。

mysql -u root -p
use mysql;
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'localhost' IDENTIFIED BY '密码' WITH GRANT OPTION;
flush privileges;
exit;
systemctl restart mysql

5、随后安装个什么数据库引擎。Mysql数据库最重要的底层机制就是存储引擎。主要有四种,详情参见:https://www.jianshu.com/p/4bb9f78b4f6d

这个tikiwiki cms支持两种吧可能,也可以能是我Mysql 5.6只支持的数据库引擎。这里随便选了一个。

6、随后安装完成

7、后面两部需要填写一些用户的邮箱之类的信息,不用管。到下面截图这一步就是最后一步,点击推荐的那个。

8、设置管理员密码

用户名:admin

密码:ZKebpy*uahcL

9、随后点击这个直接进入即可

10、成功进入,至此完成搭建成功。

0x03 影响范围

Tiki Wiki <21.2

Smarty是一个使用PHP写出来的模板引擎,是业界最著名的PHP模板引擎之一。全球有数万 Web服务器采用 Smarty,可能受漏洞影响的资产广泛分布于世界各地,中国大陆省份中,浙江、广东、山东、北京、上海等省市接近 30%。

目前受影响的Smarty版本:

Smarty<=3.1.38

0x04 漏洞条件

需要满足 Tiki Wiki CMS Groupware 认证绕过漏洞(CVE-2020-15906)

Tiki Wiki CMS Groupware或简称为Tiki(最初称为TikiWiki)是一种免费且开源的基于Wiki的内容管理系统和在线办公套件。在如下这些版本21.2, 20.4, 19.3, 18.7, 17.3, 16.4前存在一处逻辑错误,管理员账户被爆破60次以上时将被锁定,此时使用空白密码即可以管理员身份登录后台。

也就是说,需要先通过CVE-2020-15906来绕过认证,再使用CVE-2021-26119于后台执行命令

0x05 漏洞原理

由于Smarty中 Smarty_Internal_Runtime_TplFunction模块通过引擎编译生成模板文件,攻击者可利用该漏洞在获得权限的情况下,构造恶意数据,最终造成远程代码执行。在Smarty中,Smarty从$smarty.template_object变量访问实例,由于用户可以任意访问smartyparent属性,从而可以访问Smarty实例,没有相应的身份验证,导致攻击者可以构造任意恶意代码进行攻击。

0x06 漏洞复现

这里注意一下,我用的是docker安装的tiki,因为源码cms安装网站我使用POC无效。

1、从这里https://srcincite.io/pocs/cve-2021-26119.py.txt复制下来POCPOC.py。这个POC通杀这两个BUG

2、使用很简单,就是一行命令的事情,注意/后面有空格

python3 CVE-2021-26119.py 192.168.91.142:8080 / id
python3 CVE-2021-26119.py 192.168.91.142:8080 / whoami
python3 CVE-2021-26119.py 192.168.91.142:8080 / ifconfig

3、有一个很离谱的事情,就是我在想着怎么利用,可是使用bash反弹命令,怎么也反不回来。

4、使用CS的CrossC2生成一句话,居然让它上线了!这一点属实把我惊到了,可能是说这个python脚本出了某种问题。

5、最后收集一下这个源文件,将docker images打包成tar包,以下命令需要在docker启动靶机后使用

docker save -o tiki-21.tar vulhub/tikiwiki

CVE-2021-26119 PHP Smarty 模版沙箱逃逸远程代码执行漏洞的更多相关文章

  1. 一道简单的CTFpython沙箱逃逸题目

    看了几天的ssti注入然后了解到有python沙箱逃逸 学过ssti注入的话python沙箱逃逸还是很容易理解的. 看一道CTF题目,源码的话我改了改,一开始不能用,直接在py2上运行就好. 题目要求 ...

  2. smarty模版使用php标签,如何获取模版变量

    smarty模版使用php标签,如何获取模版变量 in: 后端程序 已经assign一个模版变量$assign,由于要做特殊的循环输出,使用for循环,因此使用到了php标签,但是php语句和模版语句 ...

  3. PHP smarty模版引擎基本安装

    环境:  PHP5.2 以上版本 先去官网下载smarty模版引擎的库文件到你的电脑或服务器上 smarty官方网站库文件下载地址: https://www.smarty.net/download 下 ...

  4. NodeJS沙箱逃逸&&vm

    NodeJS沙箱逃逸 关于nodejs的沙箱 使用场景 在线代码编辑器 第三方js代码 jsonp,like百度搜索框 https://www.baidu.com/s?wd=nodejs&mi ...

  5. Smarty模版引擎的原理

    Smarty是一个使用php写出来的模版引擎,用来将原本与html代码混杂在一起PHP代码逻辑分离,实现前后端分离. Smarty模板优点: 1. 速度:采用Smarty编写的程序可以获得最大速度的提 ...

  6. 【smarty项目源码】模拟smarty模版文件的解析过程

    <?php class MyMiniSmarty{ //模版文件的存放路径 var $template_dir="./templates/"; //编译文件的存放路径 ,编译 ...

  7. smarty模版使用php标签,获取模版变量!

    <ul>{/foreach from=$A key=k item=val/}{/php/} $val = $this->_tpl_vars[val]; $date = substr( ...

  8. 12月13日上午Smarty模版原理

    模板主要是用来让前端和后端分离的,前台页面只是一个前台页面,后台页面用php代码写逻辑,写完逻辑拿到前台显示. 一.写法 一般需要以下:写3个页面: 1.显示页面aa.html <!DOCTYP ...

  9. TP框架中用tp模版迁移smarty模版的注意事项

    ThinkPHP使用Smarty模板引擎的流程及注意事项在多人合作的项目中,Smarty模板使用的最多,具体原因百度. 而ThinkPHP中默认使用的模板是Think自己的模板,这就需要修改默认的模板 ...

随机推荐

  1. wayne编译支持k8s1.16+

    GitHub: https://github.com/Qihoo360/wayne 文档: 由于wayne 官方文档链接已经失效了,我们可以通过这里查看 wayne 文档, 除了这个地方,我们询问之前 ...

  2. c++ 设计模式概述之策略

    代码写的不规范,目的是为了缩短文章篇幅,实际中请不要这样做. 1.概述 类比现实生活中的场景,比如,我需要一块8G内存条,我可以选择:A.去线下实体店买,B.线上购买,C.其他渠道. 再比如,吃饭餐具 ...

  3. 【LeetCode】1466. 重新规划路线 Reorder Routes to Make All Paths Lead to the City Zero (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://lee ...

  4. 【LeetCode】338. Counting Bits 解题报告(Python & Java & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目描述 Given a non negati ...

  5. 从头造轮子:python3 asyncio 之 run(2)

    前言 书接上文,本文造第二个轮子,也是asyncio包里面非常常用的一个函数run 一.知识准备 ● 相对于run_until_complete,改动并不大,就是将入口函数重新封装了一下,基础知识主要 ...

  6. 分割字符串StringTokenizer

    StringTokenizer 原来是一个遗留类,并未被废弃,只是出于兼容性原因而被保留,在新代码中已经不鼓励使用它了,建议使用 String 的 split 方法或 java.util.regex ...

  7. 【C/C++笔记】友元类函数

    最近学了友元,有三个用法: 1友元函数 2友元类 3友元类函数 我发现友元类函数的用法要比上两个用法要严格,不按格式写会各种出错,要把两个类都拆开来写,共分4步. 第一步: class A; //有 ...

  8. 数据结构作业——P53算法设计题(6):设计一个算法,通过一趟遍历确定长度为n的单链表中值最大的结点

    思路: 设单链表首个元素为最大值max 通过遍历元素,与最大值max作比较,将较大值附给max 输出最大值max 算法: /* *title:P53页程序设计第6题 *writer:weiyuexin ...

  9. pycharm遇到的小问题

    1. Pycharm编写的代码出现满屏的波浪线,如何去除>>>点击右下角的小人图标将箭头移到中间syntax处即可. 2. 运行时报错: UserWarning: No parser ...

  10. Golang项目的配置管理——Viper简易入门配置

    Golang项目的配置管理--Viper简易入门配置 What is Viper? From:https://github.com/spf13/viper Viper is a complete co ...