📜  代码注入和缓解示例

📅  最后修改于: 2021-10-19 08:35:01             🧑  作者: Mango

代码注入是恶意注入或将代码引入应用程序。引入或注入的代码能够危及数据库完整性和/或危及隐私属性、安全性甚至数据正确性。它还可以窃取数据和/或绕过访问和身份验证控制。代码注入攻击可能会困扰依赖用户输入执行的应用程序。

代码注入不同于命令注入。在这里,攻击者仅受注入语言本身的功能限制。例如,如果攻击者能够将PHP代码注入应用程序并使其执行,那么他仅受PHP能力的限制。

代码注入漏洞的范围从容易到难以找到。已经为应用程序和架构域开发了许多解决方案来阻止这些类型的代码注入攻击。一些示例包括输入验证、参数化、不同操作的权限设置、额外保护层的添加等。

例子:
当开发人员使用PHP eval()函数并向其传递攻击者可以修改的不受信任的数据时,代码注入可能是可能的。

下面的示例显示了使用 eval()函数的危险方式:

// A dangerous way to use the eval() function 
// in PHP
$myvar = "varname";
$x = $_GET['arg'];
eval("\$myvar = \$x;");

由于没有输入验证,上面的代码容易受到代码注入攻击。

例如:

/index.php?arg=1; phpinfo()

以上将显示PHP 的所有信息。

在利用此类漏洞时,攻击者可能想要执行系统命令。在这种情况下,代码注入错误也可以用于命令注入,例如:

/index.php?arg=1; system('id')

这将告诉进程的 id。
uid=33(www-data) gid=33(www-data) 组=33(www-data)

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

参考
https://en.wikipedia.org/wiki/Code_injection
https://www.cse.unr.edu/~mgunes/cpe401/cpe401sp11/student/CodeInjection.pptx