代码注入是恶意注入代码或将代码引入应用程序。引入或注入的代码能够损害数据库完整性和/或损害隐私属性,安全性甚至数据正确性。它还可以窃取数据和/或绕过访问和身份验证控制。代码注入攻击会困扰依赖于用户输入执行的应用程序。
代码注入与命令注入不同。在这里,攻击者仅受注入语言本身的功能的限制。例如,如果攻击者能够将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()发出“ mail”命令,而要使用位于javax.mail。*上的可用Java API。
如果不存在这样的可用API,则开发人员应清除所有输入以查找恶意字符。实施积极的安全模型将是最有效的。通常,定义合法字符比非法字符容易得多。
参考
https://zh.wikipedia.org/wiki/Code_injection
https://www.cse.unr.edu/~mgunes/cpe401/cpe401sp11/student/CodeInjection.pptx