CNVD 实战笔记:通过 Java 代码审计挖掘 SSRF 漏洞
首先通过搜索关键词来寻找cms中ssrf的使用
/*** 审计的函数* 1. URL* 2. HttpClient* 3. OkHttpClient* 4. HttpURLConnection* 5. Socket* 6. ImageIO* 7. DriverManager.getConnection* 8. SimpleDriverDataSource.getConnection*/
当搜索到OkHttpClient
时发现了存在一个工具类调用封装了okhttp3 ,不过只主要支持http协议。接着向上找调用查看url变量是否可控
这里就只记录发现漏洞的一条线,实战需要每条都寻找,向上寻找到了fetchRemoteFile
调用
一直找到了路由处,发现有利用的可能。查看权限校验这还是一个未授权的接口,权限具体过程就不细说了
可以看到此处逻辑,会获取type参数,然后isExternalUrl
校验这是否是一个外部url,如果是外部url直接报错
校验的逻辑非常简单,判断是否以http://,https://开头,相当于做了过滤
通过校验后便会在url后面加上拼接上/index.json作为参数传入。我们先接着看后面的代码
public static JSON fetchRemoteJson(String fileUrl) throws RebuildException {String content = fetchRemoteFile(fileUrl);if (JSONUtils.wellFormat(content)) {return (JSON) JSON.parse(content);}throw new RebuildException("Unable to read data from RB-Store");
}
接着来看fetchRemoteFile
,判断fileUrl是不是以http开头,如果是以http开头则直接调用get获取其内容,如果不是http开头,会拼接一些乱七八糟的url导致无法利用。可是前面对外部的url已经进行了校验。
不过在这停留想了一段时间后发现了,这里判断是的http,但是上面校验的是http://,https://。这就导致了前面的校验和后面的判断不统一(很多漏洞的原理),存在有绕过的可能,于是我便尝试以http:/,https:/行动
写了测试类后发现是可以办到的,okhttp3库能够解析http:/ ,https:/
接着还需要解决url后面拼接/index.json,这个的处理方法其实还是蛮多的,这里选择用参数抵消掉后面拼接的index.json让其成为一个无效参数带过去即可
例如:http://10.82.189.40:18080/setup/load-index?type=http:/127.0.0.1:80/2.txt?x=
可以看到成功的获取了我放在服务器的内容,但由于之后会进行json解析导致只有json格式才会回显。相当于就是无回显ssrf,能让其访问任意的http资源,但是无回显,危害程度就比较低了。不过算是一次实战经验。