CC攻擊&TCP和UDP正確打開姿勢
引言:
1:CC攻擊是正常的業(yè)務邏輯,大并發(fā)讓你處理不過來,處理XP SP2,以上的系統(tǒng)都封了RAW格式協(xié)議封包自定義,除了基于應用層改協(xié)議,之外都是模擬或請求來測試傳輸層
2:UDP不會粘包,不會少包,除非緩存區(qū)滿
3:TCP主要特征有:
UDP主要特征有:
- 包傳輸方式
- 無粘包錯包
- 且無連接,無擁塞控制,無重傳機制
4:TCP主要特征有:
1.3次握手連接:
一測試用例:壓力機在請求大量握手鏈接后迅速關(guān)閉,需要大并發(fā)操作
一測試邏輯點:測試服務端底層邏輯關(guān)閉socket的同時,又來新的socket鏈接請求,服務端底層邏輯這部分是否處理正常
我測試的項目BUG:創(chuàng)建ID為5000的socket端口后,由于壓力機關(guān)閉socket,導致服務端回收這個ID為5000的SOCKET,新來的TCP連接請求,由于5000的釋放又使用上這個SOCEKT,這時服務端報錯:新的SOCKET無法使用
二測試用例:壓力機在請求大量握手鏈接,需要大并發(fā)操作
二測試邏輯點:測試服務端連接SOCKET數(shù)量,以保證服務端有可用的SOCKET資源分配,
我測試的項目BUG:服務端創(chuàng)建5000個SOCKET后無法創(chuàng)建成功,因配置的JAVA內(nèi)存不夠及系統(tǒng)開放的端口數(shù)不夠
上述兩點的測試工具實現(xiàn):只有IOCP和AIO底層測試驗證最有效,測試同時觀察在 N并發(fā)/秒 得出瓶頸拐點
5:4次揮手斷開:
測試用例:壓力機設置SOCKET選項,在請求大量握手鏈接后迅速關(guān)閉,需要大并發(fā)操作
- //快速關(guān)閉socket
- ::setsockopt(pUsoc, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(bool));//復用端口
- ::setsockopt(pUsoc, SOL_SOCKET, SO_DONTLINGER, (const char*)&off, sizeof(bool));//打開LINGER
- ::setsockopt(pUsoc, SOL_SOCKET, SO_LINGER, (const char*)&m_sLinger, sizeof(linger));//設置強制關(guān)閉SOCKET
測試邏輯點:測試因壓力機器人修改Socket配置,客戶端主動斷開,服務端無法得到4次揮手的通知包,導致需要N時間節(jié)點才關(guān)閉Socket/不關(guān)閉Socket
項目測試BUG:因無法得到4次揮手包,服務端存在大量異常長連接,導致拒絕服務
6:擁塞控制-簡單理解為,堵死汽車排氣孔,同時踩油門
測試用例:壓力機客戶端設置1字節(jié)接受協(xié)議或1字節(jié)緩存區(qū),同時請求需要響應的大數(shù)據(jù):例如排行榜
測試邏輯點:由于擁塞控制特殊性,TCP會開辟內(nèi)存緩存這部分數(shù)據(jù),簡單說,服務端產(chǎn)生的協(xié)議多,但有效發(fā)出的少,系統(tǒng)緩存剩余協(xié)議越來越多,硬件監(jiān)控服務端內(nèi)存暴漲
項目測試BUG:同上,設置好SOCKET參數(shù)后,請求排行榜數(shù)據(jù),服務端內(nèi)存暴漲,直接崩潰
7:重傳控制
測試用例:搭建測試代理工具,對包傳輸順序/丟包進行參數(shù)配置轉(zhuǎn)發(fā)
測試邏輯點:由于重傳的特殊性是傳輸層控制,所以在應用層模擬丟包和亂序請求
大家常用的kugou音樂的APP通過工具模擬重傳控制,在試聽音樂的時候,進行丟包和亂序測試,APP崩潰
8:流傳輸方式,內(nèi)容比較多,慢慢看
測試用例:協(xié)議粘包 - 通過代理工具自動*N倍,既123變123123123123123123
測試邏輯點:
1)測試服務端可分割的數(shù)據(jù)包上限,
2)測試服務端是否并發(fā)執(zhí)行協(xié)議,如領(lǐng)取任務、購買物品、創(chuàng)建角色等等
項目BUG:創(chuàng)建N個123角色在數(shù)據(jù)庫中,且完整協(xié)議分割上限為4,后期調(diào)至20份/Max緩存區(qū)
測試用例:協(xié)議少包 - 通過工具1字節(jié)發(fā)送
- 1)高速
- 2)慢速
測試邏輯點:
1)高速發(fā)送1字節(jié),服務端讀取處理協(xié)議,來消耗CPU資源,
2)占用服務端緩存區(qū)長時間消耗資源,以上2點測試服務端對協(xié)議讀取健壯性
測試用例:服務端私有協(xié)議 - 構(gòu)造異常數(shù)據(jù)及有效數(shù)據(jù)進行測試
測試邏輯點:
1)有效數(shù)據(jù)
- 包體 - 這里用的有效數(shù)據(jù)既為超大包體,如喊話等可變協(xié)議,超過服務端緩存器上限
- 協(xié)議接口 - 對于已知的服務端協(xié)議響應接口遍歷,遍歷測試是否有未開放的或頻繁調(diào)用
- 協(xié)議參數(shù) - A使用B的參數(shù)如用戶ID、數(shù)值類的:0 負數(shù) 邊界值 正數(shù)溢出
2)異常數(shù)據(jù)
- 包體 - 修改包體邊界值或自定義數(shù)據(jù),既包體過短或超長數(shù)值
- 協(xié)議接口 - 遍歷服務端接口,既不存在的接口,自動+N修改
- 協(xié)議參數(shù) - 遍歷字節(jié)既協(xié)議自動+N修改
- 特殊協(xié)議 - 及發(fā)送非正常的協(xié)議如1字節(jié) 00 11 22 33 - FF
項目BUG:
1)協(xié)議包體:移動協(xié)議修改包體數(shù)據(jù),包體修改為8字節(jié),既無協(xié)議接口的參數(shù),服務端報錯崩潰
2)協(xié)議參數(shù):
- A用戶使用B用戶ID登陸,強制踢B下線、
- 購買數(shù)量*金額超服務端變量上限,數(shù)值溢出倒貼錢給玩家、
- 負數(shù)不用多說,賣東西-1,多送一件給玩家、
- 有除法計算的地方使用0數(shù)值,服務端崩潰
3)協(xié)議接口:
- 副本調(diào)用怪自爆協(xié)議,秒殺所有怪、
- 角色在監(jiān)獄中調(diào)用傳送接口越獄
- 攻擊類,并發(fā)N/秒請求大數(shù)據(jù)的協(xié)議接口,服務端內(nèi)存Cpu暴漲,后期限制請求頻率
10:UDP主要特征有:包傳輸、無粘包、錯包、無連接,無擁塞控制、無重傳機制
測試用例:
應用層
1)協(xié)議測試同TCP
2)大并發(fā)請求(性能測試同TCP)
測試邏輯點:
1)由于傳輸層無特殊處理,即傳輸層在協(xié)議測試上只有丟包、亂序、延遲等3項,測試方案同TCP的測試用例
2)應用層的方案延用TCP中測試用例:
- 有效數(shù)據(jù)
- 異常數(shù)據(jù)
1)有效數(shù)據(jù)
包體 - 這里用的有效數(shù)據(jù)既為超大包體,如喊話等可變協(xié)議,超過服務端緩存器上限
2)異常數(shù)據(jù)
包體 - 修改包體邊界值或自定義數(shù)據(jù),既包體過短或超長數(shù)值