引言:什么是操作系统命令注入,如何防御和利用漏洞?
1. 简介
操作系统命令注入(OS command injection)是一种Web安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统(OS)命令,通常会完全破坏应用程序及其所有数据。
在这种攻击中,攻击者通过输入恶意代码来利用应用程序中的漏洞,从而在服务器上执行任意命令。这些命令可以包括删除文件、窃取数据、更改配置等。
2. 产生根因
- Web应用服务器未对用户提交的参数进行有效检测和过滤;
- 操作系统(OS)允许一条语句在使用连接符(如
&&
、&
、||
)和管道符来执行多条命令;
3. 攻击面
3.1. 攻击全景
- 污染源:Http请求、Socket、控制台输入、环境变量、文件和注册表
- 数据格式:文本、JSON、XML、文件流
- 应用类型:B/S、C/S、Console、Service
- 注入路径:语言注入(如SPEL、OGNL、JSP)、
Eval()
、系统调用、SQL注入 - 语言执行层:
- Java:
System.Runtime.getRuntime().exec()
、ProcessBuild().start()
- C/C++:
ShellExecute()
、system()
、exec()
、popen()
- Python:
os.system()
、os.popen()
、subprocess.popen()
、subprocess.call()
- PHP:
system()
、exec()
、popen()
、shell_exec()
、proc_open()
- SHELL
- DataBase
- Perl
- …
- Java:
- 操作系统Shell/CMD:Unix风格shell、Windows CMD。
3.2. 攻击路径
攻击者可以通过以下三种方式执行注入攻击:
- 应用主动调用系统命令或shell脚本完成特定功能
- 通过语言解释器(如Java语言可通过
OGNL
)或eval()函数注入代码,调用对应语言的系统调用函(参考上一章节)数执行注入命令。 - 通SQL注入调用数据库的系统存储过程(如通过
xp_cmdshell
完成命令调用)。
4. 防御方法
- 尽量不要从应用程序层代码中调用OS命令,如果实在要调用请使用封装后的安全函数;
- 输入过滤:
- 对参数进行白名单校验,如验证输入只包含字母,没有其他语法关键字或空格等。
- 黑名单过滤,拦截命令注入特殊字符;
- 参数编码:对常见特殊字符进行转码,避免命令注入
5. 参考
[1] https://portswigger.net/web-security/os-command-injection
推荐阅读:
「 典型安全漏洞系列 」06.路径遍历(Path Traversal)详解
「 典型安全漏洞系列 」05.XML外部实体注入XXE详解
「 典型安全漏洞系列 」04.服务器端请求伪造SSRF详解
「 典型安全漏洞系列 」03.跨站请求伪造CSRF详解
「 典型安全漏洞系列 」02.SQL注入详解
「 典型安全漏洞系列 」01.跨站脚本攻击XSS详解