原生PHP代码审计-文件方面 #
这里推荐用漏洞功能点来看代码 找到上传点然后看代码
文件安全挖掘点:
1、脚本文件名
2、应用功能点
3、操作关键字
文件上传,文件下载(读取),文件包含,文件删除等
案例1emlog-2.2.20-后台文件上传 #
安装和上一个博客一致
https://www.cnvd.org.cn/flaw/show/CNVD-2023-74536
https://www.cnvd.org.cn/flaw/show/CNVD-2023-74536
根据漏洞描述
emlog pro /content/templates/存在任意文件上传漏洞,远程攻击者可利用该漏洞提交特殊的请求,可上传恶意文件,以应用程序上下文执行任意代码。
根据CNVD漏洞描述漏洞在
emlog pro /content/templates/存在任意文件上传漏洞,远程攻击者可利用该漏洞提交特殊的请求,可上传恶意文件,以应用程序上下文执行任意代码。
我们准备上传的文件-在他默认有一个default我们备份下上传加一个info.php里面有phpinfo
上传后直接访问就可以触发任意文件执行下面看下代码怎么写的怎么找到的
源码如下
代码功能解析
首先判断操作类型为upload_zip时执行此代码块
调用LoginAuth::checkToken()进行登录验证和 token 检查
获取上传的 ZIP 文件信息($_FILES['tplzip'])
一系列错误检查:
检查是否未选择文件(错误码 4)
检查文件大小超过 PHP 配置限制(错误码 1)
检查文件上传是否有其他错误
检查文件后缀是否为 zip
使用emUnZip函数解压上传的 ZIP 文件到../content/templates/目录
根据解压结果跳转到不同的页面并带上相应的错误参数
安全问题分析
不仅文件上传验证不严格,更严重的是对解压后的文件没有任何安全过滤只判断了后缀是否是ZIP
if ($action === 'upload_zip') {
LoginAuth::checkToken();
$zipfile = isset($_FILES['tplzip']) ? $_FILES['tplzip'] : '';
if ($zipfile['error'] == 4) {
emDirect("./template.php?error_d=1");
}
if ($zipfile['error'] == 1) {
emDirect("./template.php?error_f=1");
}
if (!$zipfile || $zipfile['error'] > 0 || empty($zipfile['tmp_name'])) {
emMsg('模板上传失败, 错误码:' . $zipfile['error']);
}
if (getFileSuffix($zipfile['name']) != 'zip') {
emDirect("./template.php?error_a=1");
}
$ret = emUnZip($zipfile['tmp_name'], '../content/templates/', 'tpl');
switch ($ret) {
case 0:
emDirect("./template.php?activate_install=1");
break;
case -2:
emDirect("./template.php?error_e=1");
break;
case 1:
case 2:
emDirect("./template.php?error_b=1");
break;
case 3:
emDirect("./template.php?error_c=1");
break;
}
}
所以这里还有一个插件也是一样的所以你找到了模板上传也找得到插件上传
代码一摸一样
没有限制PHP安装,没有限制函数,只检查后缀
if ($action == 'upload_zip') {
LoginAuth::checkToken();
$zipfile = isset($_FILES['pluzip']) ? $_FILES['pluzip'] : '';
if ($zipfile['error'] == 4) {
emDirect("./plugin.php?error_d=1");
}
if ($zipfile['error'] == 1) {
emDirect("./plugin.php?error_g=1");
}
if (!$zipfile || $zipfile['error'] >= 1 || empty($zipfile['tmp_name'])) {
emMsg('插件上传失败, 错误码:' . $zipfile['error']);
}
if (getFileSuffix($zipfile['name']) != 'zip') {
emDirect("./plugin.php?error_f=1");
}
$ret = emUnZip($zipfile['tmp_name'], '../content/plugins/', 'plugin');
switch ($ret) {
case 0:
emDirect("./plugin.php?activate_install=1");
break;
case -1:
emDirect("./plugin.php?error_e=1");
break;
case 1:
case 2:
emDirect("./plugin.php?error_b=1");
break;
case 3:
emDirect("./plugin.php?error_c=1");
break;
}
}
案例2-emlog-6.0.0任意文件删除 #
找到后台界面系统->数据锁定文件data.php 找到代码是
非常简单暴力 注意这里bak是数组前端是
<td width="22"><input type="checkbox" value="<?php echo $value; ?>" name="bak[]" class="ids" /></td>
if ($action == 'dell_all_bak') {
if (!isset($_POST['bak'])) {
emDirect('./data.php?error_a=1');
} else{
foreach ($_POST['bak'] as $val) {
unlink($val);
}
emDirect('./data.php?active_del=1');
}
}
http://192.168.1.56:900//admin/data.php?action=dell_all_bak
bak[]=../../../../../../../1.txt 可以删除根目录文件
直接构造数据包任意删除