02.Bash 解析的命令注入
Bash 解析的命令注入是一种常见的安全漏洞,它出现在使用 Bash 解析器执行用户提供的命令时。应用程序没有对用户输入进行充分的验证和过滤,导致用户提供的数据被直接拼接到执行的命令中,从而使攻击者能够插入恶意代码,并执行任意命令。
#
示例代码:该代码接受一个名为 "ip" 的 GET 参数,并将其作为参数拼接到命令字符串中。然后,使用 Bash 解析器执行这个命令,并返回执行结果。
Handler: func(writer http.ResponseWriter, request *http.Request) { ip := request.URL.Query().Get("ip") if ip == "" { writer.Write([]byte(`no ip set`)) return } var raw = fmt.Sprintf("ping %v", ip) ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() outputs, err1 := exec.CommandContext(ctx, `bash`, "-c", raw).CombinedOutput() // 尝试将 GBK 转换为 UTF-8 utf8Outputs, err2 := utils.GbkToUtf8(outputs) if err2 != nil { writer.Write(outputs) } else { writer.Write(utf8Outputs) } if err1 != nil { writer.Write([]byte("exec : " + err1.Error())) return }},
#
攻击示例:ip=127.0.0.1|ls /
上述 Payload 在 "ip" 参数后面添加了一个管道符,然后执行了一个简单的 "ls /" 命令,列出了根目录下的文件和目录
为了防御 Bash 解析的命令注入漏洞,开发者应当始终谨慎处理用户输入,特别是当用户提供的数据用于构造命令或者执行系统操作时。
#
防御措施:- 使用安全的参数化查询或预编译模式来执行命令,而不是简单的字符串拼接。
- 对用户输入进行严格的验证和过滤,仅接受预期格式的数据。
- 避免直接执行用户输入的命令,而是将输入用作参数,并在执行之前进行安全转义和验证。
- 最小化系统中所使用的特权账户的权限,并仅允许其执行必要的操作。
- 定期更新系统软件和组件,以修复已知的漏洞。