Ueditor的SSRF漏洞分析
前言
ueditor编辑器的v1.4.3版本(jsp)存在SSRF漏洞
源码地址:https://github.com/fex-team/ueditor
下面是刚看博客跟着大师傅学的经验:https://fuping.site/2018/05/25/UEditor-SSRF-In-JSP/
在比如看到在版本1.4.3.1
修复了SSRF漏洞:
那么就是v1.4.3
存在这个SSRF漏洞,我们独立做漏洞分析的时候可以对比版本1.4.3与1.4.3.1有什么不同,从而找到存在问题的地方
去github查看某个版本的时候,可以通过如下看tag的方式:https://github.com/fex-team/ueditor/tree/v1.4.3.1/jsp
查看版本1.4.3.1下的jsp代码:
可以发现在该版本有一次commit,commitId 为a1820147cfc3fbe2960a7d99f8dfbe338c02f0b6
。根据内容字面意思应该是增加了修复SSRF的代码。
然后就对比一下两个版本中jsp部分的代码有何不同
github中对比两个版本代码不同的方法:
- 方法1:https://docs.github.com/zh/pull-requests/committing-changes-to-your-project/viewing-and-comparing-commits/comparing-commits
比较两次commit:比如我们比较这两次提交,下面url中前面是用户名和仓库名,后面..
两边分别是两次的commit id
我们这里只比较jsp中的变换,可以看到如下,jsp/src/com/baidu/ueditor/hunter/ImageHunter.java
中的validHost
方法进行了一些改动:
比较变化:
https://github.com/fex-team/ueditor/compare/master...octocat:master
……其他更方便的方式自己探索
- 方法2:拉取下来之后:https://blog.csdn.net/qq_16517483/article/details/125566057
漏洞分析
前面知道了jsp/src/com/baidu/ueditor/hunter/ImageHunter.java
的validHost
方法就行了修改:
可以看到v1.4.3.1
新增了主机名是否为本地内部地址的判断:
|
|
而v1.4.3
中仅仅做了是否不为过滤的ip地址的限制
下载v1.4.3
的jsp的源码:
ctrl+单击发现是在com/baidu/ueditor/hunter/ImageHunter.java
中的captureRemoteData
方法中调用了validHost
方法:
该方法首先会调用validHost
对传入的url进行验证,如果不合法就抛出异常;如果合法就继续往下走,通过validContentState
验证返回状态码是否满足;后续进行一系列文件大小和文件类型等其他条件判断,都符合后才进行后续图片报错,否则抛出异常。
继续追踪,在capture
方法中调用了captureRemoteData
。
capture
又在com/baidu/ueditor/ActionEnter.java中的invoke
方法中被调用
即当传递的action
参数对应为catchimage
时,才可能触发SSRF漏洞。
漏洞验证:
搭建环境配置
入口在jsp/controller.jsp
构造漏洞路径:
http://localhost:8088/jsp/controller.jsp?action=catchimage&source[]=http://192.168.135.133:8080/test.jpg
可根据页面返回的结果不同判断该地址端口是否开放:
- 如果抓取不存在的图片地址时,页面返回{“state”: “SUCCESS”, list: [{“state”:"\u8fdc\u7a0b\u8fde\u63a5\u51fa\u9519"} ]},即state为“远程连接出错”。
- 如果成功抓取到图片,页面返回{“state”: “SUCCESS”, list: [{“state”: “SUCCESS”,“size”:“5103”,“source”:“http://192.168.135.133:8080/tomcat.png”,“title”:“1527173588127099881.png”,“url”:"/ueditor/jsp/upload/image/20180524/1527173588127099881.png"} ]},即state为“SUCCESS”。
- 如果主机无法访问,页面返回{“state”:“SUCCESS”, list: [{“state”: “\u6293\u53d6\u8fdc\u7a0b\u56fe\u7247\u5931\u8d25”}]},即state为“抓取远程图片失败”。
由于除了在config.js中的catcherLocalDomain配置了过滤的地址外,没有针对内部地址进行过滤,所以可以根据抓取远程图片返回结果的不同,来进行内网的探测。
具体复现过程可参考:https://fuping.site/2018/05/25/UEditor-SSRF-In-JSP/