[紅日安全]Web安全Day10 - 重放攻擊實戰攻防

1. 漏洞簡介

​ 首先簡單看一下百度百科對重放攻擊的簡介:重放攻擊(Replay Attacks)又稱重播攻擊、回放攻擊,是指攻擊者發送一個目的主機已接收過的包,來達到欺騙系統的目的,主要用於身份認證過程,破壞認證的正確性。重放攻擊可以由發起者,也可以由攔截並重發該數據的敵方進行。攻擊者利用網絡監聽或者其他方式盜取認證憑據,之後再把它重新發給認證服務器。

2. 漏洞原理

​ 重放攻擊的基本原理就是把以前竊聽到的數據原封不動地重新發送給接收方。很多時候,網絡上傳輸的數據是加密過的,此時竊聽者無法得到數據的準確意義。但如果他知道這些數據的作用,就可以在不知道數據內容的情況下通過再次發送這些數據達到愚弄接收端的目的。

3. 漏洞危害

​ 重放攻擊本身只是一種行爲和方式,並不會直接造成系統的危害,可能在某些系統中,過多和高頻次的重複會對系統造成壓力。重放攻擊的重要點在於重放的是可以造成目的效果的數據包,從而達到修改和多次執行的效果。

重放攻擊主要是針對系統沒有效驗請求的有效性和時效性,對於多次請求執行,系統將多次響應。在重放攻擊利用最多的形式中,短信轟炸算是重放攻擊最直接的利用表現。

4. 常見漏洞類型

1. 短信轟炸

​ 短線轟炸算是重放攻擊中最爲直接的利用形式,當系統端沒有效驗請求的時間差或者只在前端做請求限制的時候,可以無限的請求短信來達到短信轟炸的目的。例如,如下APP請求註冊時可以使用手機號和驗證碼註冊登錄,但是沒有限制短信請求次數和時間間隔。

img

多次請求後可以在手機上看到請求到的短信

img

2. 暴力破解

​ 暴力破解是重放攻擊中,典型的非只重放而達到的攻擊類型,而是利用重放這個動作來達到暴力破解的目的。當系統端未做請求驗證和錯誤次數限制時,就可以根據字典或者設定的字符串來破解特定的參數。

a. 暴力破解密碼

​ 當用戶登陸時,缺少驗證碼或者驗證碼不失效,並且賬號沒有錯誤的次數限制。可以通過暴力破解碰撞密碼來登錄。例如此處,暴力破解原密碼來登陸綁定賬號。

img

此處驗證碼只判斷是否存在,並不失效,且可以多次嘗試綁定賬號,例如如下,當返回爲1的時候就是密碼正確,綁定成功。

img

b. 暴力破解驗證碼

​ 當我們申請修改賬號密碼等操作時,往往需要給手機號或者郵箱發送一個驗證碼,當需要修改他們或者越權操作的時候並不一定可以通過修改接收手機或郵箱來收到驗證碼,這時候可以嘗試暴力破解驗證碼。例如:

對此請求多次重放後發現仍然返回修改密碼失敗,說明驗證碼可以多次使用,這種情況下很有可能是驗證碼在沒有正確驗證使用時,後臺並不會失效。那麼我們嘗試爆破驗證碼,如果成功將修改賬號密碼。

img

c. 暴力破解參數

​ 此情況大都在嘗試越權的時候,還有嘗試修改某些不可知但是可預測的參數,例如此篇文章:

重置憑證可暴破

d. 暴力破解hash密碼

​ 此種暴力破解類似破解密碼,但此種一般不需要考慮某些驗證條件,常在獲取到主機權限後,利用hash抓取工具獲得,例如Windows平臺的hash抓取工具:mimikaze, pwdump7等。獲取到Windows的NTLM。

Administrator:500:aad3b435b51404eeaad3b435b51404ee:44f077e27f6fef69e7bd834c7242b040:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

常見的爆破工具:OphrackJohn the Ripperhashcat

這種方式都需要提前準備彩虹表,當然kail上也有集成,同時也有默認字典。

3. 重放支付

​ 這種情況往往出現在支付訂單的時候,支付到最後一個請求包時,系統收到請求就會確定已支付下單。這時候在系統沒有做出準確效驗的時候就會根據是否支付成功的驗證字段來確定下單,多次重放的時候,系統會根據暫無失效且正常的請求下單。來達到使用同一請求多次獲取成功的訂單。

​ 但這種情況,現在已經很少會遇到,上一次遇到還要追溯到去年初了。

4. 重放修改密碼

​ 在很多時候,我們修改密碼等操作的時候,是分幾步完成的,例如先驗證手機驗證碼,跳轉在修改密碼。如果在最後確認修改的時候抓包多次重放,可以達到免驗證來達到修改密碼的作用。也就是這裏並沒有強制效驗手機號和驗證碼。也就存在了任意修改密碼的可能,當然要是效驗了手機號和驗證碼的對應關係,也許就不可以了。

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 protected]&code=123456

有些系統在重置密碼的時候並不是需要各種驗證,而是你申請修改就會給你發送重置的密碼到你的註冊郵箱。例如如上數據包,當驗證存在郵箱的時候,只需要輸入圖片驗證碼就會發送已經被重置的新密碼到指定郵箱。這時候雖然我們不能獲取密碼,但是缺少驗證的方式可導致其他賬號密碼被重複修改,而影響他人的登陸。真可謂損人不利己的好用處。233333

5. 條件競爭

條件競爭是後臺對共享數據讀寫的時候,多線程沒有對共享數據執行線程鎖,導致在多個線程獲取到的值並不是當前線程操作的實時值,典型的例子是,一份錢買多份。

例如去年護網杯的Itshop,此處給出WP以便參考:https://www.codercto.com/a/31463.html

5. 漏洞靶場

漏洞環境:Django2.2、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())

img

抓包登陸,在沒有驗證碼,且csrf_token在沒有起到唯一性的時候,可以通過爆破密碼登陸。

img

把數據包丟到Intruder中,多次爆破後發現當密碼正確的時候會產生302的跳轉。

img

漏洞修復:添加驗證碼,雖然此處可以添加框架自帶的驗證碼,但建議使用請求式驗證碼。如不能使用驗證碼也可以給賬號登陸錯誤次數做一次限制。

6. 漏洞測試工具

重複攻擊一般採用可以抓包的工具都可以重複,例如:Charles、burp等。此處較爲常用burp。因爲在payload上,處理較爲靈活,當然如果需要的只是重放,Charles應該不會讓你失望。

burp: https://portswigger.net/burp

img

Charles:https://www.charlesproxy.com/

img

7. 漏洞修改

  1. 添加圖片驗證碼,爲了應對偏爆破類的重放攻擊,添加驗證字段是最簡單有效的手段。當然你要保證驗證是在一次使用後及時失效。
  2. 限制請求次數,有些地方並不適用於添加驗證碼,或者不能添加驗證碼。這時候針對同一賬戶的錯誤次數限制就顯得很有必要。例如,當錯誤次數連續達到五次的時候,暫時十分鐘內不能登陸。
  3. 效驗驗證碼和用戶身份,某些重放攻擊是利用了手機號和驗證碼之間的不對應性,特別是在修改密碼等處,這時候需要把驗證碼和請求的用戶手機號做聯繫,當重放或者越權的時候根據驗證碼次數和對應關係來判斷是否允許修改。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章