当前位置: 首页 > article >正文

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

时间轴:

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
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
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
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
// 引入 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

define('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.kler.cn/a/388559.html

相关文章:

  • GISBox VS ArcGIS:分别适用于大型和小型项目的两款GIS软件
  • 040 线程池
  • 什么是RAG? LangChain的RAG实践!
  • PostgreSQL中的COPY命令:高效数据导入与导出
  • 使用VSCode远程连接服务器并解决Neo4j无法登陆问题
  • 项目模块十七:HttpServer模块
  • 多线程编程中,使用 std::mutex 需要注意一些潜在的问题
  • 机器人开发:从零开始构建你的第一个机器人
  • 实验(未完成)
  • 43.第二阶段x86游戏实战2-提取游戏里面的lua
  • 宏观经济学笔记
  • PyQt5 详细安装与配置教程及使用
  • CSS的配色
  • 阿尔特曼:AGI 和 ASI 将在未来几千天内到来
  • 【SSL-RL】自监督强化学习:随机潜在演员评论家 (SLAC)算法
  • 几种QQuickWidget与Qml交互数据的方法
  • 深入理解 Git 及其工具的用途、使用方法与区别
  • 项目功能--会员数量折线图
  • 【计网不挂科】计算机网络期末考试(综合)——【选择题&填空题&判断题&简述题】完整试卷
  • EPLAN商业版与教育版的功能区别有多大
  • 「QT」几何数据类 之 QPoint 整型点类
  • 学习日记_20241110_聚类方法(K-Means)
  • MatSci-LLM ——潜力和挑战以及大规模语言模型在材料科学中的应用
  • 手机上用什么方法可以切换ip
  • 设计模式之建造者模式(各项装修物料组合套餐选配场景)
  • 边缘的检测