突破神奇的Cloudflare防火墻的網(wǎng)絡(luò)安全學(xué)習(xí)
背景
最近碰到一個神奇的網(wǎng)站,在瀏覽器可以打開,但是通過 curl 或者 代碼訪問就直接 403,我估摸著這肯定是做了UA校驗(yàn)
,于是請求的時候把瀏覽器的 UA 給帶上,然后訪問發(fā)現(xiàn)還是 403,不過這也難不倒我,肯定是還有校驗(yàn)其它的請求頭,直接瀏覽器打開 network,把所有的請求頭復(fù)制過來并且?guī)?,確保我和瀏覽器在 http 協(xié)議層面的請求完全一樣,這樣不可能會失敗了吧,然而運(yùn)行完發(fā)現(xiàn)還是 403。
放個地址: https://pixabay.com
思考
服務(wù)端校驗(yàn)客戶端沒有什么黑魔法,因?yàn)槎际峭ㄟ^ TCP 協(xié)議通訊,不可能存在瀏覽器發(fā)送一個 HTTP 報文和我發(fā)送一個同樣的 HTTP 報文服務(wù)器能識別出來,既然不是校驗(yàn)的 HTTP 層,那只可能是在 TLS 層校驗(yàn)的,于是祭出wireshark
抓包,看看能不能找到 TLS 握手中差異化的東西,眾所周知在 TLS 握手時有一個客戶端發(fā)送給服務(wù)端的Client Hello
報文,很有可能就是根據(jù)它來辨別瀏覽器和非瀏覽器請求的,因?yàn)樵谶@個報文中,客戶端要告訴服務(wù)端支持的加密套件,TLS 版本等等信息,而這些信息根據(jù)客戶端的實(shí)現(xiàn)都會有所差異,先抓個正常瀏覽器請求的報文看看,如下圖:
然后再通過 curl 訪問抓包,如下圖;
可以看到兩邊的報文確實(shí)存在很大的差異,逐一對比排查之后發(fā)現(xiàn)很有可能是因?yàn)?curl 的請求報文里缺少supported_versions
擴(kuò)展信息導(dǎo)致的 403,瀏覽器那邊在此擴(kuò)展信息內(nèi)容如圖:
表示支持TLSv1.2
和TLSv1.3
,而且最終握手之后的協(xié)議也是切換到了TLSv1.3
,在上面兩個對比圖可以看到,瀏覽器走的是TLSv1.3
,而 curl 走的是TLSv1.2
,可能是一定要使用TLSv1.3
才能訪問成功。
驗(yàn)證
馬上 google 了下如何指定 curl 的 TLS 版本,發(fā)現(xiàn)只需要加上--tlsv1.3
參數(shù)就可以了,如下:
$ curl -I --tlsv1.3 'https://pixabay.com/' \ > -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \ > -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.49' HTTP/2 200 date: Fri, 22 Jul 2022 02:40:35 GMT content-type: text/html; charset=utf-8 cf-ray: 72e8cffc18c73d5a-HKG cache-control: s-maxage=86400 content-language: en vary: Accept-Encoding, Cookie, Accept-Language cf-cache-status: MISS content-security-policy: frame-ancestors none expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" referrer-policy: strict-origin-when-cross-origin x-frame-options: DENY set-cookie: __cf_bm=Cy4a751rDND6kHhu.RzEr5DpqnaxRdpUxaMfNfkya0A-1658457635-0-AS1DaewDqNjWHZ/m74A88bNyEG0EFsZAwmsm/ON5QQEuh8B6XOS7PkSnhGgXPLV+LtEvzOKTy/WWHmwY63uGlD0=; path=/; expires=Fri, 22-Jul-22 03:10:35 GMT; domain=.pixabay.com; HttpOnly; Secure; SameSite=None server: cloudflare alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
經(jīng)過反復(fù)驗(yàn)證,發(fā)現(xiàn)除了要指定tlsv1.3
之外,還需要加上accept-language
和user-agent
頭,并且一定得是 http2 協(xié)議,三個條件缺一不可。
nodejs 訪問
上面說到了一定要走 http2 協(xié)議,而現(xiàn)在市面上流行的 http client 基本都是只支持 http1.1,所以只能直接從基礎(chǔ)庫入手了,官方有一個http2
的庫,一番調(diào)教之后也是成功請求了,代碼如下:
const http2 = require("http2"); function get(host, path) { return new Promise((resolve, reject) => { const session = http2.connect(`https://${host}`, { minVersion: "TLSv1.3", maxVersion: "TLSv1.3", }); session.on("error", (err) => { reject(err); }); const req = session.request({ [http2.constants.HTTP2_HEADER_AUTHORITY]: host, [http2.constants.HTTP2_HEADER_METHOD]: http2.constants.HTTP2_METHOD_GET, [http2.constants.HTTP2_HEADER_PATH]: path, "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.50", }); req.setEncoding("utf8"); let data = ""; req.on("data", (chunk) => { data += chunk; }); req.on("end", () => { session.close(); if (data) { try { resolve(data); } catch (e) { reject(e); } } }); req.on("error", (err) => { reject(err); }); req.end(); }); } (async function () { const data = await get("pixabay.com", "/"); console.log(data); })();
深入
雖然已經(jīng)成功請求了,但是本著探索的精神繼續(xù)深入發(fā)現(xiàn) cloudflare 官方有一篇博客就是專門介紹這個 TLS 攔截技術(shù)的,鏈接如下:
https://blog.cloudflare.com/monsters-in-the-middleboxes/
其中有一段內(nèi)容也證明了我的猜想,翻譯后如下:
也就是說 cloudflare 會維護(hù)一組瀏覽器的 TLS 指紋,當(dāng)收到一個 Client Hello 請求時,會檢查這組指紋,如果匹配不上,就會攔截這個請求,這樣可以攔截掉大部分不是來自瀏覽器的請求了。
以上就是突破神奇的Cloudflare防火墻的網(wǎng)絡(luò)安全學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于Cloudflare防火墻的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Web網(wǎng)絡(luò)安全漏洞分析SQL注入原理詳解
這篇文章主要為大家介紹了Web網(wǎng)絡(luò)安全漏洞分析SQL注入的原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11無線網(wǎng)攻擊工具進(jìn)攻方法及防范技巧小結(jié)
對無線網(wǎng)安全攻防有興趣的人應(yīng)該都需要一套工具,英特網(wǎng)上有很多免費(fèi)的工具。本文不求全面,但求能提供一些指導(dǎo)和建議。2008-02-02防止利用系統(tǒng)漏洞輕輕松松繞過你的驗(yàn)證碼的方法
防止利用系統(tǒng)漏洞輕輕松松繞過你的驗(yàn)證碼的方法...2007-03-03Web網(wǎng)絡(luò)安全分析Base64注入攻擊原理詳解
這篇文章主要為大家介紹了Web網(wǎng)絡(luò)安全分析Base64注入攻擊原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11關(guān)于Web網(wǎng)絡(luò)如何防范XSS攻擊的措施
這篇文章主要介紹了關(guān)于Web網(wǎng)絡(luò)如何防范XSS攻擊的措施,XSS攻擊是一種常見的網(wǎng)絡(luò)安全漏洞,它可以通過注入惡意代碼來攻擊用戶的計算機(jī)和瀏覽器,從而竊取用戶的敏感信息或執(zhí)行惡意操作,需要的朋友可以參考下2023-07-07