本文由红日安全成员: misakikata 编写,若有不当,还望斧正。html
你们好,咱们是红日安全-Web安全***小组。此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供你们练习,咱们给这个项目起了一个名字叫 Web安全实战 ,但愿对想要学习Web安全的朋友们有所帮助。每一篇文章都是于基于漏洞简介-漏洞原理-漏洞危害-测试方法(手工测试,工具测试)-靶场测试(分为PHP靶场、JAVA靶场、Python靶场基本上三种靶场所有涵盖)-实战演练(主要选择相应CMS或者是Vulnhub进行实战演练),若是对你们有帮助请Star鼓励咱们创做更好文章。若是你愿意加入咱们,一块儿完善这个项目,欢迎经过邮件形式(sec-redclub@qq.com)联系咱们。前端
首先简单看一下百度百科对重放***的简介:重放***(Replay Attacks)又称重播***、回放***,是指***者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放***能够由发起者,也能够由拦截并重发该数据的敌方进行。***者利用网络监听或者其余方式盗取认证凭据,以后再把它从新发给认证服务器。python
重放***的基本原理就是把之前窃听到的数据原封不动地从新发送给接收方。不少时候,网络上传输的数据是加密过的,此时窃听者没法获得数据的准确意义。但若是他知道这些数据的做用,就能够在不知道数据内容的状况下经过再次发送这些数据达到愚弄接收端的目的。web
重放***自己只是一种行为和方式,并不会直接形成系统的危害,可能在某些系统中,过多和高频次的重复会对系统形成压力。重放***的重要点在于重放的是能够形成目的效果的数据包,从而达到修改和屡次执行的效果。安全
重放***主要是针对系统没有效验请求的有效性和时效性,对于屡次请求执行,系统将屡次响应。在重放***利用最多的形式中,短信轰炸算是重放***最直接的利用表现。服务器
短线轰炸算是重放***中最为直接的利用形式,当系统端没有效验请求的时间差或者只在前端作请求限制的时候,能够无限的请求短信来达到短信轰炸的目的。例如,以下APP请求注册时可使用手机号和验证码注册登陆,可是没有限制短信请求次数和时间间隔。网络
屡次请求后能够在手机上看到请求到的短信session
暴力破解是重放***中,典型的非只重放而达到的***类型,而是利用重放这个动做来达到暴力破解的目的。当系统端未作请求验证和错误次数限制时,就能够根据字典或者设定的字符串来破解特定的参数。多线程
当用户登录时,缺乏验证码或者验证码不失效,而且帐号没有错误的次数限制。能够经过暴力破解碰撞密码来登陆。例如此处,暴力破解原密码来登录绑定帐号。app
此处验证码只判断是否存在,并不失效,且能够屡次尝试绑定帐号,例如以下,当返回为1的时候就是密码正确,绑定成功。
当咱们申请修改帐号密码等操做时,每每须要给手机号或者邮箱发送一个验证码,当须要修改他们或者越权操做的时候并不必定能够经过修改接收手机或邮箱来收到验证码,这时候能够尝试暴力破解验证码。例如:
对此请求屡次重放后发现仍然返回修改密码失败,说明验证码能够屡次使用,这种状况下颇有多是验证码在没有正确验证使用时,后台并不会失效。那么咱们尝试爆破验证码,若是成功将修改帐号密码。
此状况大都在尝试越权的时候,还有尝试修改某些不可知可是可预测的参数,例如此篇文章:
此种暴力破解相似破解密码,但此种通常不须要考虑某些验证条件,常在获取到主机权限后,利用hash抓取工具得到,例如Windows平台的hash抓取工具:mimikaze, pwdump7等。获取到Windows的NTLM。
Administrator:500:aad3b435b51404eeaad3b435b51404ee:44f077e27f6fef69e7bd834c7242b040::: Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
常见的爆破工具:Ophrack、John the Ripper、hashcat
这种方式都须要提早准备彩虹表,固然kail上也有集成,同时也有默认字典。
这种状况每每出如今支付订单的时候,支付到最后一个请求包时,系统收到请求就会肯定已支付下单。这时候在系统没有作出准确效验的时候就会根据是否支付成功的验证字段来肯定下单,屡次重放的时候,系统会根据暂无失效且正常的请求下单。来达到使用同一请求屡次获取成功的订单。
但这种状况,如今已经不多会遇到,上一次遇到还要追溯到去年初了。
在不少时候,咱们修改密码等操做的时候,是分几步完成的,例如先验证手机验证码,跳转在修改密码。若是在最后确认修改的时候抓包屡次重放,能够达到免验证来达到修改密码的做用。也就是这里并无强制效验手机号和验证码。也就存在了任意修改密码的可能,固然要是效验了手机号和验证码的对应关系,也许就不能够了。
POST /userpwd?p=1 HTTP/1.1 Host: xxx.com phone=13111111111&code=123456
当咱们如上的去请求验证码效验的时候,若是经过会跳往第二个页面修改密码
POST /userpwd?p=2 HTTP/1.1 Host: xxx.com phone=13111111111&pwd=123456&newpwd=123456
当只是简单的重置的时候,先不谈越权问题,这个包均可能形成屡次修改屡次重置密码。而并不用验证。
POST /userpwd?p=2 HTTP/1.1 Host: xxx.com phone=13111111111&code=123456&pwd=123456&newpwd=123456
在修改密码的时候遇到也携带了其余的参数,例如以前的短信验证字段,那么就不必定会形成越权,但可能会有屡次重放修改密码的可能。这时候若是须要修改他人密码,就须要爆破验证码来达到效果。这就回到了暴力破解中的验证码爆破。
POST /userpwd HTTP/1.1 Host: xxx.com email=qq@qq.com&code=123456
有些系统在重置密码的时候并非须要各类验证,而是你申请修改就会给你发送重置的密码到你的注册邮箱。例如如上数据包,当验证存在邮箱的时候,只须要输入图片验证码就会发送已经被重置的新密码到指定邮箱。这时候虽然咱们不能获取密码,可是缺乏验证的方式可致使其余帐号密码被重复修改,而影响他人的登录。真可谓损人不利己的好用处。233333
条件竞争是后台对共享数据读写的时候,多线程没有对共享数据执行线程锁,致使在多个线程获取到的值并非当前线程操做的实时值,典型的例子是,一份钱买多份。
例如去年护网杯的Itshop,此处给出WP以便参考:https://www.codercto.com/a/31463.html
漏洞环境:Django2.二、python3
此处利用的是以前写的一个bug平台,当验证会提示以下时,能够根据提示的不一样来判断密码是否正确,当密码正确的时候就会跳转到内部页面。
def login(request): if request.method == 'POST': login_form = forms.UserForm(request.POST) message = '请检查填写的内容!' if login_form.is_valid(): username = login_form.cleaned_data.get('username') password = login_form.cleaned_data.get('password') try: user = models.User.objects.get(name=username) except : message = '用户不存在!' return render(request, 'login/login.html', locals()) if user.password == password: request.session['is_login'] = True request.session['user_id'] = user.id request.session['user_name'] = user.name return redirect('/index/') else: message = '密码不正确!' return render(request, 'login/login.html', locals()) else: return render(request, 'login/login.html', locals()) login_form = forms.UserForm() return render(request, 'login/login.html', locals())
抓包登录,在没有验证码,且csrf_token在没有起到惟一性的时候,能够经过爆破密码登录。
把数据包丢到Intruder中,屡次爆破后发现当密码正确的时候会产生302的跳转。
漏洞修复:添加验证码,虽然此处能够添加框架自带的验证码,但建议使用请求式验证码。如不能使用验证码也能够给帐号登录错误次数作一次限制。
重复***通常采用能够抓包的工具均可以重复,例如:Charles、burp等。此处较为经常使用burp。由于在payload上,处理较为灵活,固然若是须要的只是重放,Charles应该不会让你失望。
burp: https://portswigger.net/burp
Charles:https://www.charlesproxy.com/
添加图片验证码,为了应对偏爆破类的重放***,添加验证字段是最简单有效的手段。固然你要保证验证是在一次使用后及时失效。
限制请求次数,有些地方并不适用于添加验证码,或者不能添加验证码。这时候针对同一帐户的错误次数限制就显得颇有必要。例如,当错误次数连续达到五次的时候,暂时十分钟内不能登录。
效验验证码和用户身份,某些重放***是利用了手机号和验证码之间的不对应性,特别是在修改密码等处,这时候须要把验证码和请求的用户手机号作联系,当重放或者越权的时候根据验证码次数和对应关系来判断是否容许修改。