原理 #
重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者进行,也可以由拦截并重发该数据的攻击方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通信过程中都有可能发生。
重放攻击的基本原理就是把以前窃听到的数据原封不动地重新发送给接收方。很多时候,网上传输的数据是经过加密的,此时窃听者无法得到数据的准确意义。但是如果他知道这些数据的作用,就可以在不知道数据内容的情况下通过再次发送这些数据达到愚弄接收端的目的。
例如,有些系统会将鉴别信息进行简单的加密后再传输,这时攻击者虽然无法获取到密码,但是他们可以先截取加密后的口令然后将其重放,从而利用这种方式进行有效的攻击。再比如,假设网上存款系统中,一条消息表示用户支取了一笔存款,攻击者完全可以多次发送这条消息而偷窃存款。
攻击者也可以利用系统中POST请求的数据包针对单个请求设置有效的验证参数,导致会话请求可以重放,无限制的向数据库中插入海量数据,或无限制的上传文件到系统中,造成资源浪费。
重放漏洞是逻辑漏洞中常见的漏洞之一,攻击者通过嗅探受害者的数据包,将此数据包对服务器恶意重放从而造成危害,如截取登录时的数据包重放,就可直接登录系统;截取成功购买物品时的数据包重放,就有可能实现付1买10的操作。
分类 #
- 根据重放消息的接收方与消息的原定接收方的关系,重放攻击可分为3种:
a.** 直接重放,**即重放给原来的验证端,直接重放的发送方和接收方均不变;
b. 反向重放,将原本发给接收方的消息反向重放给发送方;
c. 第三方重放,将消息重放给域内的其他验证端。
- 考查攻击者对消息重定向,这种分类法称为目的地分类法,分类如下:
a. 偏转重放攻击,重放消息重新定向,发送给不同于原接收者的第三方。这种情形可进一步分为如下子类
①重放消息重定向,发送给原发送者,称为反射重放攻击。
②重放消息重定向,发送给第三方,即不同于发送者和原接收方的第三方。
b.攻击者通过延时的方法,将消息传送给目的地,称为直接重放攻击。
0x04 代码示例 #
以下代码一是对请求时间做了限制,请求时间超出时间范围的将被拒绝。二是缓存过期时间等于有效时间的跨度, 若缓存中已存在该随机数, 则拒绝,很好的防御了会话重放攻击。
@Resource private ReactiveStringRedisTemplate reactiveStringRedisTemplate; private ReactiveValueOperations<String, String> reactiveValueOperations; @PostConstruct public void postConstruct() { reactiveValueOperations = reactiveStringRedisTemplate.opsForValue(); } @Override protected Mono<Void> doFilter(ServerWebExchange exchange, WebFilterChain chain) { // 此处的`ATTRIBUTE_OPEN_API_REQUEST_BODY`是前面过滤器存入的 OpenApiRequest<String> body = exchange.getRequiredAttribute(ATTRIBUTE_OPEN_API_REQUEST_BODY); if (!ObjectUtils.allNotNull(body, body.getTimestamp(), body.getNonce())) { return fail(exchange); } Long gmt = System.currentTimeMillis(); // (一) if (gmt + effectiveTimeRange < body.getTimestamp() || gmt - effectiveTimeRange > body.getTimestamp()) { return fail(exchange); } // (二) return reactiveValueOperations.setIfAbsent(MessageFormat.format( KEY_REPLAY_NONCE, body.getAppId(), body.getNonce()), String.valueOf(System.currentTimeMillis()), Duration.ofMillis(effectiveTimeRange * 2L)) .log(LOGGER, Level.FINE, true) .flatMap(approved -> approved ? chain.filter(exchange) : fail(FORBIDDEN, exchange) );
限制绕过 #
攻击前提条件
- 网站的服务器需是Windows主机;
- 攻击者需要有独立外网主机;
- 服务器存在漏洞,能执行命令(当然也可以通过钓鱼的方式),通过此漏洞能够远程桌面连接或命令执行;
漏洞利用
- 攻击端设置代理
攻击者通常处于内网,外网访问大多是映射出来的。为了获取受害者传来的数据包,所以需要设置BurpSuite的代理为任意ip过来的数据包,并且为了不引起用户的怀疑不要开启抓包功能(设置为Intercept is off)。

- 开启目标服务器代理
利用前提条件中提及的获取的远程桌面连接,通过图形化界面设置IE代理(或通过命令执行设置IE代理)。

- 获取敏感数据
等待用户登录服务器并使用浏览器访问部署的网站,因为使用了BurpSuite还有可能获取到用户在其他网站上的登录账户及密码等信息。如果用户已经登陆了网站,攻击者也可以利用他登录的cookie或者token等信息在本地进行重放利用。
等待后,用户已经登录了网站,BurpSuite也获取到了这些登录数据。
其实还可以将开启代理的批处理文件发给安全意识不高的人员。或者通过编程调用这些命令,到时就可以直接发送exe文件给受害者,这样的隐蔽性也相对较好。一旦他们点击,攻击者即可获取这些受害者访问网站的所有数据,登录时可以获取登录凭证、对于已经登录的情况下也可获取登录成功的cookie等进行本地的重放等。

0x06 测试过程 #
使用BurpSuite的Repeater功能或自行编写脚本对数据包进行重放,验证是否存在短信轰炸、无限制刷评论、无限制点赞、无限制积分、无限制投票、无限制文件上传等业务逻辑问题。
测试案例1 #
- 访问将注册页面。

- 截取注册页面数据包,通过重放几次发现系统对Cookie设置了2分限制。



- 删除cookie,发送至Intruder模块进行测试,可绕过cookie限制,进行无限制会话重放。所以该系统注册账号处存在会话重放漏洞。

测试案例2 #
- 访问具有获取验证码的功能模块。

- 截取数据包,多次点击BurpSuite工具Repeater模块的“GO”按钮,进行会话重放。

- 受害者手机收到多条验证码短信,遭遇短信轰炸攻击。所以该系统“诉求提交”功能处,存在会话重放漏洞。
