代码注入「Code Injection」或远程代码执行「Remote Code Execution」 「RCE」 使攻击者能够通过注入攻击执行恶意代码。代码注入攻击不同于「命令注入」攻击。攻击者的手段施展取决于服务器端解释器(如 PHP、Python 等)的限制。在某些情况下,攻击者可能能够从代码注入升级为命令注入。
通常,当应用程序未先验证代码的情况下评估代码时,就会发生代码注入。以下错误示例是存在代码注入的 PHP 应用程序源代码。
/**
* Get the code from a GET input
* Example - http://example.com/?code=phpinfo();
*/
$code = $_GET['code'];
/**
* Unsafely evaluate the code
* Example - phpinfo();
*/
eval("$code;");
基于以上示例,攻击者可以使用以下构造执行任意 PHP 代码。执行结果是显示 PHP 信息页面。
http://example.com/?code=phpinfo();
命令执行
攻击者可以通过在服务器上执行任意操作系统命令来进一步“强化”代码注入漏洞。根据上面的例子,攻击者可以使用 PHP 中的system()
函数执行whoami shell
命令。
http://example.com/?code=system('whoami');
一旦攻击者能够执行操作系统命令,他们就可以尝试使用Webshell
或安装其他恶意软件。这样攻击者甚至可以破坏内部其他系统。
发现和防范代码注入漏洞
只要攻击者可以通过发送恶意数据来利用服务器端解释器设置,几乎任何数据输入接口都可以成为代码注入攻击的载体。这些攻击很常见,因为攻击者可以访问发现代码注入缺陷的模糊器和扫描器。根据暴露的数据和软件实现的业务功能,此类攻击的业务影响可能从轻微到严重不等。因此,修复不正确的服务器配置、避免不受信任的数据源以及消除其他注入向量至关重要。
-
「限制输入验证」严格地控制应用程序可以处理的数据或输入类型,从而有助于降低攻击者执行恶意代码的风险。 -
「编码 HTML 输出」利用上下文输出编码将恶意输入转换为更安全的类型,其中用户数据可以显示但不能作为代码执行。 -
「对 cookie使用HttpOnly标志来禁用客户端脚本交互」如果服务器在它创建的每个 cookie 上设置 HttpOnly 标志,则表明不应从客户端访问 cookie。因此,即使存在 HTML 注入缺陷,cookie 也不能透露给第三方。 -
「避免 Javascript 代码序列化」开发人员使用代码序列化将输入数据重新排列为一组常规函数和表达式。某些版本的 Javascript 序列化包无法正确清除正则表达式中不受信任的字符。除非绝对必要,否则建议作为最佳实践避免序列化。 -
「禁用不安全的函数」在开发源代码时避免所有易受攻击的代码评估结构是很重要的。开发人员应改为使用安全、专用、特定于语言的功能来处理用户提供的输入。如通常禁用的PHP函数有: exec()
,passthru()
,shell_exec()
,system()
,proc_open()
,popen()
,curl_exec()
,curl_multi_exec()
,parse_ini_file()
和show_source()
。
原文始发于微信公众号(安全圈小王子):谈谈代码注入(远程代码执行)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论