OA高危漏洞的修复过程

简介:

  21日信息安全部副总监转来一封邮件,关于OA的重大安全隐患,一是越权访问的问题;二是struts版本问题,经过一段时间的整改,现将问题描述和解决方案及实施过程总结如下:


越权访问漏洞

风险等级:高危

问题类型:程序漏洞

问题描述:

     由于OA系统档案查询模块没有对查询者的权限进行完整验证,导致攻击者可以利用该漏洞在查询模块通过修改工号的方式遍历公司所有员工的个人信息。(注:editStaffInfoByCode参数值即工号)

     漏洞地址:

curl 'https://oa.*******.com/dependence/queryStaffinfoByStaffId.action' -H 'Cookie: Hm_lvt_0f350e5390b92578122a09670da4e18a=1444457881;JSESSIONID=17F532AA5A02473F18BFC2251D9EB4CD.s39;Hm_lvt_f5127c6793d40d199f68042b8a63e725=1444382434,1444640491,1445232940;Hm_lpvt_f5127c6793d40d199f68042b8a63e725=1445234011' -H 'Origin: https://oa.*******.com' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.8' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36' -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer:https://oa.*******.com/dependence/staffInfoAdd.action?editStaffInfoByCode=FX006635&command=detail&selfstaffinfo=showFiled' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data-binary '{"staffinfoVo":{"staffinfoEntity":{"staffId":"FX006635"}}}' --compressed

wKiom1ZX__LwIjZpAA5psxBU1Rw486.jpg

解决方案:

1.修改网站代码,添加权限验证功能,可以划分用户组,根据用户组进行权限划分并严格限制用户的访问;

2.复用管理范围和数据权限功能(mybatis拦截器对查询进行拦截并处理),使数据查询控制在管理范围的范畴内;

3.前端不向后端传递参数,用于查询的工号在后端从redis服务器上直接拉取当前用户的工号;

4.前端传递的参数不使用工号,而使用档案的uuid代理主键,防止攻击者使用伪造数据遍历;


Struts2命令执行漏洞

风险等级:高危

问题类型:程序漏洞

问题描述:

OA系统使用的struts2框架版本较低,存在远程代码执行漏洞,攻击者可利用该漏洞远程进行执行命令、上传脚本后门文件等操作,进而直接获取服务器权限。

漏洞地址:

https://oa.*******.com/main/index.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{%27cat%27,%27/etc/passwd%27})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23e%3dnew%20char[50000],%23d.read(%23e),%23matt%3d%23context.get(%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27),%23matt.getWriter().println(%23e),%23matt.getWriter().flush(),%23matt.getWriter().close()}


解决方wKioL1ZYAN6RsBvgAAqGJUhslLs764.jpg案:

    1.升级struts2框架到最新版本,将struts2升级到2.3.15.1

    2.在升级的过程中导致 StrutsModuleConfigProvider 类在加载classpath 下的struts配置文件出错;

    3.通过以下方法解决该错误

1.在pom.xml中更新版本号

1
< struts-version >2.3.15.1</ struts-version >

2.将struts2的自动装载配置文件方法重写如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public  class  StrutsModuleConfigProvider   extends  XmlConfigurationProvider {
         //需要解析加载的文件路径
      private  static  final  String FILE_PATTERN =  "classpath*:com/fx/**/server/META-INF/struts.xml" ;
      public  StrutsModuleConfigProvider() {
       Map<String, String> mappings =  new  HashMap<String, String>();
       mappings.put( "-//OpenSymphony Group//XWork 2.1.3//EN" ,
         "xwork-2.1.3.dtd" );
       mappings.put( "-//OpenSymphony Group//XWork 2.1//EN" "xwork-2.1.dtd" );
       mappings.put( "-//OpenSymphony Group//XWork 2.0//EN" "xwork-2.0.dtd" );
       mappings.put( "-//OpenSymphony Group//XWork 1.1.1//EN" ,
         "xwork-1.1.1.dtd" );
       mappings.put( "-//OpenSymphony Group//XWork 1.1//EN" "xwork-1.1.dtd" );
       mappings.put( "-//OpenSymphony Group//XWork 1.0//EN" "xwork-1.0.dtd" );
       mappings
         .put(
           "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ,
           "struts-2.0.dtd" );
       mappings
         .put(
           "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" ,
           "struts-2.1.dtd" );
       mappings
         .put(
           "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" ,
           "struts-2.1.7.dtd" );
       setDtdMappings(mappings);
      }
      /**
       * (non-Javadoc)
      
       * @see com.opensymphony.xwork2.config.ContainerProvider#needsReload()
       */
      @Override
      public  boolean  needsReload() {
       return  true ;
      }
      /*
       * (non-Javadoc)
      
       * @see com.opensymphony.xwork2.config.ContainerProvider#register(com.opensymphony.xwork2.inject.ContainerBuilder,
       *      com.opensymphony.xwork2.util.location.LocatableProperties)
       */
      @Override
      public void register(ContainerBuilder containerBuilder,
        LocatableProperties props) throws ConfigurationException {
       super.register(containerBuilder, props);
      }
      /*
       * (non-Javadoc)
      
       * @see com.opensymphony.xwork2.config.PackageProvider#loadPackages()
       */
      @Override
      public void loadPackages() throws ConfigurationException {
       super.loadPackages();
      }
      @Override
      protected Iterator<URL> getConfigurationUrls(String fileName)
        throws IOException {
       List<URL> urls = new ArrayList<URL>();
       Resource[] resources = getAllResourcesUrl();
       for (Resource resource : resources) {
        urls.add(resource.getURL());
       }
       return urls.iterator();
      }
      /**
       * 获取系统中需要搜寻的struts的配置
      
       * @return
       * @throws IOException
       */
      private  Resource[] getAllResourcesUrl() {
       ResourcePatternResolver resoler =  new  PathMatchingResourcePatternResolver();
       try  {
        return  resoler.getResources(FILE_PATTERN);
       catch  (IOException e) {
        e.printStackTrace();
       }
       return  new  Resource[ 0 ];
      }

   在大的项目的开发中,如果采用了struts2,就有可能有很多的struts2的配置文件,虽然struts2提供通配符和action的自动加载,但我们一般还是很难将所有的配置文件采用一个单一的action配置文件来解决,因此就产生了很多的action配置文件。如果我们将所有的配置文件存放在一个配置文件中,这样在项目间的协同开发和测试就会出现混乱,而最好的开发模式就是每个模块都有自己的action配置文件,而系统会自动搜索到所有的配置文件,采用自动加载的方式来完成struts2的初始化。
虽然在struts2中提供在web.xml
文件中配置config参数,将说有需要加载的配置文件的路径写在其中,以逗号分隔,这样对于大的项目来说还是很难实施的,最好的办法还是采用自动扫描的方法,我们可以扩展struts2的ConfigurationProvider接口,在web.xml中配置自定义的加载类即可,这样就解决了struts2配置文件自动加载的问题。

   另外,struts2的漏洞时升级到2.3.15.1时报下面错误

java.lang.NoSuchMethodError: ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z

原因是因为ognl的版本也需要跟着升级需要升级到3.0.6


 下面是一篇参考资料,关于天津大学招生办网站因struts版本问题的重大安全漏洞及其解决方法。



     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1720489,如需转载请自行联系原作者



相关文章
|
10月前
|
安全
致远OA A8 htmlofficeservlet 任意文件上传漏洞 漏洞复现
致远OA A8 htmlofficeservlet 任意文件上传漏洞 漏洞复现
1399 0
致远OA A8 htmlofficeservlet 任意文件上传漏洞 漏洞复现
|
10月前
|
安全
致远OA ajax.do 任意文件上传 (CNVD-2021-01627) 漏洞复现
致远OA ajax.do 任意文件上传 (CNVD-2021-01627) 漏洞复现
1105 0
|
10月前
|
安全
致远OA wpsAssistServlet 任意文件上传漏洞 漏洞复现
致远OA wpsAssistServlet 任意文件上传漏洞 漏洞复现
1456 0
|
11月前
|
JSON 监控 安全
通达OA任意文件上传漏洞详细分析
通达OA任意文件上传漏洞详细分析
|
11月前
|
安全
通达OA漏洞复现分析
通达OA漏洞复现分析
|
SQL 监控 安全
网站安全检测 发现泛微OA致命的SQL注入漏洞
近日,SINE安全监测中心监控到泛微OA系统被爆出存在高危的sql注入漏洞,该移动办公OA系统,在正常使用过程中可以伪造匿名身份来进行SQL注入攻击,获取用户等隐私信息,目前该网站漏洞影响较大,使用此E-cology的用户,以及数据库oracle都会受到该漏洞的攻击,经过安全技术的POC安全测试,发现漏洞的利用非常简单,危害较大,可以获取管理员的账号密码,以及webshell。
652 0
网站安全检测 发现泛微OA致命的SQL注入漏洞
|
存储 SQL 安全
网站安全渗透测试服务 OA办公系统越权漏洞检测与修复
渗透测试服务,是甲方授权乙方安全公司对自身的网站,以及APP,办公系统进行的全面人工安全渗透,对漏洞的检测与测试,包括SQL注入漏洞,XSS存储漏洞,反射漏洞,逻辑漏洞,越权漏洞,我们SINE安全公司在进行渗透测试前,是需要甲方公司的授权才能进行,没有授权的渗透以及网站漏洞测试在法律上来讲是违法的,非法渗透带来的一切责任与后果,要自行承担,需要渗透测试服务的一定要找正规的安全公司来做,以防上当。前段时间我们SINE安全公司,收到甲方公司的渗透测试ORDER,对公司使用的OA办公系统进行全面的安全检测,与漏洞测试,针对前期我们做的一些准备,与测试内容,我们来详细跟大家分享一下渗透测试的过程。
428 0
网站安全渗透测试服务 OA办公系统越权漏洞检测与修复
|
1月前
|
UED
点晴OA办公系统如何实现业务表单的自定义设计
在点晴OA办公系统中,业务表单的自定义设计是一项重要的功能,它能够满足企业不同的业务需求,提高工作效率和协作能力。 随着企业的发展,不同的业务部门需要处理各种类型的表单,如人事表单、财务表单、项目表单等。如果这些表单无法根据实际需求进行自定义设计,就会导致工作效率低下、信息不准确、协作困难等问题。因此,实现业务表单的自定义设计是提高企业办公效率和协作能力的重要手段。
23 0
|
1月前
|
BI
四款OA办公系统快速提高企业效率
拥有合适企业的OA系统不仅可以实现办公自动化而且还能提高企业效率,今天盘点以下几家的OA办公系统。
29 0
|
2月前
|
数据安全/隐私保护
免费OA办公系统,提升工作效率与协作的智能选择
在当今快节奏的时代中,企业需要一种高效、智能的办公系统来提升工作效率,促进团队协作,并实现更好的信息管理。点晴OA办公系统是真正免费使用的,成为现在企业管理的重要工具之一。
30 2