📜  命令注入漏洞和缓解措施

📅  最后修改于: 2021-05-30 09:39:19             🧑  作者: Mango

命令注入基本上是要通过Web应用程序执行的操作系统命令的注入。命令注入攻击的目的是注入并执行攻击者在易受攻击的应用程序中指定的命令。在这种情况下,执行不需要的系统命令的应用程序就像是伪系统外壳,攻击者可以将其用作任何授权的系统用户。但是,以与Web应用程序相同的特权和环境执行命令。由于缺乏正确的输入数据验证(可能由攻击者(表单,Cookie,HTTP标头等)操纵),可能会发生命令注入攻击。

有一种代码注入攻击的变种。在代码注入中,攻击者将自己的代码添加到现有代码中。所注入的代码以与应用程序相同的特权和环境执行。

当攻击者尝试通过易受攻击的应用程序执行系统级命令时,就会发生OS命令注入攻击。如果应用程序利用系统级命令中的用户输入,则它们被认为容易受到OS命令注入攻击。

例子:

// C program to demonstrate Command Injection attack
// The purpose of the program to print contents of a
// file provided as command line argument.
#include 
#include 
  
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);
}

通常使用的输出只是所请求文件的内容:

$ ./a.out exploit.txt
my name is akash

但是,如果我们在此行的末尾添加分号和另一个命令,则该命令将由catWrapper执行,而不会产生任何抱怨:

$ ./a.out "exploit.txt; ls"
my name is akash
exploit.txt               doubFree.c              nullpointer.c
unstosig.c              www*                    a.out*
format.c                strlen.c                useFree*
catWrapper*             misnull.c               strlength.c             useFree.c
commandinjection.c      nodefault.c             trunc.c                 writeWhatWhere.c

以下PHP代码段容易受到命令注入攻击(Web应用程序):

");
$file=$_GET['filename'];
system("rm $file");
?>

以下请求和响应是成功攻击的示例:

Request
http://mywesite.com/delete.php?filename=bob.txt;id
Response
Please specify the name of the file to delete
uid=33(www-data) gid=33(www-data) groups=33(www-data) 

减轻

  • 理想情况下,开发人员应将现有API用于他们的语言。例如(Java):而不是使用Runtime.exec()发出“ mail”命令,而要使用位于javax.mail。*上的可用Java API。
  • 如果不存在这样的可用API,则开发人员应清除所有输入以查找恶意字符。实施积极的安全模型将是最有效的。通常,定义合法字符比非法字符容易得多。

参考
https://zh.wikipedia.org/wiki/Code_injection
http://stackoverflow.com/questions/44799/preventing-command-line-injection-attacks

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”