如何探测类似Struts 2的安全漏洞? JFrog Xray 帮你扫描漏洞,并阻止漏洞上线


近期Struts 2的高危漏洞闹得沸沸扬扬,阿里云也发布了一则告警,提示 Struts 2存在高危漏洞,距离上一次 Struts2漏洞报出也就是半年前,于是我决定研究下漏洞形成的原理,后来的事实证明,收获不小!


于是我到 Apache 官网上看到了漏洞的描述



得到的信息:


● 通过 Jakarta Multipart parser 可以在服务器上执行任意脚本。

● 由于错误消息处理不当,导致头文件Content-Type 的内容可能被恶意注入代码。

● 是一个国内的安全机构报出的漏洞(为国内的专家点赞!)


Struts 2被曝出了漏洞,那么国内有多少服务器运行了Struts呢?看看绿盟发布的中国 Struts服务器的分布情况(数据来源:绿盟科技威胁情报中心NTI)


网上已经放出了这个漏洞的 POC代码,也就是攻破漏洞的样例脚本。截取核心部分分析攻击过程



入侵的对象是一台运行了struts2.3.20的Tomcat7服务器。


入侵的过程是客户端模拟一个 POST 请求,在 header[Content-Type] 里面注入一大段 OGNL语句(#nike=multipart/form-data…)。


入侵的结果,是在服务器上打开一个命令行终端。能打开命令行终端,也就意味着入侵者可以做任何他想做的事情,我仿佛看到了网站老板知道漏洞后的表情!


那么这个漏洞形成的原因是什么,我们来继续深八一下!


在 Github 上有 Struts2的源码:https://github.com/apache/struts


1.  匹配request.getContentType字段的逻辑不够严谨

 

Struts2在处理客户端请求时,要将请求转成StrutsRequestWrapper:


String content_type = request.getContentType();  

if (content_type != null && content_type.contains("multipart/form-data")) {

   …

return request;

 

这里有一个条件content_type.contains("multipart/form-data")判断用的是 contains,也就是说即使你传入了” #nike=multipart/form-data…”,也能通过这个判断。


2.  在处理content-type内容的方法里存在漏洞



查看源码,可以看到在LocalizedTextUtil.findText()方法里,传入的消息体也就是POC 中构造的” #nike=multipart/form-data…”会被当作 OGNL 表达式解析执行。由于代码太长,直接上注释了,感兴趣的可以去看源码。



如果传入的 content-type 没有找到,这个内容将被当作 OGNL 表达式处理,这是漏洞的核心。

 

那么Struts OGNL 语言又是什么?Struts OGNL 全称是” Object Graph Navigation Language”,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

 

通过 OGNL 的注入,入侵者可以获取 request 的context,新建一个进程,打开命令行终端,做任何想做的事情,于是有了前面的漏洞 POC。有的攻击者甚至在windows服务器上打开了一个计算器。


漏洞分析当然少不了补丁对比,可以在 Github 上找到补丁

https://github.com/apache/struts/commit/352306493971e7d5a756d61780d57a76eb1f519a 



可以看到补丁里已经去掉了这个方法。

 

那么大家如果使用了有漏洞版本的 Struts2,需立刻按照官方建议升级,避免被攻击。


JFrog 的解决方案


其实这一切都可以提前避免,JFrog已经有成熟的解决方案。 在软件发布上线之前JFrog Xray就能够做好漏洞扫描。软件发布之后,一旦有新的漏洞被公开,Xray能够在第一时间检查已经发布的软件是否存在漏洞。


JFrog Xray漏洞扫描的原理是什么?



1.主动防御

Xray 是和 Artifactory 一起工作的。任何第三方包(例如文中的 struts2.3.5.jar)被上传到 Artifactory,都会被 Xray 进行漏洞扫描。


2. 漏洞数据库可扩展

Xray 默认自带了 NVD数据库(国家漏洞数据库),也支持 WhiteSource/Aqua/BlackDuck 等数据提供商。这些数据库包含了公开的包含漏洞的第三方包,一旦 Xray 拿到你上传包,它会发起这个包的 sha1/sha256码与漏洞数据库的 sha1/sha256码的比较,如果比对成功,则说明这个包存在漏洞 风险。


3. 和 CI 工具集成


可以看到,一旦 Xray检测到有高危漏洞的包,它会通知 Artifactory,让Jenkins 任务失败,并且阻止这个漏洞包在公司内部的下载和使用。


4. 漏洞波及范围视图


Xray不仅可以提示某个高危漏洞影响到了哪些产品,如果其他部门开发软件依赖于这些产品,Xray也会找出被影响的产品和服务,从而阻止这些产品的继续使用,防止带来更大的损失。


5. 多种通知机制

邮件通知:一旦检测到漏洞包,Xray 会发送邮件到相关负责人,进行处理。

Web Hook通知:一旦检测到漏洞包,Xray 可以触发 Web Hook通知第三方系统(例如 slack),进行处理。 


6. 支持扫描多种开发语言的包

目前 Xray 支持的语言包括: Java (Maven),Npm,NuGet,Debian,RPM,Python (PyPI),Docker,YUM。


总结


线上环境的安全漏洞可能会给公司带来毁灭性的灾难,之前OpenSSL 的漏洞Heartbleed, Nginx 的权限漏洞导致上千万的服务器处于被攻击的风险之中。包括 Struts,Spring等其他 Web 框架都有不少漏洞,附送漏洞查询传送门:https://web.nvd.nist.gov/view/vuln/search

 

高危漏洞不可忽视,企业技术负责人必须让自己的团队提高防范意识,提前审查第三方开源软件。使用 JFrog Xray 可以帮助团队提早发现高危漏洞,杜绝漏洞包进入生产环境。


JFrog Artifactory: http://www.jfrogchina.com/artifactory/


JFrog Xray: 

http://www.jfrogchina.com/xray/


关于JFrog



公司成立于2008年,在美国、以色列、法国和西班牙,中国北京市拥有超过200名员工。JFrog 拥有3000多个付费客户,其中知名公司包括如Netflix、思科、谷歌、亚马逊、腾讯、华为。最近,JFrog 连续第二年被德勤评选为50家增长最快的技术公司之一,还被评为硅谷增长最快的私营企业之一。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有: 检测速度快。发包速度快; 漏洞检测算法高效。 支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均可以支持。 代码质量高。编写代码的人员素质高, 通过 Code Review、单元测试、集成测试等多层验证来提高代码可靠性。 高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可以极大的客制化功能。 安全无威胁。xray 定位为一款安全辅助评估工具,而不是攻击工具,内置的所有 payload 和 poc 均为无害化检查。 目前支持的漏洞检测类型包括: XSS漏洞检测 (key: xss) SQL 注入检测 (key: sqldet) 命令/代码注入检测 (key: cmd_injection) 目录枚举 (key: dirscan) 路径穿越检测 (key: path_traversal) XML 实体注入检测 (key: xxe) 文件上传检测 (key: upload) 弱口令检测 (key: brute_force) jsonp 检测 (key: jsonp) ssrf 检测 (key: ssrf) 基线检查 (key: baseline) 任意跳转检测 (key: redirect) CRLF 注入 (key: crlf_injection) Struts2 系列漏洞检测 (高级版,key: struts) Thinkphp系列漏洞检测 (高级版,key: thinkphp) POC 框架 (key: phantasm) 其中 POC 框架默认内置 Github 上贡献的 poc,用户也可以根据需要自行构建 poc 并运行。 设计理念 发最少的包做效果最好的探测。 如果一个请求可以确信漏洞存在,那就发一个请求。如果两种漏洞环境可以用同一个 payload 探测出来,那就 不要拆成两个。 允许一定程度上的误报来换取扫描速度的提升 漏洞检测工具无法面面俱到,在漏报和误报的选择上必然要选择误报。如果在使用中发现误报比较严重,可以进行反馈。 尽量不用时间盲注等机制检测漏洞。 时间检测受影响因素太多且不可控,而且可能会影响其他插件的运行。因此除非必要(如 sql)请尽量使用与时间无关的 payload。 尽量不使用盲打平台 如果一个漏洞能用回显检测就用回显检测,因为盲打平台增加了漏洞检测过程的不确定性和复杂性。 耗时操作谨慎处理 全局使用 Context 做管理,不会因为某个请求而导致全局卡死。 简易架构 了解 xray 的整体架构可以更好的理解 cli 和配置文件的设置,方便大家更好的使用。 整体来看,扫描器这类工具大致都是由三部分组成: 来源处理 漏洞检测 结果输出 来源处理 这一部分的功能是整个漏洞检测的入口,在 xray 中我们定义了四个入口,分别是 HTTP 被动代理 简易爬虫 单个 URL URL列表的文件 单个原始 HTTP 请求文件 漏洞检测 这一部分是引擎的核心功能,用于处理前面 来源处理 部分产生的标准化的请求。用户可以针对性的启用插件,配置扫描插件的参数,配置 HTTP 相关参数等。 结果输出 漏洞扫描和运行时的状态统称为结果输出,xray 定义了如下几种输出方式: Stdout (屏幕输出, 默认开启) JSON 文件输出 HTML 报告输出 Webhook 输出 使用教程见:xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有: 检测速度快。发包速度快; 漏洞检测算法高效。 支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均可以支持。 代码质量高。编写代码的人员素质高, 通过 Code Review、单元测试、集成测试等多层验证来提高代码可靠性。 高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可以极大的客制化功能。 安全无威胁。xray 定位为一款安全辅助评估工具,而不是攻击工具,内置的所有 payload 和 poc 均为无害化检查。 目前支持的漏洞检测类型包括: XSS漏洞检测 (key: xss) SQL 注入检测 (key: sqldet) 命令/代码注入检测 (key: cmd_injection) 目录枚举 (key: dirscan) 路径穿越检测 (key: path_traversal) XML 实体注入检测 (key: xxe) 文件上传检测 (key: upload) 弱口令检测 (key: brute_force) jsonp 检测 (key: jsonp) ssrf 检测 (key: ssrf) 基线检查 (key: baseline) 任意跳转检测 (key: redirect) CRLF 注入 (key: crlf_injection) Struts2 系列漏洞检测 (高级版,key: struts) Thinkphp系列漏洞检测 (高级版,key: thinkphp) POC 框架 (key: phantasm) 其中 POC 框架默认内置 Github 上贡献的 poc,用户也可以根据需要自行构建 poc 并运行。 设计理念 发最少的包做效果最好的探测。 如果一个请求可以确信漏洞存在,那就发一个请求。如果两种漏洞环境可以用同一个 payload 探测出来,那就 不要拆成两个。 允许一定程度上的误报来换取扫描速度的提升 漏洞检测工具无法面面俱到,在漏报和误报的选择上必然要选择误报。如果在使用中发现误报比较严重,可以进行反馈。 尽量不用时间盲注等机制检测漏洞。 时间检测受影响因素太多且不可控,而且可能会影响其他插件的运行。因此除非必要(如 sql)请尽量使用与时间无关的 payload。 尽量不使用盲打平台 如果一个漏洞能用回显检测就用回显检测,因为盲打平台增加了漏洞检测过程的不确定性和复杂性。 耗时操作谨慎处理 全局使用 Context 做管理,不会因为某个请求而导致全局卡死。 简易架构 了解 xray 的整体架构可以更好的理解 cli 和配置文件的设置,方便大家更好的使用。 整体来看,扫描器这类工具大致都是由三部分组成: 来源处理 漏洞检测 结果输出 来源处理 这一部分的功能是整个漏洞检测的入口,在 xray 中我们定义了四个入口,分别是 HTTP 被动代理 简易爬虫 单个 URL URL列表的文件 单个原始 HTTP 请求文件 漏洞检测 这一部分是引擎的核心功能,用于处理前面 来源处理 部分产生的标准化的请求。用户可以针对性的启用插件,配置扫描插件的参数,配置 HTTP 相关参数等。 结果输出 漏洞扫描和运行时的状态统称为结果输出,xray 定义了如下几种输出方式: Stdout (屏幕输出, 默认开启) JSON 文件输出 HTML 报告输出 Webhook 输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值