- 撰稿|王聪丽
- 编辑|代码审计团队
- 信息收集|代码审计团队
1. 什么是命令注入
先来看个小视频,简单粗暴地认识一下命令注入👇
(😘欢迎关注我们的同名抖音账号@翼安研习社)
视频链接:https://mp.weixin.qq.com/s/i_YYg8kIj2atqw7dxJ3Mow
命令注入是指可以通过输入恶意参数破坏系统命令语句结构,从而执行不可信赖资源中的命令,或在不可信赖的环境中执行命令,导致程序以攻击者的名义执行恶意命令
2. 命令注入利用条件
- web系统调用了执行命令的函数,例如exec、eval等。
- 系统执行命令函数的参数可以通过外部输入或者可控。
- 可控参数可拼接注入参数,并未进行参数校验。
3. 示例
构造命令示例如下:
String data = System.getProperty("ADD");
String osCommand = "c:\\WINDOWS\\SYSTEM32\\cmd.exe /c dir "
Process process = Runtime.getRuntime().exec(osCommand + data);
利用命令注入漏洞发起攻击行为示意图如下:
图1 利用命令注入漏洞发起攻击行为
3. 表现形式
命令注入漏洞主要表现为以下两种形式:
- 攻击者直接控制了所执行的命令,通过输入参数直接篡改执行命令。
- 攻击者间接地控制了所执行的命令,通过输入参数篡改命令的环境。
4. 防御方式
- 采用白名单,例如owsap提供的验证函数,或使用正则表达式进行过滤。
- eval、exec、shell_exec等函数的参数不可控。
- 在进入执行命令函数和方法前,对参数进行过滤、校验,对敏感字符进行转义。