Bash脚本使用[ ! -v "$3" ]判参时是否存在参数注入漏洞
SUID权限Bash脚本$3参数注入风险结论
- 结论:完全可以通过构造$3参数值实现恶意代码注入,且注入触发点就在你写的这行参数判断逻辑上,风险等级极高。
- 根因1:
-v测试符用法完全错误test(即[命令)的-v选项接收的参数是变量名,作用是判断对应名称的变量是否被定义。你写的[ ! -v "$3" ]会先把$3展开为传入的内容,再判断「名字等于$3展开结果的变量是否存在」,根本不是在判断第三个位置参数是否存在。 - 根因2:参数展开阶段直接触发代码执行
当你给$3传入包含Bash求值语法的payload时,参数展开阶段就会执行恶意代码。比如攻击者执行脚本时传入第三个参数为x[$(cp /bin/bash /tmp/rootshell && chmod +s /tmp/rootshell)],$()包裹的命令会直接在这行判断执行时,以脚本的SUID高权限运行,不需要走到else分支就能完成提权,直接拿到root权限的交互shell。 - 额外风险提示:哪怕你修正了这行判断的写法,也绝对不要用SUID权限运行Bash脚本处理敏感逻辑。Bash存在大量可被攻击者控制的注入面(环境变量、自定义函数、各类展开特性),没有可靠的方式能完全封堵注入风险。
- 正确的第三个位置参数存在性判断写法:
# 写法1:直接判断位置参数总数,最稳妥 if [ $# -lt 3 ]; then exit fi # 写法2:用-v判断位置参数时不要加$展开 if [ ! -v 3 ]; then exit fi
内容的提问来源于stack exchange,提问作者Bob5421
相关产品推荐
相关产品推荐

