Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
fdl66 opened this issue Nov 22, 2021 · 0 comments
Open

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

fdl66 opened this issue Nov 22, 2021 · 0 comments

Comments

@fdl66
Copy link

fdl66 commented Nov 22, 2021

比如:

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.用户不能执行不同的命令

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant