第二十六天
一、PHP新闻显示-数据库操作读取显示
1.新闻列表
- 数据库创建新闻存储
- 代码连接数据库读取
- 页面进行自定义显示
二、PHP模版引用-自写模版&Smarty渲染
1.自写模版引用
- 页面显示样式编排
- 显示数据插入页面
- 引用模版调用触发
2.Smarty模版引用
1.下载:https://github.com/smarty-php/smarty/releases
2.使用:
- 创建一个文件夹,命名为smarty-demo。
- 下载Smarty对应版本并解压缩到该文件夹中。
- 创建一个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.自写模版的安全隐患
- 如果在数据库中任何地方添加
<?php phpinfo();?>
,在调用数据库内容的时候会自动显示 - 如果在html模板源码中加入
<?php phpinfo();?>
,在执行HTML并不会显示,但通过php解析调用,则依然会展示有关内容
2.第三方Smarty的安全隐患
- 安全风险: 显示详细的 PHP 信息可能透露有关服务器配置的敏感信息,包括 PHP 版本、扩展和路径。攻击者可以利用这些信息来识别潜在的漏洞
- 信息泄露: 在生产环境中,显示详细的 PHP 信息是不推荐的,因为存在信息泄露的风险。攻击者可能利用这些信息更好地了解服务器的设置并识别潜在的攻击点
- 服务器加固: 安全最佳实践涉及将服务器信息的暴露最小化,以减少攻击面。应该限制不必要的服务器环境信息,以降低攻击表面
四、环境复现
1.新闻列表
<?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='300' height='300'></img><br>";
}
mysqli_close($con);
?>
2.自编程模板引用
$template = file_get_contents('new.html');
while ($row = mysqli_fetch_row($data)) {$page_title = $row[1];$heading = $row[2];$subheading = $row[3];$content = $row[4];$item = $row[5];
}
$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);
eval('?>' . $template);
mysqli_close($con);
3.Smarty模版引用
<?php
require('smarty/libs/Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = 'smarty/templates/';
$smarty->compile_dir = 'smarty/templates_c/';
$smarty->cache_dir = 'smarty/cache/';
$smarty->config_dir = 'smarty/configs/';
$smarty->assign('title', '欢迎使用 Smarty');
$smarty->display('index.tpl');
?>
4.Smarty3模版引用——有漏洞
<?php
define('SMARTY_ROOT_DIR', str_replace('\\', '/', __DIR__));
define('SMARTY_COMPILE_DIR', SMARTY_ROOT_DIR . '/smarty3/tmp/templates_c');
define('SMARTY_CACHE_DIR', SMARTY_ROOT_DIR . '/smarty3/tmp/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);
$templateName = 'test:' . $_GET['eval'];
$smarty->display($templateName);?>