环境介绍
远程代码执行是一个重大的安全漏洞,也是完成系统接管的最后一步。
许多网站使用命令行调用来读取文件、发送电子邮件和执行其他本机操作。如果您的站点将不受信任的输入转换为shell命令,您需要注意清理输入。
1、一个dns查找站点,存在命令执行漏洞。
2、输入域名,返回nslookup结果
3、看下后端代码,通过domain参数来传递
进入正题
4、猜测IP查找是通过操作系统功能执行的,并尝试在最后标记一个额外的命令
可以看到后面的命令成功执行,说明存在命令执行漏洞
搞定它!
5、可以看下对方服务器的一些敏感文件
google.com && cat /etc/passwd
危害!
获得访问权限后,攻击者将尝试提升其在服务器上的权限、安装恶意脚本或使您的服务器成为僵尸网络的一部分以供日后使用。
如何预防
尽量避免命令行调用
现代编程语言具有允许您读取文件、发送电子邮件和执行其他操作系统功能的接口。尽可能使用 API——仅在绝对必要的情况下使用 shell 命令。这将减少应用程序中攻击向量的数量,并且还将简化您的代码库。
正确转义输入
当不受信任的输入未正确清理时,就会出现注入漏洞。如果您使用 shell 命令,请确保清除潜在恶意字符的输入值:
;
&
|
`
更好的是,通过对已知安全字符的正则表达式进行测试来限制输入。(例如,字母数字字符。)
限制允许的命令
尝试使用字符串文字而不是用户输入来构建所有或大部分 shell 命令。如果需要用户输入,请尝试将允许的值列入白名单,或在条件语句中枚举它们。
执行彻底的代码审查
作为代码审查过程的一部分,检查系统调用是否存在漏洞。漏洞通常会随着时间的推移而蔓延 - 确保您的团队知道要寻找什么。
以受限权限运行
只使用它们运行所需的权限来运行服务器进程是一个很好的做法——最小权限原则。这有助于限制命令注入漏洞作为第二道防线的影响。