第26天:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

本文主要是介绍第26天:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第二十六天

Untitled

一、PHP新闻显示-数据库操作读取显示

1.新闻列表

  1. 数据库创建新闻存储
  2. 代码连接数据库读取
  3. 页面进行自定义显示

二、PHP模版引用-自写模版&Smarty渲染

1.自写模版引用

  1. 页面显示样式编排
  2. 显示数据插入页面
  3. 引用模版调用触发

2.Smarty模版引用

1.下载:https://github.com/smarty-php/smarty/releases
2.使用:
  1. 创建一个文件夹,命名为smarty-demo。
  2. 下载Smarty对应版本并解压缩到该文件夹中。
  3. 创建一个PHP文件,命名为index.php,并在文件中添加以下代码:
3…源码写法:
<?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模版安全-RCE代码执行&三方漏洞

1.代码RCE安全测试

1.自写模版的安全隐患
  1. 如果在数据库中任何地方添加<?php phpinfo();?> ,在调用数据库内容的时候会自动显示
  2. 如果在html模板源码中加入<?php phpinfo();?> ,在执行HTML并不会显示,但通过php解析调用,则依然会展示有关内容
2.第三方Smarty的安全隐患
  1. 安全风险: 显示详细的 PHP 信息可能透露有关服务器配置的敏感信息,包括 PHP 版本、扩展和路径。攻击者可以利用这些信息来识别潜在的漏洞
  2. 信息泄露: 在生产环境中,显示详细的 PHP 信息是不推荐的,因为存在信息泄露的风险。攻击者可能利用这些信息更好地了解服务器的设置并识别潜在的攻击点
  3. 服务器加固: 安全最佳实践涉及将服务器信息的暴露最小化,以减少攻击面。应该限制不必要的服务器环境信息,以降低攻击表面

四、环境复现

1.新闻列表

<?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);
?>

2.自编程模板引用

// 从文件中读取HTML模板内容
$template = file_get_contents('new.html');// 使用mysqli_fetch_row遍历结果集的每一行
while ($row = mysqli_fetch_row($data)) {// 从结果集中获取每一列的值,并存储到相应的变量中$page_title = $row[1];$heading = $row[2];$subheading = $row[3];$content = $row[4];$item = $row[5];
}// 替换HTML模板中的占位符
$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);// 将PHP代码嵌入HTML模板中并执行
eval('?>' . $template);// 关闭数据库连接
mysqli_close($con);

3.Smarty模版引用

<?php
// 引入 Smarty 类文件
require('smarty/libs/Smarty.class.php');// 创建 Smarty 实例
$smarty = new Smarty;// 设置 Smarty 相关属性
$smarty->template_dir = 'smarty/templates/';  // 设置模板文件的目录
// 指定 Smarty 模板文件所在的目录,这里使用了相对路径,可以根据实际情况修改
$smarty->compile_dir = 'smarty/templates_c/';  // 设置编译文件的目录
// 指定 Smarty 编译生成的模板文件所存放的目录,用于存放 Smarty 编译生成的 PHP 文件
$smarty->cache_dir = 'smarty/cache/';  // 设置缓存文件的目录
// 指定 Smarty 缓存文件的存放目录,用于存放 Smarty 缓存文件
$smarty->config_dir = 'smarty/configs/';  // 设置配置文件的目录
// 指定 Smarty 配置文件的存放目录,用于存放 Smarty 配置文件// 赋值变量到模板中
$smarty->assign('title', '欢迎使用 Smarty');  // 将变量 'title' 赋值为 '欢迎使用 Smarty'// 显示模板
$smarty->display('index.tpl');  // 使用 'index.tpl' 模板文件进行显示
?>

4.Smarty3模版引用——有漏洞

<?php// 定义 Smarty 根目录路径常量
define('SMARTY_ROOT_DIR', str_replace('\\', '/', __DIR__));// 定义 Smarty 编译文件目录路径常量
define('SMARTY_COMPILE_DIR', SMARTY_ROOT_DIR . '/smarty3/tmp/templates_c');// 定义 Smarty 缓存文件目录路径常量
define('SMARTY_CACHE_DIR', SMARTY_ROOT_DIR . '/smarty3/tmp/cache');// 包含 Smarty 类文件
include_once(SMARTY_ROOT_DIR . '/smarty3/libs/Smarty.class.php');// 自定义 Smarty 资源类,继承自 Smarty_Resource_Custom
class testSmarty extends Smarty_Resource_Custom
{// 重写 fetch 方法protected function fetch($name, &$source, &$mtime){// 自定义模板内容,这里只是示例,实际情况应该从数据库或其他来源获取模板内容$template = "CVE-2017-1000480 smarty PHP code injection";// 将模板内容赋值给 $source 参数$source = $template;// 设置模板修改时间为当前时间$mtime = time();}
}// 创建 Smarty 实例
$smarty = new Smarty();// 设置 Smarty 缓存文件目录
$smarty->setCacheDir(SMARTY_CACHE_DIR);// 设置 Smarty 编译文件目录
$smarty->setCompileDir(SMARTY_COMPILE_DIR);// 注册自定义资源类型 'test',并指定使用 testSmarty 类处理该资源类型
$smarty->registerResource('test', new testSmarty);// 获取要显示的模板名称,并通过 $_GET['eval'] 获取,存在安全风险,应谨慎使用
$templateName = 'test:' . $_GET['eval'];// 显示模板
$smarty->display($templateName);?>

这篇关于第26天:安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931364

相关文章

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis