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