首页 > 其他分享 >代码审计——命令执行详解

代码审计——命令执行详解

时间:2023-06-25 18:02:15浏览次数:28  
标签:审计 domain uid 代码 漏洞 详解 参数 函数


01 漏洞描述

命令注入是指因为系统使用了可以执行命令的危险函数,但是调用这些函数的参数可控,并没有做过滤或过滤不严格,使入侵者可以通过构造特殊命令字符串的方式将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施入侵,来非法获取数据或者网络资源。

简单来说,就是系统使用可执行命令的函数,调用这些函数的参数被被入侵者控制,参数过滤不严,造成入侵者直接实施入侵。

代码审计——命令执行详解_数据


02 审计要点

命令执行漏洞发生的根本原因是"用户可控的"、”未经净化“的数据直接作为可执行命令函数的参数,造成入侵者直接实施入侵。

1、参数是否用户可控,如用户输入的外部数据是否拼接到可执行命令函数的参数内?

2、是否配置了全局过滤器?检查过滤器的配置,是否所有命令的执行都经过过滤器处理,过滤器的过滤规则是否符合安全要求?

03 漏洞特征

Java

String btype = request.getParameter("inputparam");
String cmds[] = {"cmd.exe","/K","\"C: &&del C:\\r2.txt"+btype+" &&del C:\\r1.txt \""};
System.Runtime.getRuntime().exec(cmds);

此时cmd.exe使用了/K参数,将后续传入的参数用户命令执行,这里拼接的参数从前段中获取,对参数未作任何过滤,导致命令注入。

PHP

$arr = explode("&",$_COOKIE["USER"]);
//--验证cookie。
for($i=0;$i<count($arr);$i++)
{
    if(ereg("^SKIN=(.*)$",$arr[$i],$reg))
    {
        $skin = trim($reg[1]);
    }
    if(ereg("^UID=(.*)$",$arr[$i],$reg))
    {
        $uid  = trim($reg[1]);
    }
    if(ereg("^DOMAIN=(.*)$",$arr[$i],$reg))
    {
        $domain  = trim($reg[1]);
    }
    if(ereg("^TOKEN=(.*)$",$arr[$i],$reg))
    {
        $token  = trim($reg[1]);
    }
}
$part = $_GET['s'];
//$uid = "support";
//$domain = "**.**.**.**";
$users = readAddress($uid, $domain);

从上述代码看到代码直接从cookie中获取参数USER,然后赋值给uid和domain,接着看看函数readAddress($uid, $domain)究竟做了什么

function readAddress($uid,$domain){
 $binary = array();
    $userDir = getUserDir($uid,$domain);
    $addressDir = trim($userDir, "\n\r ")."/Profile/alias.individual";
    if(!is_file($addressDir)) return false;
    $fp = fopen($addressDir, "r");
    if(!$fp){ 
                echo "打开地址薄失败";
                exit;
        }
    while(false != ($content = fgets($fp, 568))){
        $binary[] =unpack("a20nick_name/a40email/a40name/a60h_street_address/a30h_city/a30h_province/a8h_zip/a20h_country/a16h_phone/a30c_company/a60c_street_address/a30c_city/a30c_province/a8c_zip/a20c_country/a16c_phone/a16pager/a16cellular/a16fax/a20icq/a30other/a5b_year/a3b_month/a3b_day",$content);
    }
    //var_dump($binary);
   return $binary;
}

看到函数内,uid和domain又进入了函数getUserDir(代码审计——命令执行详解_数据_02domain),这边继续跟进getUserDir

function getUserDir($uid, $domain) {
    $handle = popen("/var/eyou/sbin/hashid $uid $domain", 'r');
    $read = fread($handle, 2096);
    pclose($handle);
    return $read;
}

观察到最后uid和domain进入了popen $handle = popen("/var/eyou/sbin/hashid $uid $domain", 'r');这里uid和domain没有经过任何过滤直接进入了命令,导致任意命令执行。

04 漏洞案例

代码审计——命令执行详解_数据_03

针对代码中编写的命令执行语句,那么可通过搜索“Runtime.getRuntime().exec”直接定位漏洞代码,然后根据数据流的过程,逐步向上回溯,定位到用户可控参数。

String btype = request.getParameter("inputparam");
String cmds[] = {"cmd.exe","/K","\"C: &&del C:\\r2.txt"+btype+" &&del C:\\r1.txt \""};
System.Runtime.getRuntime().exec(cmds);


当服务器后端调用Runtime.getRuntime().exec的过程为以上逻辑时,存在系统命令注入漏洞,漏洞验证举例如下

代码审计——命令执行详解_可执行_04

05 修复方案

1、所有需要执行的系统命令,必须是开发人员定义好的,不允许接收用户传来的参数,加入到系统命令中去。任何一个执行系统命令的代码,都必须经过安全工程师确认。

2、执行代码的参数或文件名,禁止和用户输入相关,只能由开发人员定义代码内容,用户只能提交“1、2、3”参数,代表相应代码。

标签:审计,domain,uid,代码,漏洞,详解,参数,函数
From: https://blog.51cto.com/u_16170213/6547593

相关文章

  • 代码审计——XXE详解
    01漏洞描述XXE(XMLExternalEntityInjection)是一种针对XML终端实施的入侵,漏洞产生的根本原因就是在XML1.0标准中引入了“entity”这个概念,且“entity”可以在预定义的文档中进行调用,XXE漏洞的利用就是通过实体的标识符访问本地或者远程内容。黑客想要实施这种入侵,需要在XML的payl......
  • 代码审计——XSS详解
    01漏洞描述跨站脚本入侵(CrossSiteScript)是一种将恶意JavaScript代码插入到其他Web用户页面里执行以达到入侵目的的漏洞。入侵者利用应用程序的动态展示数据功能,在html页面里嵌入恶意代码。当用户浏览该页之时,这些嵌入在html中的恶意代码会被执行,用户浏览器被入侵者控制,从而达到......
  • 代码审计——硬编码口令/弱口令详解
    01漏洞描述根据网站所使用的第三方组件,寻找特定的弱口令或默认口令进行登录。或在代码层面寻找写死的账号口令,尝试进行登录。02审计要点对前端源代码以及系统后台代码进行全文关键字检索,如key、pass、pwd、password,查看是否存在明文显示的账号密码。03漏洞案例源码中某前端js......
  • 【git】基于JGit通过ssh-url拉取指定commit-id的代码
    实现1️⃣pom依赖:<dependency><groupId>org.eclipse.jgit</groupId><artifactId>org.eclipse.jgit</artifactId><version>6.6.0.202305301015-r</version></dependency><dependency><group......
  • HEVC官方代码学习_1
    HM是HEVC(H.265)的开源实现,可以从网上直接下载。下载网址:https://hevc.hhi.fraunhofer.de/svn/svn_HEVCSoftware/tags/文件整体调用流程图 各类文件功能AccessUnit.h定义了存取单元(或者访问单元),实质是一个类型为NALUnitEBSP的list扩展比特流的不同数据类型SODB:数据比特串,......
  • 关于Java中ArrayList类的toArray方法详解
    先上源码:publicObject[]toArray(){returnArrays.copyOf(elementData,size);}可以看到ArrayList类的toArray()方法调用了Arrays.copyOf(elementData,size)(其中的elementData是ArrayList类中用来存储对象的数组,size是数组大小),接下来进入其内部:publicsta......
  • 修改博客园代码块高亮主题
    博客园(默认编辑器设置为Markdowm)是使用heightlight.js进行代码块高亮的。因此可以通过下载heightlight.js官网的主题css修改博客园中的代码块高亮颜色。修改方法:进入heightlight.js官网,点击demo页面预览,查看主题效果在下载页面选择需要的语言并下载打开下载......
  • 刷新20项代码任务SOTA,Salesforce提出新型基础LLM系列编码器-解码器Code T5+
    前言 大型语言模型(LLMs)最近在代码层面的一系列下游任务中表现十分出彩。通过对大量基于代码的数据(如GitHub公共数据)进行预训练,LLM可以学习丰富的上下文表征,这些表征可以迁移到各种与代码相关的下游任务。但是,许多现有的模型只能在一部分任务中表现良好,这可能是架构和......
  • Crontab 命令详解
    一. Crontab介绍      crontab命令的功能是在一定的时间间隔调度一些命令的执行。1.1/etc/crontab文件      在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。      如:[root@dave~]#cat/etc/cro......
  • IPv4地址详解
    ip地址格式:<网络号,主机号>IPv4地址分类:A类:网络号8位,高位0B类:网络号16位,高位10C类:网络号24位,高位110D类:多播地址,高位1110E类:保留使用,高位1111特殊地址:主机号全0:表示网络本身0.0.0.0:表示本网络上的本主机主机号全1:表示本网络的广播地址255.255.255.255:表示整个网络的......