首页 > 解决方案 > 来自变量的 Bash 注入

问题描述

我有一段代码在非常远程的服务器上工作

ID=555
SLEEP_TIME=`ssh user@192.168.1.1 "cat /tmp/$ID.sleep; date >> /tmp/$ID.log"`
echo SLEEP_TIME $SLEEP_TIME
sleep $SLEEP_TIME

是的,$SLEEP_TIME 周围没有报价。ssh user@192.168.1.1 工作正常,没有密码,按键。我看到 /tmp/555.log 刷新。抱歉,我在 sshd 配置中出错了这个远程服务器(上面的代码由 cron 运行)失去了控制。但是我控制服务器 192.168.1.1 并且我可以将任何内容放入 /tmp/555.sleep = $SLEEP_TIME 变量我如何将一些代码注入 $SLEEP_TIME 变量以强制远程服务器执行它?

这是 100% 合法的。两台服务器都属于我的公司。请救救我!事实上,我失去了对远程服务器的控制,因为我使用了复杂的端口转发技巧来访问它,因为它的 IP 被 NAT 了几次。

标签: bashcode-injection

解决方案


如何向 $SLEEP_TIME 变量注入一些代码,强制远程服务器执行它?

你不能。每个命令发生一次Shell 扩展。外壳扩展执行外壳参数扩展命令替换。它同时发生。你不能两者都做。您不能先扩展变量,然后第二次扩展它来运行命令替换,因为这是两次扩展。从这里

(有人可能会争辩说,重定向发生在 bash per this中的shell 扩展之后,但一个简单的测试表明这不是真的。想知道这是不是故意的。但是 Bash 手册不是为语言层编写的。这就是为什么它是一个“手册” ',而不是'规范'。)

引用用于禁止分词。您唯一能做的就是通过将不可解析的参数传递给sleep或将两个或多个参数传递给睡眠来使脚本出错。

也请不要使用反引号` ` 进行命令替换。它们已被弃用,不能嵌套,不可读且看起来很难看。使用$(...).


推荐阅读