【博文推荐】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

 

解决方案:

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()}

解决方案:

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

在大的项目的开发中,如果采用了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

原文地址http://jncumter.blog./812546/1720489

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/139494.html<

(0)
管理的头像管理
上一篇2025-03-03 12:22
下一篇 2025-03-03 12:23

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注