最近上班学(摸)java(鱼)的时候,没做好隐蔽工程,不小心被老大发现了,于是老大给了一个java网站,让我看看能不能搞搞代码啥的,但是我java才学到mybatis啊大哥!
正当我想着要不就拒绝老大的好意的时候,微信又响了。
emmmmm....诡计多端的管理层。
点开网站,一个非常标准的ZF单位官网,嗯,非常标准(你懂的),为了杜绝银手镯,这里就不放网站的图了。总之就是,非常干净(无后台、无注入、页面上都是文章)。
算了,看看有没有js能够分析一下吧,最好可以bypass java,然而js没翻到什么有用的信息,倒是F12之后发现了这个。
作为一名资深安服仔,一看到这个download?newName=xxxx就坐不住了,赶紧测了一下有没有任意文件下载。
一时间不知道该哭还是该笑,看来bypass java梦是碎了,还好站点不算复杂,我那点微薄的java知识应该可以覆盖。
首先拿到java站点,应该理清楚的就是站点各接口对应的java类之间的关系。Servlet是在 Java Web容器中运行的小程序,通常我们用Servlet来处理一些较为复杂的服务器端的业务逻辑。它是作为来自 Web 浏览器或其他HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。相当于是浏览器接口到服务器端具体实现类的映射程序。
而在servlet3.0以下的版本中,都需要在web.xml中配置servlet标签,这也就说明了为什么在上一章中测试任意文件下载的时候要先查看web.xml中的内容。
通过查看web.xml文件,理清楚了接口和具体类的映射关系之后,发现文件上传接口com.fserver.FileUpload类中,赶紧下载下来看看。
在java文件上传中,servletFileUpload是一种常见的方式,ServletFileUpload类是Apache组件处理文件上传的核心高级类,通过使用parseRequest(HttpServletRequest)方法可以将HTML中每个表单提交的数据封装成个Fileltem对象,然后以List列表的形式返回。该方式依赖commons-fileupload组件。
commons-fileupload处理文件上传的实现过程:
创建一个DiskFileItemFactory工厂:
DiskFileItemFactory factory = new DiskFileItemFactory();
创建文件上传解析器:
ServletFileUpload upload = new ServletFileUpload(factory);
判断上传的数据是否为MultipartContent数据
if(!ServletFileUpload.isMultipartContent(req)){
System.out.println("错误!");
}
当然除了commons-fileupload处理文件上传之外呢,还需要有一些其他的东西,比如通过HTTPServletRequest.getServletContext().getRealPath("路径名")设置上传文件路径等操作。那么从文件上传漏洞的角度来说,最重要的还是看上传文件的过滤条件啦,根据过滤条件来判断使用的绕过方法,这里不多赘述。
既然逻辑理清楚了,就可以看看目标站点的文件上传代码啦!
有价值的代码就在上图当中了,可以看出来文件上传之后是放在/WEB-INF/files的目录下的,并且没有做任何的过滤。
那就直接上传文件吧!
结束!
夯实安全责任
共筑网络安全