时间轴:
演示案例
新闻列表&模板引用-代码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:
<?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();//)
如果版本及目录换成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
白盒:
黑盒:
端口扫描 数据库包特征 识别插件工具等