首页 > 编程知识 正文

数据包重放攻击,功能实现方案

时间:2023-05-04 00:42:43 阅读:156909 作者:464

最近,在系统上线之前需要进行安全测试。 安全测试人员指出系统存在重放攻击。 以前的项目中没有遇到过这样的问题,所以现在我们将详细讨论重放攻击。

重放攻击是指攻击者为了欺骗系统的目的而发送目标主机收到的数据包,主要用于身份验证过程。 攻击者利用网络监听等窃取认证证书,并将其重新发送到认证服务器。 从该说明可以理解,加密可以有效地防止会话劫持,但不能防止重放攻击。 在网络通信过程中可能会发生重放攻击。

1、基于timestamp的计划必须为每个HTTP请求添加timestamp参数,并对timestamp和其他参数进行数字签名。 由于通常的HTTP请求从发出到到达服务器通常不超过60s,所以服务器在接收到HTTP请求后,首先判断时间戳参数与当前时刻相比是否超过60s,如果超过,则判断为是非法的请求

如果黑客通过抓住包得到了我们的请求url :

http://clang.tech/index/Info? uid=zx 07 stime=1480862753 sign=80b 886 d 71449 CB

其中

stringsign=MD5(uid,token,stime ); 一般来说,黑客从破解程序播放请求的时间远远超过60秒,因此此时请求的stime参数已禁用。

如果黑客将stime参数更改为当前时间戳,则与sign参数相对应的数字签名将失效。 这是因为黑客不知道token值,因此无法生成新的数字签名。

但是,这种方式的漏洞也很明显,如果在60s以内进行重放攻击,就没办法了,所以这种方式不能保证请求只有效一次。

2、基于nonce的方案nonce意味着一次有效的随机字符串,使得这个参数一般与时间戳相关,以便确保每次请求时这个参数不同。 这里为了方便起见,可以直接使用时间戳的16进制,实际使用时加入客户的ip地址、mac地址等信息进行散列化后,作为nonce参数。

可以将每个请求的nonce参数保存在“集合”中,并以json格式保存在数据库或高速缓存中。

每次处理HTTP请求时,首先判断该请求的nonce参数是否在其“集合”中,如果有,则视为非法请求。

如果黑客通过抓住包得到了我们的请求url :

http://clang.tech/index/Info? uid=zx 07 nonce=58442 c21 sign=80b 886 d 71449 CB

其中

stringsign=MD5(uid,token,nonce ); 这种方式也有很大的问题。 那就是,存储nonce参数的“集合”越来越大,验证nonce中是否存在“集合”需要时间。 我们不能让nonce“集合”无限大,所以有必要定期清理那个“集合”。 但是,清理其“集合”后,将无法验证已清理的nonce参数。 也就是说,假设这个“集合”平均每天打扫一次,我们抓住的这个url现在不能进行重放攻击,但是可以每隔一天进行重放攻击。 另外,在24小时内保存所有请求的“nonce”参数也是一个很大的开销。

3、在基于timestamp和nonce的计划中,同时使用timestamp和nonce参数怎么样?

nonce的一次性使用可以解决timestamp参数60s的问题,timestamp可以解决nonce参数“集合”越来越大的问题。

在timestamp方案中添加了nonce参数。 timstamp参数被视为超过60s的请求的非法请求,因此只需存储60 s nonce参数的“集合”。

如果黑客通过抓住包得到了我们的请求url :

http://clang.tech/index/Info? uid=zx 07 stime=1480862753 nonce=58442 c21 sign=80b 886 d 71449 CB

其中

stringsign=MD5(uid,token,stime,nonce ); 在60秒内播放此HTTP请求时,nonce参数已在第一次请求时记录在服务器的nonce参数“集合”中,因此被认为是非法请求。 超过60s时,stime参数无效。 此时,黑客不知道token的值,因此无法重新生成签名。

基于以上考虑,正常的HTTP请求发送没有超过60秒,60秒以内的重播攻击可以在nonce参数中得到保证,超过60秒的重播攻击可以在stime参数中得到保证。

nonce参数只在60s以内起作用,所以保存60s以内的nonce参数即可。

不一定需要每60s清理其nonce参数的集合,而只要在新的nonce到来时,确定上次修改nonce集合的时间,并在超过60s时,清空该集合并存储新的nonce参数集合即可。 实际上,nonce参数的集合可以保存更长时间,但至少60s。

随机数集可以根据业务场景定期清理,也可以采用根据大小自动清理的方式。 例如,如果此接口每秒的请求数最多为1000,60 s内的请求数最多为1500*60=90000,则检查每个请求的集大小是否超过90000,否则为空。

验证过程:

确定stime参数是否有效的if($now-$stime60 ) die (“请求超时”); 确定nonce参数是否在“集合”中已经存在if (in _ array (nonce,$nonceArray ) ) die )“请求只有效一次”); //验证数字签名if(sign )!=MD5($uid.$Token.$stime.$nonce ) ) die )“数字签名验证失败”); }/* if ($ now-$ nonce array-last modify time 60 ) ) { $nonceArray=null; }$nonceArray.push($nonce; //要处理随机数的$key='nonce' $uid; if($Redis-sismember ) $key,$nonce )===true ) )拒绝重放攻击请求); }if($Redis-Scard ) $ key (90000 ) ) $ redis-del ($ key ); }$Redis-sadd($key,$nonce ); //重放攻击检查完成Clang的技术博客: https://blog.clang.monster

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。