本文由紅日安全成員: 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/
添加圖片驗證碼,爲了應對偏爆破類的重放***,添加驗證字段是最簡單有效的手段。固然你要保證驗證是在一次使用後及時失效。
限制請求次數,有些地方並不適用於添加驗證碼,或者不能添加驗證碼。這時候針對同一帳戶的錯誤次數限制就顯得頗有必要。例如,當錯誤次數連續達到五次的時候,暫時十分鐘內不能登錄。
效驗驗證碼和用戶身份,某些重放***是利用了手機號和驗證碼之間的不對應性,特別是在修改密碼等處,這時候須要把驗證碼和請求的用戶手機號作聯繫,當重放或者越權的時候根據驗證碼次數和對應關係來判斷是否容許修改。