风险级别: 高风险
风险描述: 攻击者发送一个目标主机已经接收的数据包,特别是在认证过程中,用于认证用户身份时;
风险分析: 攻击者可以使用重放攻击方式伪装成用户,冒充用户身份进行一系列操作;
重放攻击(Replay Attacks):
又称重播攻击、回放攻击;是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的;
抓包工具拦截并克隆你的请求,用克隆后的请求访问你的后台;
抓包工具可以克隆请求的所有内容(url,data,cookie,session,header等等)
重放攻击的方法如下:可使用burpsuit工具,挂上代理,抓包抓取登录名和加密的密码后,记录下这些信息就可以进行重放攻击,再次访问登录页面时,只需要再次放出请求就可以达到登录的目的,而不需要进行用户名密码的输入。
选择拦截登录信息单机右键选择Send to Repeater进行重放攻击,接着进入Repeater选项中观察,可以看到request界面中出现了你将要重放攻击的内容,单机go按钮进行重放攻击,在response界面中会出现了页面的返回信息;
重放攻击可以由发起者、或拦截方进行。拦截方进行的重放攻击又称为中间人攻击
1. 使用场景:
主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。
请求被攻击者获取,并重新发送给认证服务器,从而达到认证通过的目的。
重放攻击的危害
请求被攻击者获取,并重新发送给认证服务器,从而达到认证通过的目的。
我们可以通过加密,签名的方式防止信息泄露,会话被劫持修改。但这种方式防止不了重放攻击。
2. 类型:
<1>. 根据重放消息的接收方与消息的原定接收方的关系,重放攻击可分为3种:第一种是直接重放,即重放给原来的验证端,直接重放的发送方和接收方均不变。第二种是反向重放,将原本发给接收方的消息反向重放给发送方。第三种是第三方重放,将消息重放给域内的其他验证端。
<2>. 考查攻击者对消息重定向,这种分类法称为目的地分类法。分类如下。(1)偏转重放攻击:重放消息重新定向,发送给不同于原接收者的第三方。这种情形可进一步分为如下子类:①重放消息重定向,发送给原发送者,称为反射重放攻击。②重放消息重定向,发送给第三方,即不同于原发送者和原接收方的第三方。(2)攻击者通过延时的方法(可能涉及不同的协议回合),将消息传送给目的地,称为直接重放攻击。
3. 主要作用:
重放攻击的主要作用如下:
巧妙实现了信息注入,不需要了解、分析通信协议;
实现了流量攻击,即通过额外增加的数据流影响正常数据流的传输时延,耗用通信链路的带宽;
实现了可能的差错攻击,一般的链路通信协议都实现流量控制功能,通过数据流重放,很可能会干扰正常的流量控制窗口和数据帧的发送(应答)序列号,导致数据重传或误收。
web页面登陆常规流程:
- web页面用户输入账号,密码 > 登录
- 请求提交前,web端首先会通过客户端脚本,如javascript对密码原文进行md5加密。
- 提交账号+md5加密后的密码
- 请求提交至后端,验证账号与密码是否与数据库中的一致,一致则认为登录成功,反之则失败。
上述流程中大家会认为由于md5的不可逆性,密码明文也不会泄露。其实仍然存在风险 !!!
监听者并不需要解密出密码明文即可登录web页面!!!监听者只需将监听到的url:
(如:http://****/login.do?method=login&password=md5之后的密码&userid=登录账号)
重放一下,即可冒充用户身份登录进入系统。
防范方法:
1.系统设置一个固定的盐值,盐值足够复杂;
2.用户注册,修改密码时,将用户的原始密码与固定盐值拼接,然后一起做md5加密运算;
3.传递到后端,保存至数据库 ;(数据库中保存的密码是用户的原始密码拼接固定盐值后,md5运算后的结果)
4.登录时,将用户的原始密码与我们的固定盐值进行拼接,然后做md5加密运算,运算后的结果再拼接上我们的随机码,再次md5加密运算 > 提交;
5.后端接收到登录请求后,从数据库中查询出的密码与session中的随机码拼接后,进行md5运算,然后与前端传递的结果进行比较;
设置机制:
加登录验证码,预防暴力登录破解;
账户锁定,如果用户密码输入错误次数达到一定次数后,则锁定该账户;
<1>加随机数
优点是认证双方不需要时间同步,双方记住使用过的随机数,如发现报文中有以前使用过的随机数,就认为是重放攻击。缺点是需要额外保存使用过的随机数,若记录的时间段较长,则保存和查询的开销较大。
单独的随机数不能避免重放攻击,随机数一般会和签名加密技术,后台验证技术混合以提高破解和重放难度。
一般随机数会用在MD5,HASH(数字签名)上,比如在对有效值进行MD5加密时添加随机数,如用户名为test,密码为test的MD5加密过程可能为MD5(“test”,“test”,随机数),这样在直接传输时不会暴露出随机值,黑客在提交重放攻击时系统发现MD5签名和系统签名计算后不同则,可被认定为重放攻击。
<2>加时间戳
优点是不用额外保存其他信息。缺点是认证双方需要准确的时间同步,同步越好,受攻击的可能性就越小;
利用时间戳进行防御,这个方法实现的前提是服务器的时间必须和用户的时间保持同步,在同一个时间,服务器和用户每隔一段时间就会更改自己的标识,用户输入登陆之后,一段时间后标识就会改变,时间戳越小越保险;
例外情况:
环境:内网环境
内网中客户端与服务端时间不好协调一致,时间戳不适用
所以我们可以使用:手机登录验证码
每次请求都要携带验证码,且验证码只能用一次,用后失效,超过60秒验证码也要失效;
思路:两次请求,第一次拿验证码,第二次携带验证码访问后台,获取数据,且两个请求必须串行;
<3>加流水号
双方在报文中添加一个逐步递增的整数,只要接收到一个不连续的流水号报文(太大或太小),就认定有重放威胁。缺点是一旦攻击者对报文解密成功,就可以获得流水号,从而每次将流水号递增欺骗认证端。
<4>Https防重放攻击
对于https,每个socket连接都会验证证书,交换密钥。攻击者截获请求,重新发送,因为socket不同,密钥也不同,后台解密后是一堆乱码,所以https本身就是防止重放攻击的,除非能复制socket,或者进行中间人攻击。
使用验证码后,也可能会被抓包进行重放攻击,我么可以使用增加session方法:
生成验证码后,增加session保存生成的随机数,校验验证码后,一旦进入后台,不管校验成功或者失败,均需要session.removeAttribute(“变量名”);
认证重放攻击主要用于用户认证与用户登录方面,对于web页面没有此类限制的网站,攻击者可能会使用重放漏洞模拟正常用户进行登录,侵犯用户隐私安全,所以一般来说,web登录页面加入时间戳,加入验证码盐值加密是十分有效的;
https://www.cnblogs.com/20179203li/p/7909273.html
https://www.cnblogs.com/feng9exe/p/8127165.html
https://www.cnblogs.com/feng9exe/p/8119458.html
https://blog.csdn.net/heluan123132/article/details/74375304