代码安全规范1.1

命令注入是指应用程序执行命令的字符串或字符串的一部分来源于不可信赖的数据源,程序没有对这
些不可信赖的数据进行验证、过滤,导致程序执行恶意命令的一种攻击方式。
例 1 :以下代码通过 Runtime.exec() 方法调用 Windows 的 dir 命令,列出目录列表。
import java.io.*;
public class DirList {
public static void main(String[] str) throws Exception {
String dir = System.getProperty("dir");
Process proc = Runtime.getRuntime().exec("cmd.exe /c dir" + dir);
int result = proc.waitFor();
if (result != 0) {
System.out.println("process error: " + result);
}
InputStream in = (result == 0) ? proc.getInputStream() : proc.getErrorStream();
int c;
while ((c = in.read()) != -1) {
System.out.print((char) c);
}
}
}
攻击者可以通过以下命令利用该程序。
java -Ddir='dummy & echo bad' DirList
该命令实际上执行的是以下两条命令。
cmd.exe /c dir dummy & echo bad
例 2 :以下代码来自一个 Web 应用程序,该段代码通过运行 rmanDB.bat 脚本启动 Oracle 数据库备份,
然后运行 cleanup.bat 脚本删除一些临时文件。脚本文件 rmanDB.bat 接受一个命令行参数,其中指明需要
执行的备份类型。
...
String btype = request.getParameter("backuptype");
String cmd = new String("cmd.exe /K \"c:\\util\\rmanDB.bat "+btype+"&& c:\\utl\\cleanup.bat\"");
System.Runtime.getRuntime().exec(cmd);
...
该段代码没有对来自用户请求中的 backuptype 参数做任何校验。
通常情况下, Runtime.exec() 函数不会执行多条命令,但在以上代码中,为了执行多条命令,程序调用
Runtime.exec() 方法,首先运行了 cmd.exe 指令,因此能够执行用两个与号分隔的多条命令了。如果攻击者
传递了一个形式为 "&& del c:\\dbms\\*.*" 的字符串,那么该段代码将会在执行其他指定命令的同时执行这
条命令。

相关推荐
Promise微笑10 分钟前
开关柜局放测试仪选型避坑指南:如何从技术维度保障电力资产安全?
人工智能·安全
g3voip28 分钟前
SIP 对讲广播系统优质厂家与品牌推荐
tcp/ip·安全·信息与通信·调度
第八学期2 小时前
如何解决挖矿病毒的攻击
运维·服务器·安全
zhang133830890752 小时前
QY-18DL-1倾斜位移裂缝计:智能地质安全监测先锋
运维·网络·安全
RisunJan2 小时前
Linux命令-nmap(网络探测和安全审计工具)
linux·网络·安全
王的宝库2 小时前
【K8s】集群安全机制(三):准入控制
网络·安全·kubernetes
你觉得脆皮鸡好吃吗3 小时前
SQL注入 手工注入
网络·数据库·sql·安全·web安全·网络安全学习
盟接之桥3 小时前
盟接之桥®制造业EDI软件:专注制造,为制造业服务,让全球供应链协同更有底气
网络·安全·低代码·汽车·制造
下地种菜小叶4 小时前
订单中心怎么设计?一次讲清订单主链路、状态流转、拆单模型与核心边界
安全·缓存·rabbitmq