1 Java中的命令注入

在Java中的Runtime.getRuntime本质就是使用ProcessBuilder,以ProcessBuilder里用ProcessImpl,start 的一个子进程执行命令,

Java的native调用

a. Windows是CreateProcessW 创建子进程执行命令

b. Unix中以enecve 来创建子进程执行命令

Java并没有使用system函数进行创建子进程执行命令,通常我们也知道system的函数非常容易发生注入风险,比如system(“ls “+”test;rm *”); 后面部分是用户输入的,用户输入通过注入符号;和后续指令rm *,被系统执行。

execve, CreateProcessW 函数通过执行命令和参数分别传递的方式,这种方式杜绝了system的拼接命令的方式,有一定的安全性,但也未必是安全的。

1.1      参数直接用于命令执行

如果传入的参数对原执行命令来说是用于执行的情况下,enecve, createprocessW无法防护

1.        Windows下的

cmd.exe /K 参数可以批量执行命令

[java] view plaincopy print?
  1. String btype = request.getParameter("inputparam");
  2. String cmds[] = {"cmd.exe","/K","\"C: &&del C:\\r2.txt”+btype+” &&del C:\\r1.txt \""};
  3. System.Runtime.getRuntime().exec(cmds);

虽然此时传入的参数是用于cmd.exe的,但因为cmd.exe 使用了/K参数,将后续传入的参数用于命令执行,如果传入&&del *,最后变成

cmd.exe /K “del C:\\test1.txt && del *&&del C:\\test2.txt”

 

2.        Unix 下的

  • /bin/bash 参数,输入参数直接作为命令执行
[java] view plaincopy print?
  1. String btype = request.getParameter("test");
  2. String cmds[] = {"/bin/bash ","test.sh"+btype};
  3. System.Runtime.getRuntime().exec(cmds);

传入的参数作为bash直接执行的,此时如果作为参数传入;rm *,最后等效于

/bin/bash test.sh;rm *

  • /bin/bash –c 参数,后续输入参数为执行命令
[html] view plaincopy print?
  1. String btype = request.getParameter("inputparam");
  2. String cmds[] = {"/bin/bash ","-c","sh script.sh"+btype};
  3. System.Runtime.getRuntime().exec(cmds);

此时传入的参数是用于bash执行脚本文件的,但因为使用了-c参数,使后续传入的参数用于命令执行,如果传入;rm *,最后等效于

/bin/bash –c “sh script.sh; rm *”

上述的例子提示只要在实际应用过程中,传入的参数(例如上例的sh script.sh;)是用于运行程序内部(例如sh -c,cmd.exe/k)执行命令的,execve,CreateProcessW函数就无法防护,此时用法等效于system(“sh script.sh;rm *”)函数

1.2       参数编码

对用于常见的用于shell执行的符号进行转码,避免命令注入的风险

字符

功能描述

Unix

Windows

|

管道:连接上个指令的标准输出,作为下个指令的标准输入

\|

^|

;

连续指令服务

\;

^;

&

后台运行

\&

^&

$

变量替换

\$

^$

>

重定向输入

\>

^>

<

目标文件内容发送到命令中

\<

^<

`

返回当前执行结果

\`

^`

\

作为连接符号用,或者转义用

\\

^\

!

执行上一条shell命令

\!

^!

例如:Unix 中

可以通过编码方式,避免命令的注入

/bin/bash script.sh\;rm *

/bin/bash –c “sh script.sh\; rm *”

  • 多字符需要转义每个字符

比如:  >> 需要转义成\>\>

  • 编码方式的注意点:

编码是指在调用函数之前需要对参数进行编码,不需要多次编码。

比如说在某个script.sh test.sh\;rm *里面继续还有命令调用,而这个命令是用参数传入

sh $1

上述的解决方案并不是对test.sh;rm * 做两次编码,对script.sh来说传入参数test.sh;rm *只需要做一次编码,而在script.sh里需要对输入的参数$1在进行一次编码,遵循谁调用谁编码的原则。

1.3       参数过滤

  • 白名单保护

如果命令的参数是有特征性的建议使用白名单对输入的参数进行保护

比如允许[a-z][A-Z][0-9] _- 等有限的字符

  • 黑名单保护

a.      |;&$><`\! 可以将这些字符直接作为黑名单过滤

b.      \t\n\r\f \u0000 这些字符需要作为黑名单过滤,特别是空字符截断 \u0000 (这个在JVM6里是没有保护)

Java命令注入之防护相关推荐

  1. java入参为方法_Java命令注入原理结合Java Instrument技术(FreeBuf首发)

    一.前言 命令注入:恶意用户构造恶意请求,对一些执行系统命令的功能点进行构造注入,从而达到执行命令的效果. 二.演示环境搭建 这里采用springboot+swagger搭建一个模拟的web环境:启动 ...

  2. java 漏洞挖掘_Apache Tika命令注入漏洞挖掘

    *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担. 介绍 这篇文章将从一个Apache tika服务器的命令注入漏洞到完全利用的步骤. ...

  3. Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)

    文章目录 注入 SQL注入 JDBC拼接不当造成SQL注入 框架使用不当造成SQL注入 不安全的反射 命令注入 代码注入 表达式注入 Spel表达式注入 OGNL表达式注入 模板注入 注入 SQL注入 ...

  4. web中各种命令注入的检测和利用二

    0x00 前言 我们都知道在web 中有着各种数据注入攻击,其中有SQL注入.命令注入.XML注入等等.在平时我们渗透测试的任务中,如何快速检测和利用这些注入的漏洞,以下是一些注入命令总结 0x01 ...

  5. Ubiquiti几十款无线产品爆出命令注入漏洞 是因为没有升级老版本的PHP 据说厂商还未给出补丁...

    Ubiquiti Networks公司提供的几十款产品中存在紧急漏洞,该漏洞可用于劫持设备.这个漏洞已于11月上报给了该厂商,但目前厂商尚未发布补丁修复大多数受影响的设备. 命令注入漏洞来自于没有升级 ...

  6. kylin源码调试_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)

    原标题:Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956) 1.前言 Apache Kylin是一个开源的.分布式的分析型数据仓库,提供Hadoop/Spark 之上的 SQ ...

  7. java检查注入sql框架_Java:检查器框架

    java检查注入sql框架 我在JavaOne 2012上 了解的有趣的工具之一是Checker Framework . Checker Framework的网页之一 指出 ,Checker Fram ...

  8. 拼接符 防注入正则校验_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)

    1.前言 Apache Kylin是一个开源的.分布式的分析型数据仓库,提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据.近日,百度云安全团队监测到A ...

  9. 修改jar 注入_Apache Tika命令注入漏洞挖掘

    介绍 这篇文章将从一个Apache tika服务器的命令注入漏洞到完全利用的步骤.CVE是https://nvd.nist.gov/vuln/detail/CVE-2018-1335.由于Apache ...

  10. 代码审计:命令注入学习

    0x01 起因及想法 起因:好久没更新博客了,我在乌云社区看到一篇代码审计的整体学习思想如下: 学习代码审计目标:能独立完成对一个CMS代码安全的监测 思路: A.通读全文代码,从功能函数代码开始阅读 ...

最新文章

  1. Java线上程序频繁JVM FGC问题排障与启示
  2. 因为数据库正在使用,所以无法获得对数据库的独占访问权(转)
  3. 你不会编程,不是你不行,很有可能是老师教的方法不好。科学家发现:对大脑而言,代码编程与语言学习不同...
  4. DetNAS ThunderNet
  5. 计数排序及其改进 C++代码实现与分析 恋上数据结构笔记
  6. ue4缓存位置怎么改_怎么从蓝图节点跳转到C++源码?
  7. Android之运行PopupWindow提示Unable to add window -- token null is not valid; is your activity running?
  8. python中int是什么的缩写_python中int是什么类型
  9. Spring主要用到两种设计模式
  10. 论MS-Ajax导致的大对象堆碎片化问题
  11. c语言字符串截取_一文搞懂 C 语言 #、##、__VA_ARGS__
  12. 倒计时2天!1024 程序员节全日程曝光,105 场深度演讲点燃数字经济新时代
  13. python 调用js_python调用JS方法
  14. 全屏模式fullscreen
  15. matlab检验相关性显著性检验,基于matlab的栅格数据相关分析及显著性检验
  16. 数据集按指定比例划分为训练集、验证集和测试集
  17. FS2120双节锂电池保护 IC
  18. maven 插件 aven-assembly--plugin的使用
  19. java用下拉框实现出生日期_纯JS实现出生日期[年月日]下拉菜单效果
  20. C++Primer(5th) Notes - 2.1 基本内置类型

热门文章

  1. git小乌龟工作操作
  2. 标学教育计算机等级考试系统,标学教育电脑版
  3. .NET Framework框架的介绍
  4. python实现ping命令_Python实现Ping程序
  5. Alpine Linux如何安装软件
  6. 由于焦点冲突导致TextView的跑马灯效果和EditText不能共存的问题
  7. java从0单排之java就业培训教程复习与面试题回顾——02
  8. Java 程序开发设计文档
  9. SQL数据库打包发送与接收
  10. 报错 应用程序池 中asp.net 4.0 自动停止