-
命令注入(Command Injection),在某种开发需求中,需要引入对系统本地命令的支持来完成特定功能,当未对输入做过滤时,则会产生命令注入 -
代码注入(Code Injection),在正常的java程序中注入一段java代码并执行,即用户输入的数据当作java代码进行执行。
"/ProcessBuilder") (
public static String cmd(String filepath) {
String[] cmdList = {"sh", "-c", "ls -l " + filepath};
StringBuilder sb = new StringBuilder();
ProcessBuilder pb = new ProcessBuilder(cmdList);
pb.redirectErrorStream(true);
...
"/runtime") (
public static String cmd2(String cmd) {
StringBuilder sb = new StringBuilder();
try {
Process proc = Runtime.getRuntime().exec(cmd);
InputStream fis = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
...
"/js") (
public void jsEngine(String url) throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
String payload = String.format("load('%s')", url);
System.out.println(payload);
engine.eval(payload, bindings);
}
import groovy.lang.GroovyShell;
"/groovy") (
public void groovy(String cmd) {
GroovyShell shell = new GroovyShell();
shell.evaluate(cmd);
}
public static boolean checkOs(String content) {
String black = "|,&,&&,;,||";
String[] black_list = black.split(",");
for (String s : black_list) {
if (content.contains(s)) {
return true;
}
}
return false;
}
-
当不可信数据存在时,应尽量避免外部数据拼接到操作系统命令使用 Runtime 和 ProcessBuilder 来执行。优先使用其他同类操作进行代替,比如通过文件系统API进行文件操作而非直接调用操作系统命令。
-
禁止外部数据直接直接作为操作系统命令执行。 -
避免通过"cmd"、“bash”、“sh”等命令创建shell后拼接外部数据来执行操作系统命令。 -
对外部传入数据进行过滤。可通过白名单限制字符类型,仅允许字符、数字、下划线;或过滤转义以下符号:|;&$><`(反引号)!
https://github.com/j3ers3/Hello-Java-Sec
原文始发于微信公众号(Reset安全):Java代码审计:远程代码执行
特别标注:
本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论