【发布时间】:2022-08-14 02:28:27
【问题描述】:
考虑以下代码:
String malicious_input = \'\"\"; rm -rf / #yikes\'
sh \"echo Hello ${malicious_input}!\"
然后生成的 shell 脚本是
echo Hello \"\"; rm -rf / #yikes!
简单、经典的代码注入。没有什么闻所未闻的。我一直在努力寻找的是一种妥善处理此案的方法。解决此问题的第一种方法是:
- 只需在 shell 调用中的字符串周围添加单引号,例如
sh \"echo Hello \'${malicious_input}\'!\"。是的,但不,我只需要切换到malicious_input = \"\'; rm -rf / #yikes\"来规避它。 - 那就加双引号吧!仍然没有,这些不仅很容易规避,而且甚至容易发生路径通配/扩展。
- 然后在调用 Groovy 字符串插值之前在输入字符串周围添加引号。同样的,shell 命令行没有改变。
- 然后,添加单引号,但在字符串中的每个单引号前加上反斜杠,以防止 shell 将其解释为元字符。是的,如果我也用第二个反斜杠转义每个现有的反斜杠,这种方法就可以了。尽管如此,如何防止这种扩展的细节仍然取决于外壳(POSIX-ish,Windows
bat,不确定 powershell)。此外,每个参数都需要三行代码。另外,如果没有明确的 shebang 行,我什至无法确定使用了哪个 shell。
所以,我的问题是:为我执行此操作的内置函数在哪里?我很难相信这不存在,但我找不到它。另外,让我很困惑的是我是第一个遇到这个问题的人......
标签: shell groovy code-injection jenkins-groovy