第26天 安全开发-PHP应用模板引用Smarty渲染MVC模型数据联动RCE安全
时间轴:
演示案例
新闻列表&模板引用-代码RCE安全
知识点
新闻列表
1.数据库创建新闻存储
2.代码连接数据库读取
3.页面进行自定义显示
navicat新建表:news
下面勾选自动递增:
名 | 类型 | 长度 | 是否是null | 键 |
id | int | 10 | 不是null | 1 |
title | varchar | 255 | 不是null | |
author | varchar | 255 | 不是null | |
content | text | 不是null | ||
image | varchar | 255 | 不是null |
在表中自定义输入内容,效果如下图所示
(图片可以自己找,保存在对应路径就行了)
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>";
}
显示如下:
模板调用:
演示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:
数据库编辑:
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结束标签结束
效果演示:
总结:
使用模板可以减少每个页面都写html,且在php中改就可以影响html从而决定页面。
对于MVC模型:(v——>video视图)
使用模板保证了
1.效率 2.美观度
z-blog模板:
全局搜索:Powered By进行修改,找到WhitePage —>footer.php
效果演示:
总结:
找到首页文件可以在WhitePage中修改,其他首页内容和其也有关。
安全漏洞:
1.在数据库后台加上<?php phpinfo();?>(数据库中)
2.在new.html代码中加入<?php phpinfo();>后
使用new.php,会让new.php渲染new.html,会执行new.html中的php代码。
(所以当得到模板后加以修改,可以在后台执行)
#Smarty 模版引用
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');
?>
安全漏洞:
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();//)
如果版本及目录换成smarty(不是smarty3):
则:
思路核心总结:
2.第三方smarty模板 没有直接安全问题
1.本身代码漏洞
2.第三方插件(ueditor)
3.第三方模板(smarty)
4.第三方组件(shiro fastjson等)
漏洞共享平台:
框架模板组件分类:
php
1.框架:thinkphp yii laravel
核心开发 代码逻辑核心(代码逻辑)
2.模板:smarty
负责主要显示页面美观的
3.组件:ZendGuardLoader php-imagick
第三方组件(图片处理,数据转换,数据库操作等)
java
框架:struts2 springboot ssm
模板:
组件:shiro fastjson
白盒:
黑盒:
端口扫描 数据库包特征 识别插件工具等