记一次远程命令执行漏洞的挖掘过程

最近为甲方做渗透测试发现了一个远程命令执行漏洞,可以通过恶意参数传递执行bash命令,本文回顾一下漏洞的挖掘过程。

发现

1、通过nessus扫描器的Sitemap模块,发现了可疑目录:

2、根据sitemap的目录信息,打开URL:http://x.x.x.x:28076/file/,发现存在未授权访问漏洞:

3、逐个查看里面的文件,找到了一些比较有意思的JSP:

4、蒙了一下dirFiles.jsp的 参数,使用”path”作为参数名可列出目录、文件信息,URL:http://x.x.x.x:28076/file/dirFiles.jsp?path=。

5、同样的方法,发现show.jsp存在任意文件读取漏洞,URL:http://x.x.x.x:28076/file/show.jsp?path=/etc/passwd。

6、结合上面的目录信息和任意文件读取漏洞,对JSP文件简单审计一下,发现logContentNewest.jsp会调用一个bash脚本,便猜想能否使用它构造命令执行:

测试

logContentNewest.jsp正常执行是这样的,可自定义path参数的值,如/etc/passwd,来查找这个文件里面的内容:

分析logContentNewest.jsp和 被调用的sh脚本,得知path参数最终会传入sh脚本的FILE_PATH变量,然后调用下面的判断逻辑。从下面代码我们可以看到,函数的功能是判断FILE_PATH变量的值是否存在,而这个变量的值目前是可控的。

最初想通过添加双引号闭合if条件判断参数注入命令,没有成功。

payload:/etc/passwd" ];ls;then echo 1;fi;if [ -e "123.txt

从上图可以看到,payload的双引号不见了,在自己的Linux测试一下,发现bash在这种情况下会过滤双引号,因此排除了存在过滤双引号的可能。

经过多次测试,最终可用反引号“或者$()进行命令执行,如`ifconfig`:

payload:"`ifconfig`"

命令结果的回显是因为判断不存在FILA_PATH文件名的文件后,会把变量值返回

echo "the file($FILE_PATH) dose not exist!"

结果显示不完整,只能看到返回的第一行的结果,没关系,可以简单优化一下:

payload:"`ifconfig |xargs`"

拓展知识:xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令。因为以空格作为分隔符,所以有一些文件名或者其他意义的名词内含有空格的时候,xargs可能会误判。简单来说,xargs是给其他命令传递参数的一个过滤器,是构建单行命令的重要组件之一。 但是这里仅仅只是通过xargs的特性让它把多行内容转换成一行来更好地显示结果,当然也可以使用其他方法来实现:

在看看nmap内网扫描的结果,同样的漏洞组件在内网中还发现了很多…

小结

漏洞是由于程序调用bash脚本传参时没有做过滤,通过$(cmd)这样的方式来执行命令并将结果存入变量中,在脚本判断文件不存在时会返回文件名,造成了回显。

漏洞修复方法:

严格控制文件名参数值,先判断文件名或文件路径是否合法可修复漏洞。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-10-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏锦小年的博客

python学习笔记5.3-包的创建

包,也可以称为库,是具有很多功能的一个集合体。本文主要介绍如何自己创建一个包,以及介绍一些在包的创建过程中的技巧。 1. 包的创建 本文的例子将使用最复杂的情况...

2608
来自专栏未闻Code

技巧总结-2018-06

MongoDB的聚合查询中,$substr只能匹配ASCII的数据,对于中文要使用$substrCP

842
来自专栏有趣的django

Memcached的使用 一、安装和启动二、telnet操作memcached三、python操作memcached

         Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次...

963
来自专栏iOS Developer

Bison眼中的iOS开发多线程是这样的(二)

1383
来自专栏LanceToBigData

JavaWeb(一)Servlet中乱码解决与转发和重定向的区别

前言   前面其实已经把Servlet中所有的内容都介绍完了,这篇讲补充一点乱码和重定向与转发之间的区别! 一、request请求参数出现乱码问题 1.1、ge...

28710
来自专栏C/C++基础

Linux命令(26)——rename命令

功能类似于mv,可实现文件或者目录的重命名,mv不能批量处理,而rename可以。

551
来自专栏架构说

C++调用C函数

今天遇到的问题; 自己定义a.h文件 里面有一个方法 c实现的方法 然后有定义了一个b.h b.cpp文件 我引入了a.h 在b.cpp文件使用 c的方...

2724
来自专栏精讲JAVA

web.xml 组件加载顺序

在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要。 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前。

1205
来自专栏用户2442861的专栏

linux动态库和静态库

http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520101023104745738/

3512
来自专栏张善友的专栏

C#与yaml解析

YAML 官方网站称 YAML 是"一种所有编程语言可用的友好的数据序列化标准"。YAML Ain't Markup Language,和GNU一样,YAML是...

2785

扫码关注云+社区

领取腾讯云代金券