Tencent / secguide

面向开发人员梳理的代码安全指南
Other
13.33k stars 1.95k forks source link

Go安全编码1.3.1 通过黑名单校验命令注入不可靠 #66

Open fdl66 opened 2 years ago

fdl66 commented 2 years ago

比如:

curl%0a1.1.1.1

利用%0a可以绕过命令注入校验!!!

正确的解决方案

https://github.com/alessio/shellescape/blob/master/shellescape.go https://pkg.go.dev/github.com/alessio/shellescape#example-Quote

过程中的其他思考:

参考PHP中的防范命令注入的两个函数。

PHP对于命令注入漏洞提供了escapeshellarg()和escapeshellcmd()两个函数来进行防御,当然两者针对的场景有区别。

escapeshellarg

主要是为了防止用户的输入逃逸出“参数值”的位置,变成一个“参数选项”。 处理过程:如果输入内容不包含单引号,则直接对输入的字符串添加一对单引号括起来;如果输入内容包含单引号,则先对该单引号进行转义,再对剩余部分字符串添加相应对数的单引号括起来。 场景功能:

1.确保用户只传递一个参数给命令 2.用户不能指定更多的参数一个 3.用户不能执行不同的命令

escapeshellcmd

主要是防止用户利用shell的一些技巧(如分号、管道符、反引号等)来进行命令注入攻击。

处理过程:如果输入内容中

&#;`|*?~<>^()[]{}$\, \x0A 和 \xFF

等特殊字符会被反斜杠给转义掉;如果单引号和双引号不是成对出现时,会被转义掉。

场景功能:

1.确保用户只执行一个命令 2.用户可以指定不限数量的参数 3.用户不能执行不同的命令