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

embedded/2024/11/14 21:09:29/

时间轴:

4d3c8e17e8b24e779f7e2ad20139f9f0.jpeg

演示案例

新闻列表&模板引用-代码RCE安全

知识点

1、PHP 新闻显示-数据库操作读取显示
2、PHP 模版引用-自写模版&Smarty 渲染
3、PHP 模版安全-RCE 代码执行&三方漏洞

新闻列表

1.数据库创建新闻存储

2.代码连接数据库读取

3.页面进行自定义显示

navicat新建表:news

下面勾选自动递增:

类型长度是否是null
idint10不是null1
titlevarchar255不是null 
authorvarchar255不是null 
contenttext 不是null 
imagevarchar255不是null 

 

在表中自定义输入内容,效果如下图所示

(图片可以自己找,保存在对应路径就行了)

5ee10195d5a14d4288fbf2ebc28bf31f.png

new.php

php"><?php
include 'config.php';$id=$_GET['id'] ?? '1';
$sql="select * from new where id = $id";
$data=mysqli_query($con,$sql);
while ($row=mysqli_fetch_row($data)) {echo "<title>" . $row['1'] . "</title><br>";echo $row['2'] . "<br>";echo $row['3'] . "<br>";echo "<img src='$row[4]' width='1000' height='3000'></img><br>";
}

显示如下:

caa09cf485fb43e48329f728d168b8d7.png

 

模板调用:

演示1:

php中改变,从而影响html,导致页面得到改变。

php代码如下:

php"><?php
include 'config.php';
$template = file_get_contents('new.html'); //读取new.html
$id=$_GET['id'] ?? '1';
$sql="select * from new where id = $id";
$data=mysqli_query($con,$sql);
while ($row=mysqli_fetch_row($data)) {echo "<title>" . $row['1'] . "</title><br>";echo $row['2'] . "<br>";echo $row['3'] . "<br>";echo "<img src='$row[4]' width='1000' height='3000'></img><br>";
}
$template=str_replace('{title}',$row['1'],$template); //str_replace:替换(search,替换为,替换对象(位置))
eval('?>'.$template);   //尝试确保$template字符串以PHP结束标签结束 

html代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{Title}</title>
</head>
<body></body>
</html>

演示2:

数据库编辑:

3fad31146daa4a6eb0f839a2cc7c3148.png

news.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>{page_title}</title><style>/* 一些样式 */body {font-family: Arial, sans-serif;margin: 0;padding: 0;}header {background-color: #4CAF50;color: white;text-align: center;padding: 20px;}nav {background-color: #f2f2f2;display: flex;justify-content: space-between;padding: 10px;}nav a {color: black;text-decoration: none;padding: 10px;border-radius: 5px;transition: background-color 0.3s ease;}nav a:hover {background-color: #4CAF50;color: white;}.container {max-width: 1200px;margin: 0 auto;padding: 20px;}h1 {font-size: 36px;font-weight: bold;margin-bottom: 20px;}p {font-size: 18px;line-height: 1.5;margin-bottom: 20px;}ul {margin-left: 20px;margin-bottom: 20px;}li {margin-bottom: 10px;}</style>
</head>
<body>
<header><h1>{heading}</h1>
</header>
<nav><a href="#">首页</a><a href="#">新闻</a><a href="#">留言</a><a href="#">关于</a>
</nav>
<div class="container"><h1>{subheading}</h1><p>{content}</p><img src="{$item}" width="1000" height="3000"></img></div>
</body>
</html>

news.php

php"><?php
include 'config.php';
$template = file_get_contents('new.html'); //读取new.html
$id=$_GET['id'] ?? '1';
$sql="select * from news where id = $id";
$data=mysqli_query($con,$sql);
while ($row=mysqli_fetch_row($data)) {$page_title=$row['1'];$heading=$row['2'];$subheading=$row['3'];$content=$row['4'];$item=$row['5'];//echo $page_title;
}//echo "$page_title<br>$page_title";$template=str_replace('{page_title}',$page_title,$template);
$template=str_replace('{heading}',$heading,$template);
$template=str_replace('{subheading}',$subheading,$template);
$template=str_replace('{content}',$content,$template);
$template=str_replace('{$item}',$item,$template);//str_replace:替换(search,替换为,替换对象(位置))
eval('?>'.$template);   //尝试确保$template字符串以PHP结束标签结束

效果演示:

b857d76a3ad74072b8ee725bf41f0429.png

总结:

使用模板可以减少每个页面都写html,且在php中改就可以影响html从而决定页面。

对于MVC模型:(v——>video视图)

使用模板保证了

1.效率   2.美观度

 

z-blog模板:

全局搜索:Powered By进行修改,找到WhitePage —>footer.php

cf240eb910d646149d35e176edb776a5.png

效果演示:

0b0f717a550a4e16a61d1568999e4c91.png

总结:

找到首页文件可以在WhitePage中修改,其他首页内容和其也有关。

安全漏洞:

1.在数据库后台加上<?php phpinfo();?>(数据库中)

bc03129e49fe4e1382cd215acd0fa1fc.png

2.在new.html代码中加入<?php phpinfo();>后

使用new.php,会让new.php渲染new.html,会执行new.html中的php代码。

(所以当得到模板后加以修改,可以在后台执行)

703ce676f8ff4b7bba7675010d5c33f4.png

 

#Smarty 模版引用

下载: https://github.com/smarty-php/smarty/releases
使用:
1、在phpstorm用文件夹创建一个文件夹,命名为 smarty-demo。(注意级别)
2、拉入demo项目
3、创建一个index.php,将代码复制进去。
4、将目录与代码中对应上
4.1—>新建一个index.tpl
4.2—>在里面写入html代码与index.php里的对应
5.在第三方模板index.tpl写上<?php phpinfo();?>不会显示

index.php:

(目录位置要和代码对应上)

php"><?php
// 引入 Smarty 类文件
require('smarty/libs/Smarty.class.php');
// 创建 Smarty 实例
$smarty = new Smarty;
// 设置 Smarty 相关属性
$smarty->template_dir = 'smarty/templates/';    //smarty目录和此smarty对应上
$smarty->compile_dir = 'smarty/templates_c/';
$smarty->cache_dir = 'smarty/cache/';
$smarty->config_dir = 'smarty/configs/';
// 赋值变量到模板中
$smarty->assign('title', '欢迎使用 Smarddddty');   //title和index.tql里的$title对应上
// 显示模板
$smarty->display('index.tpl');  
?>
在smarty中创建templates:
在templates下创建index.tpl
在index.tpl中放入html代码。
33b2bab2adf144ef84a6516a41b57e33.png
效果显示:打开index.php,在index.tpl写上<?php phpinfo();?>(不会显示)
6f25fffdebb246d8b1129ff08e13ea52.png

安全漏洞:

CVE-2021-29454:

smarty<=3.1.32

将代码放入index1.tpl:(其他步骤一样)

index1.tpl:

php"><?phpdefine('SMARTY_ROOT_DIR', str_replace('\\', '/', __DIR__));define('SMARTY_COMPILE_DIR', SMARTY_ROOT_DIR.'/smarty3/templates_c');define('SMARTY_CACHE_DIR', SMARTY_ROOT_DIR.'/smarty3/cache');include_once(SMARTY_ROOT_DIR . '/smarty3/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['x']);
?>

效果展示:(以x传参,x*/phpinfo();//)

0fd54cb0c0d24dce86ae260ae0480594.png

如果版本及目录换成smarty(不是smarty3):

59d03ccf221f4a859ae4e31689fe1d51.png

则:

dcd95af11a154201ad10ed3535f56f82.png

 

思路核心总结:

1.自己写的模板 rce安全问题
2.第三方smarty模板 没有直接安全问题
他也有漏洞:
    1.本身代码漏洞
    2.第三方插件(ueditor)
    3.第三方模板(smarty)
    4.第三方组件(shiro fastjson等)

漏洞共享平台:

CNVD国家信息安全漏洞共享平台
信息收集:黑盒->插件
白盒->源码
模板->显示页面美观
框架->核心代码逻辑
组件->其他功能(类似插件)

框架模板组件分类:

php


1.框架:thinkphp yii laravel
核心开发 代码逻辑核心(代码逻辑)

2.模板:smarty
负责主要显示页面美观的

3.组件:ZendGuardLoader php-imagick
第三方组件(图片处理,数据转换,数据库操作等)


java


框架:struts2 springboot ssm
模板:
组件:shiro fastjson

白盒:
黑盒:

端口扫描 数据库包特征 识别插件工具等

该文章由番薯小羊卷~和李豆豆喵共同完成。

 


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

相关文章

vue2 自动化部署 shell 脚本

需求场景&#xff1a;在云平台中进行开发时&#xff0c;由于无法连接外网&#xff0c;在部署前端项目时&#xff0c;是通过本地打包再上传到服务器的方式进行部署的。基于这种部署场景&#xff0c;通过 shell 脚本进行部署流程优化&#xff0c;具体如下&#xff1a; 1、服务器…

Solon MVC 的 @Mapping 用法说明

在 Solon Mvc 里&#xff0c;Mapping 注解一般是配合 Controller 和 Remoting&#xff0c;作请求路径映射用的。且&#xff0c;只支持加在 public 函数 或 类上。 1、注解属性 属性说明备注value路径与 path 互为别名path路径与 value 互为别名method请求方式限定(defall)可用…

【C++ 算法进阶】算法提升十四

目录 括号匹配问题 &#xff08;动态规划&#xff09;题目题目分析代码 子数组最接近某个数 &#xff08;动态规划&#xff09;题目题目分析代码 求出数组中缺失的最小正整数 &#xff08;贪心&#xff09;题目题目分析代码 恢复二叉搜索树 &#xff08;二叉树的性质&#xff0…

【Python】爬虫通过验证码

1、将验证码下载至本地 # 获取验证码界面html url http://www.example.com/a.html resp requests.get(url) soup BeautifulSoup(resp.content.decode(UTF-8), html.parser)#找到验证码图片标签&#xff0c;获取其地址 src soup.select_one(div.captcha-row img)[src]# 验证…

Qt:QPdfDocument渲染PDF文件时的信息丢失问题

背景 Qt自带了QPdfDocument可以用来打开并渲染PDF文件&#xff0c;同时Qt也提供了qtpdf multipage example&#xff0c;可以浏览多页PDF文件&#xff0c;如下图&#xff1a; 问题 但在使用过程中发现&#xff0c;对于某些PDF文件&#xff0c;QPdfDocument在渲染时会丢失部分信…

Golang | Leetcode Golang题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; type point struct{x, y int }var dirs []point{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func updateMatrix(mat [][]int) [][]int {var m, n len(mat), len(mat[0])var res make([][]int, m)var visited make([][]bool, m)var queue []poin…

Vivado+Vscode联合打造verilog环境

一、Vivado下载安装 详细参考我另一篇文章&#xff1a; Vivado2022.2下载安装_fpga vivado下载-CSDN博客https://blog.csdn.net/weixin_61081689/article/details/143460790?spm1001.2014.3001.5501 二、Vscode下载安装 详细参考我另一篇文章&#xff1a; VscodeAnacond…

Spring Boot基础教学:Spring Boot 简介

第一部分&#xff1a;Spring Boot 简介 1.1 什么是Spring Boot&#xff1f; Spring框架的简介Spring Boot与Spring框架的关系Spring Boot的优势 1.2 Spring Boot的核心特性 自动配置起步依赖内嵌服务器Spring Boot CLIActuator 1.3 Spring Boot的应用场景 微服务REST API…