Skip to main content

原生PHP代码审计-文件方面

·245 words·2 mins
IIIIIIIIIIII
Author
IIIIIIIIIIII
A little bit about you

原生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/存在任意文件上传漏洞,远程攻击者可利用该漏洞提交特殊的请求,可上传恶意文件,以应用程序上下文执行任意代码。

1

我们准备上传的文件-在他默认有一个default我们备份下上传加一个info.php里面有phpinfo

1

上传后直接访问就可以触发任意文件执行下面看下代码怎么写的怎么找到的

源码如下

代码功能解析
首先判断操作类型为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;
    }
}

所以这里还有一个插件也是一样的所以你找到了模板上传也找得到插件上传

1

1

代码一摸一样

没有限制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 可以删除根目录文件

直接构造数据包任意删除

1

Related

原生PHP代码审计-sql注入
·263 words·2 mins
Halfhour靶机-Maze-通配符漏洞
·371 words·2 mins
Confidence靶机-Maze-windows
·1616 words·8 mins
Mount靶机-maze
·525 words·3 mins
vmware-esxi-vscenter-靶场vulntarget-o
·219 words·2 mins