九维团队-绿队(改进)| Java代码审计之SSRF
一、前 言
审计某cms的时候看到采用了版本为1.3.6的UEditor编辑器,发现开启了getRemoteImage.jsp,已知该接口存在SSRF漏洞,通过分析并记录下来,供具有一定java基础的小伙伴学习,文章如有不足之处,还望大佬们能指正。
二、 SSRF简介
SSRF(Server-Side Request Forge, 服务端请求伪造),攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测内网端口或攻击内网服务。
三、 SSRF关键函数
SSRF容易出现的功能点,能够对外发起网络请求的地方都有可能,SSRF漏洞在代码审计时可重点关注一些HTTP请求操作函数并判断输入是否可控,部分如下:
HttpURLConnection.getInputStream
HttpURLConnection.connect
URLConnection.getInputStream
HttpClient.execute
HttpClient.executeMethod
Request.Get.execute
Request.Post.execute
URL.openStream
ImageIO.read
OkHttpClient.newCall.execute
HttpServletRequest
BasicHttpRequest
*左右滑动查看更多
四、 记一次案例分析
首先查看项目结构,发现存在扩展插件UEditor version: 1.3.6。
位于/webapp/plug-in/ueditor/ueditor.config.
js,我们看到第51-57行,默认开启了getRemoteImage.jsp接口,代码备注中提示该接口会发送一个远程请求。
进一步分析,查看:
src/main/webapp/plug-in/ueditor/jsp/getRemoteImage.jsp
*左右滑动查看更多
代码第9行获取用户传递的参数upfile赋值给变量url。
接着继续往下看,从下图可以看到进入for循环,分析第22-25行,调用了getFileType方法。
跟进getFileType方法,发现代码第70行对文件类型做了白名单,只允许gif、png、jpg 、jpeg、bmp后缀文件类型。
然后继续分析代码第30-57行,如下图所示,第30行调用了URL对象的openConnection方法打开连接获得URLConnection类对象,并进行强制转换为HttpURLConnection。
(注:HttpURLConnection 只能走浏览器的HTTP协议。)
查看一下官方对该方法的解释:
查看URL类的API,发现URL对象中openConnection()方法会返回一个实例对象。
如下图,代码第46行,调用了conn.getInputStream()获取InputStream,在调用这个方法时,会自动调用HttpURLConnection.connect()方法,也就是建立连接,就意味着一旦调用getInputStream()连接就已经建立好了,URL请求就已经发出去了,我们知道url变量用户是可控的,那么就会存在SSRF漏洞。
会想到ssrf漏洞进行内网探测需要回显判断,如下图所示,第30-31行代码缺少进行空指针判断,当远程的主机端口不存在进行conn.getContentType()的时候会导致给jsp页面抛出一个空指针异常报错500;第65行当端口存在就会给前端进行回显如下格式:
{'url':'" + outstr + "','tip':'"+state+"','srcUrl':'" + url + "'}
*左右滑动查看更多五、 端口探测
构造POC进行验证,当远程主机端口存在就会抓取成功。
抓取外网的测试:
内网常见端口探测,开启了8081、3306、9080端口:
当端口不存在就会抛出空指针异常报错500:
六、 加固建议
1.替换为其他安全性高的编辑器;
2.限制白名单URL以及限制请求的端口为http常用的端口;
3.禁止30x跳转。
4.考虑部署必要的安全设备进行监测和拦击恶意攻击,比如攻击流量监测类设备。
— 往期回顾 —
关于安恒信息安全服务团队安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。