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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 代码审计——命令执行详解

@TOC

01 漏洞描述



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


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

image.png



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

{
   
   mathJaxContainer[0]}_COOKIE["USER"]);
//--验证cookie。
for({
   
   mathJaxContainer[1]}i<count({
   
   mathJaxContainer[2]}i++)
{
   
   
    if(ereg("^SKIN=(.*)$",$arr[$i],$reg))
    {
        $skin = trim($reg[1]);
    }
    if(ereg("^UID=(.*){
   
   mathJaxContainer[6]}arr[{
   
   mathJaxContainer[7]}reg))
    {
   
   
        {
   
   mathJaxContainer[8]}reg[1]);
    }
    if(ereg("^DOMAIN=(.*)$",$arr[$i],$reg))
    {
        $domain  = trim($reg[1]);
    }
    if(ereg("^TOKEN=(.*){
   
   mathJaxContainer[12]}arr[{
   
   mathJaxContainer[13]}reg))
    {
   
   
        {
   
   mathJaxContainer[14]}reg[1]);
    }
}
{
   
   mathJaxContainer[15]}_GET['s'];
//$uid = "support";
//$domain = "**.**.**.**";
{
   
   mathJaxContainer[16]}uid, $domain);

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

function readAddress({
   
   mathJaxContainer[18]}domain){
   
   
 $binary = array();
    {
   
   mathJaxContainer[19]}uid,$domain);
    {
   
   mathJaxContainer[20]}userDir, "\n\r ")."/Profile/alias.individual";
    if(!is_file($addressDir)) return false;
    {
   
   mathJaxContainer[21]}addressDir, "r");
    if(!$fp){
   
    
                echo "打开地址薄失败";
                exit;
        }
    while(false != ({
   
   mathJaxContainer[22]}fp, 568))){
   
   
        {
   
   mathJaxContainer[23]}content);
    }
    //var_dump($binary);
   return $binary;
}

看到函数内,uid和domain又进入了函数getUserDir($uid,$domain),这边继续跟进getUserDir

function getUserDir({
   
   mathJaxContainer[25]}domain) {
   
   
    {
   
   mathJaxContainer[26]}uid $domain", 'r');
    {
   
   mathJaxContainer[27]}handle, 2096);
    pclose($handle);
    return $read;
}

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

04 漏洞案例

image.png


针对代码中编写的命令执行语句,那么可通过搜索“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的过程为以上逻辑时,存在系统命令注入漏洞,漏洞验证举例如下

image.png


05 修复方案



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

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

目录
相关文章
|
6月前
|
SQL 小程序 Shell
PHP代码审计(三)php中代码执行&&命令执行函数
string system(string command,int &return_var) 可以用来执行系统命令并直接将相应的执行结果输出 system() 输出并返回最后一行shell结果。
58 0
|
安全 PHP
代码审计:命令注入学习
0x01 起因及想法   起因:好久没更新博客了,我在乌云社区看到一篇代码审计的整体学习思想如下:   学习代码审计目标:能独立完成对一个CMS代码安全的监测   思路:   A、通读全文代码,从功能函数代码开始阅读,例如include文件夹下的comm_fun.php,或者类似关键字的文件。
1531 0
|
安全 .NET 开发框架
ASP代码审计学习笔记 -4.命令执行漏洞
  命令执行漏洞:   保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令  利用方式: http://localhost/cmd.asp?ip=127.0.0.1|set   漏洞修复方式一: 把输入的值当作参数来执行,避免命令执行漏洞,可能会占用系统资源,不够优化。
1382 0
|
6月前
|
安全 小程序 PHP
PHP代码审计(七)Rips源代码审计系统使用教程
上一篇中提到的Seay源代码审计系统是由C#编写的winform程序,现在已经停止更新了,但是,还是比较好用的。 PHP代码审计还有另一个工具,也是一个神器Rips
218 0
|
6月前
|
安全 小程序 PHP
PHP代码审计(五)PHP代码审计方法与步骤
(1):获取到网站源码(这就是废话……) (2):将网站部署到你自己的环境中,能运行。 这里特殊说明一下我的习惯,我本地的环境与线上的环境基本上保持一致,这样在本地审计及线上部署的时候能发现更多的问题。不建议说是随便搭个环境能跑起来就行,这样不是很严谨。 (3):拿到源码之后,浏览大概的项目结构。
76 0
|
6月前
|
Shell PHP Windows
PHP代码审计(四)PHP文件操作函数(2)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
44 0
|
6月前
|
安全 Unix Shell
PHP代码审计(四)PHP文件操作函数(1)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
46 0
|
6月前
|
安全 小程序 PHP
PHP代码审计(六)Seay源代码审计系统使用教程
www.cnseay.com/ 当然,这个已经不能访问了。 软件的版本比较早,需要.NET framework3.5框架,我这里是软件启动的时候自动提醒安装,如果没有自动提醒,那么你需要手动安装.NET frameWork3.5框架,否则,程序应该是没有办法运行。
534 0
|
6月前
|
XML 开发框架 .NET
代码审计之PHP基础铺垫
代码审计之PHP基础铺垫
66 0
|
6月前
|
小程序 Shell PHP
PHP代码审计(四)PHP文件操作函数(3)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
28 0