开放API网关实践(二) —— 重放攻击及防御

前言

上一篇文章《开放API网关实践(一)》中的接口设计提到timestampnonce两个参数的作用是用来防重放. 本文就重放攻击及其防御进行探讨. 先抛出两个问题:

  • 什么是重放攻击
  • 如何防御重放攻击

什么是重放攻击(Replay Attacks)

什么是重放, 先举个例子:

打开浏览器的调试工具并访问一个网站, 在网络工具中找到一个请求并右键选择Replay. 如图:

上述的重放操作是接口调试中比较常用的手段, 这种操作可以让我们跳过认证信息的生成过程, 直接重复发起多次有效的请求.

重放攻击是一种黑客常用的攻击手段, 又称重播攻击回放攻击, 是指攻击者发送目的主机已接收过的数据, 以达到欺骗系统的目的, 主要用于身份认证过程, 破坏认证的正确性.

举个易懂的例子:

  • 服务端提供了打款接口, 用户A向服务端请求发起一次打款5元的操作(附带了签名并进行了加密), 服务端接收到了数据并正确打款给用户B.
  • 但这个请求被黑客拦截到(可能就是用户B干的 ( ̄▽ ̄)"), 黑客将请求原封不动地向服务器发送, 服务器多次错误地打款给用户B. (当然, 这些都是是建立在服务端的付款没做幂等等防范措施、安全级别较低的前提下)
  • 尽管A发起的请求有签名和加密, 但B无需破解这个数据, 只是将同样的数据重复发给服务器就能达到欺骗的目的.

模拟重放攻击

实验器材

序号名称数量备注
1服务器210.33.30.101 - 真实服务器10.33.30.100 - 伪造服务器
2域名1replay-test.piaoruiqing.com (10.33.30.101)
3DNS服务器1用来模拟DNS劫持

实验步骤

1.启动服务器, 请求接口并收到响应数据.
2.劫持DNS(在路由器中修改DNS服务器地址模拟劫持), 并拦截请求数据.
3.向服务器重复发送拦截到的数据(重放攻击).

过程记录

准备工作

DNS配置, 将域名replay-test.piaoruiqing.com指向内网中服务器的IP. 并启动服务器.

正常请求

使用postman发起一个正常的请求, 其中签名已在Pre-request-script中生成.

通过DNS劫持来拦截数据

修改内网的dnsmasq配置, 将域名replay-test.piaoruiqing.com指向伪造的服务器10.33.30.100.

此时向replay-test.piaoruiqing.com发起的请求便会被发送到伪造的服务器上(10.33.30.100), 手动将请求的数据保存下来. 由于请求带有签名, 且攻击者并没有拿到私钥, 故无法篡改请求, 但可以进行重放攻击. 如图, 伪造服务器已成功接收到请求数据:

**[版权声明]**本文发布于朴瑞卿的博客, 允许非商业用途转载, 但转载必须保留原作者朴瑞卿 及链接:blog.piaoruiqing.com. 如有授权方面的协商或合作, 请联系邮箱: piaoruiqing@gmail.com.

重放请求

使用上一步保存下来的数据, 直接向真实服务器发送请求(带有签名数据). 如图:

事实上, 签名、加密等手段并不能防御重放攻击, 因为攻击者拦截到的数据已是正确的请求数据, 即使无法破解其内容, 也可以重放向服务器发送原数据以达到欺骗的目的.

如何防御重放攻击

百度百科

1.加随机数: 该方法优点是认证双方不需要时间同步,双方记住使用过的随机数, 如发现报文中有以前使用过的随机数, 就认为是重放攻击. 缺点是需要额外保存使用过的随机数, 若记录的时间段较长, 则保存和查询的开销较大.2.加时间戳: 该方法优点是不用额外保存其他信息. 缺点是认证双方需要准确的时间同步, 同步越好, 受攻击的可能性就越小. 但当系统很庞大, 跨越的区域较广时, 要做到精确的时间同步并不是很容易.3.加流水号: 就是双方在报文中添加一个逐步递增的整数, 只要接收到一个不连续的流水号报文(太大或太小), 就认定有重放威胁. 该方法优点是不需要时间同步, 保存的信息量比随机数方式小. 缺点是一旦攻击者对报文解密成功, 就可以获得流水号, 从而每次将流水号递增欺骗认证端.在实际使用中, 常将1和2结合使用, 时间戳有效期内判断随机数是否已存在, 有效期外则直接丢弃.

重放攻击防御实践

我们采取时间戳+随机数的方式来实现一个简单的重放攻击拦截器. 时间戳和随机数互补, 既能在时间有效范围内通过校验缓存中的随机数是否存在来分辨是否为重放请求, 也能在缓存失效后(缓存有效时间和时间范围一致)通过时间戳来校验该请求是否为重放. 如图:

代码如下:

@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)); 
  • (一): 请求时间超出时间范围的将被拒绝.
  • (二): 缓存过期时间等于有效时间的跨度, 若缓存中已存在该随机数, 则拒绝.

结语

重放攻击防御的关键点:

  • 记录请求标识并缓存, 接受请求时校验, 拒绝重放, 即将nonce存入缓存, 拒绝相同的nonce
  • 随机数的方式可能造成过多的缓存, 故需要配合时间戳进行过滤, 时间戳不在有效范围内的一律拒绝.

重放攻击是一种常用且有效的攻击手段, 其危害不可忽视, 尽管可以通过业务层面来保障数据的正确性, 但依旧会给系统造成不必要开销, 在网关层过滤掉重放请求是一个不错的选择.

如果这篇文章对您有帮助,请点个赞吧 ( ̄▽ ̄)"

学习计划

那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:

阶段一:初级网络安全工程师

接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。

综合薪资区间6k~15k

1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?

阶段二:中级or高级网络安全工程师(看自己能力)

综合薪资区间15k~30k

7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。

零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;

Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完

用Python编写漏洞的exp,然后写一个简单的网络爬虫

PHP基本语法学习并书写一个简单的博客系统

熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)

了解Bootstrap的布局或者CSS。

阶段三:顶级网络安全工程师

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值