freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

浅析命令执行
耳双 2021-08-11 09:23:26 170477

一、什么是命令执行

​ 命令执行(Command Injection)指在某些开发需求中,需要引入对系统本地命令的支持来完成某些特定的功能。当开发未对用户传入的参数进行严格的校验、过滤时,则很有可能会产生命令注入。攻击者使用命令注入来执行系统终端命令,直接获取服务器控制权限。

​ 在开发过程中,开发人员可能需要对文件进行新建、移动、修改、删除或执行其他系统命令。Java的Runtime类可以提供调用系统命令的功能。

二、Java命令注入的形式

​ 1、攻击者能够篡改程序执行的命令:攻击者直接控制了所执行的命令。

​ 2、攻击者能够篡改命令的执行环境:攻击者间接控制了所执行的命令。

常见的参数编码

字符功能描述UnixWindows
|管道:连接上个指令的标准输出,做为下个指令的标准输入\
;连续指令服务\;^;
&后台运行\&^&
$变量替换\$^$
>重定向输入\>^>
<目标文件内容发送到命令中\<^<
`返回当前执行结果\`^`
\做为连接符号使用,或转义用\^\
!执行上一条shell命令\!^!

命令执行支持使用连接符来执行多条语句,常见的连接符有“|”,“||”,“&”,“&&”

符号含义
|前面的命令输出结果作为后面的命令的输入内容
||前面的命令执行失败后才执行后面的命令
&前面的命令执行后继续执行后面的命令
&&前面的命令执行成功后才执行后面的命令

​ 例如命令“ls | less” ls 是查看当前目录文件;

​ less查看文件内容,less命令可以分页显示任意命令的输入,并将该命令的结果发送到标准输出。(按q退出)

​ 输入 ls | less 后

图片.png

​ || 连接符是当前面命令执行失败后才执行后面的命令

图片.png

​ 从图片中可以看到,命令 cd redis-2.8.17 || ls 连接符前面的命令执行成功,后面的命令就不再执行了。

​ 桌面上没有123这个文件夹,所以我们cd到123这个目录下使得连接符前的命令执行失败。连接符后面跟个ls。命令为“cd 123 || ls” 先执行了连接符前的命令,然后又执行了连接符后面的命令。所以错误信息与ls信息都输出了出来。

&连接符是连接符前的命令执行成功后继续执行后面的

图片.png

​ &&连接符是当连接符前面的命令执行成功后才执行后面的命令

图片.png

​ 可以桌面上没有123这个路径,所以首先 cd 123 && ls,连接符前的命令失败,然后连接符后面的命令不在执行。

​ 桌面有redis-2.8.17这个目录,所以连接符前的命令将会执行成功,看到输出结果显示两个命令均执行成功。

​ 对于Java环境中的命令注入,连接符的使用存在一些局限。例如使用ping命令来诊断网络。其中url参数为用户可控,当攻击者输入“www.baidu.com&ipconfig”拼接处的系统命令为“ping www.baidu.com&ipconfig”,该命令在命令行终端可以成功执行。然而在Java运行环境下,却执行失败。在该Java程序处理中,“ping www.baidu.com&ipfocnif”被当做一个完整的字符串而非两个命令。因此不会存在漏洞。

三、Runtime类中的exec()

​ 由于我这现在只有JDK6的API手册,所以就先已JDK6的为准吧。图片.png

​ 这里是对Runtime类的一个介绍。下面将看一下API手册对exec()的解释。

图片.png

​ API上的意思是单独打开一个进程执行指定的命令,这个方法还有多个重载方法。

​ 通过API里的可以看到要实行的命令可以通过字符串和数组的方式传入。

​ 当传入的参数为字符串的时,会先经过StringTokening的处理,主要是针对空格及换行符等空白字符进行处理,后续会分割出一个cmdarray数组保存命令参数,cmdarray数组下标值为0的元素为所要执行的命令。

四、防护方式

尽量不要执行外部传入的命令。

使用自定义函数或者函数库来替代外部明星的

白名单保护

​ 如果命令的参数有特征性的建议使用白名单对用户输入的参数进行校验过滤,从而进行保护。

​ 黑名单保护

​ 1、将常用参数编码做为黑名单过滤

​ 2、一些特殊字符也需要做为黑名单校验,如\r\n\t\f以及\u0000 00截断等。

# Java代码审计
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 耳双 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
漏洞利用
耳双 LV.4
这家伙太懒了,还未填写个人描述!
  • 9 文章数
  • 0 关注者
APK反编译思路及操作记录
2021-12-08
CVE-2021-41773 Apache HTTP Server 路径穿越漏洞复现
2021-10-28
密码安全
2021-10-12
文章目录