如上图所示代码,在进行外部url调用的时候,引入了SSRF检测:ssrfChecker.checkUrlWithoutConnection(url)机制。
SSRF安全威胁:
很多web应用都提供了从其他的服务器上获取数据的功能。使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。当攻击者提供的是一个企业私网IP时,服务器可能会访问对应网址后,把结果返回,这种形式的攻击称为服务端请求伪造攻击(Server-side Request Forgery)。
如果应用程序对用户提供的URL和远端服务器返回的信息没有进行合适的验证和过滤,就可能存在这种服务端请求伪造的缺陷。Google,Facebook,Adobe,baidu,tencent等知名公司都被发现过这种漏洞。攻击者利用ssrf可以实现的攻击主要为绕过网络限制攻击企业内网:
- 信息收集:可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
- 信息收集:对内网web应用进行指纹识别,通过访问默认文件实现;
- 执行指令:攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
- 执行指令(溢出):攻击运行在内网或本地的应用程序(比如溢出);
- 信息收集:利用file协议读取本地文件等。
以下业务场景容易出现这种漏洞:
1、应用从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户;
2、应用获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据;
3、应用根据用户提供的URL,抓取用户的web站点,并且自动生成移动wap站;
4、应用提供测速功能,能够根据用户提供的URL,访问目标站点,以获取其在对应经纬度的访问速度;
如上图代码,黑客可以通过如下方式:
http://xxx.alibaba-inc.com/ajax/Hservice.do?url=http://172.24.191.64:3333/aaa.htm&_mf_req={"xx":"xx"}&charset=utf8&_mf_callback=2222
针对上述问题,解决方案如下:
(1)判断业务需求是否只需要对几个特定的域名作请求。如果是,将这几个特定的域名加入到白名单,拒绝白名单域名之外的请求。
(2)判断业务方请求来源是否为固定的几个IP或域名。如果是,将这几个特定的IP/域名加入到白名单,拒绝白名单域名之外的请求。
(3)如果业务需求向任意URL发送请求,需要请求前通过安全包提供的函数来判断,如果业务需要跟随302跳转,每次请求时都需要经过安全包函数判断。
(4)如果在情况3的前提下,不能使用安全包需要让开发自己实现SSRF修复逻辑。
(5)其他情况拉安全工程师一起判断。
附:
1.解决jar包冲突:引入jar包的过程中,出现了jar包冲突,导致编译正常,运行时找不到类而抛错误。通过查看jar包依赖,使用exclusion来排除jar包。通过mvn dependency:tree或者open with Maven POM Editor.jar包仲裁机制。
2.NoClassDefFoundError和ClassNotFoundException的区别。NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。与ClassNotFoundException的不同在于,这个错误发生只在运行时需要加载对应的类不成功,而不是编译时发生。
NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。而如果你在J2EE的环境下工作,并且得到NoClassDefFoundError的异常,而且对应的错误的类是确实存在的,这说明这个类对于类加载器来说,可能是不可见的。
参考地址:
1.http://www.freebuf.com/articles/web/20407.html
2.阿里jar包仓库:http://mvnrepo.alibaba-inc.com/nexus/