本博客地址:https://security.blog.youkuaiyun.com/article/details/82946295
一、漏洞概述
Web 应用程序可以同时处理很多HTTP 请求。开发人员经常在不考虑线程安全的情况下使用变量。从而导致对有些共享资源进行混乱操作,整个业务处理流程改变。
在java中比较容易出现条件竞争的问题,很多Servlet开发者常常会忽视一些问题,那就是Servlet实际上是一个单件,除非Servlet实现SingleThreadModel接口。当多线程访问时(即多个用户一起访问时),每个线程得到的实际上是同一个Servlet实例,这样的话,他们对实例的成员变量的修改其实会影响到别人。下面是Servlet的多线程机制:
当客户端第一次请求某个Servlet时,Servlet容器将会根据 web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行。
二、漏洞场景复现
漏洞场景一:
定义成员变量userName属于Servlet整个类中共享的资源,在方法体中定义的局部变量name,成员变量(也就是全局变量)随着对象的存在而存在,随着对象的销毁而销毁,那么就是servlet实例只要存在,userName成员变量其实被所有线程共享,代码如下:
pr