Skip to main content

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 解析的命令注入漏洞,开发者应当始终谨慎处理用户输入,特别是当用户提供的数据用于构造命令或者执行系统操作时。

防御措施:#

  • 使用安全的参数化查询或预编译模式来执行命令,而不是简单的字符串拼接。
  • 对用户输入进行严格的验证和过滤,仅接受预期格式的数据。
  • 避免直接执行用户输入的命令,而是将输入用作参数,并在执行之前进行安全转义和验证。
  • 最小化系统中所使用的特权账户的权限,并仅允许其执行必要的操作。
  • 定期更新系统软件和组件,以修复已知的漏洞。

靶场演示: 视频#