突破神奇的Cloudflare防火墙的网络安全学习
背景
最近碰到一个神奇的网站,在浏览器可以打开,但是通过 curl 或者 代码访问就直接 403,我估摸着这肯定是做了UA校验
,于是请求的时候把浏览器的 UA 给带上,然后访问发现还是 403,不过这也难不倒我,肯定是还有校验其它的请求头,直接浏览器打开 network,把所有的请求头复制过来并且带上,确保我和浏览器在 http 协议层面的请求完全一样,这样不可能会失败了吧,然而运行完发现还是 403。
放个地址: https://pixabay.com
思考
服务端校验客户端没有什么黑魔法,因为都是通过 TCP 协议通讯,不可能存在浏览器发送一个 HTTP 报文和我发送一个同样的 HTTP 报文服务器能识别出来,既然不是校验的 HTTP 层,那只可能是在 TLS 层校验的,于是祭出wireshark
抓包,看看能不能找到 TLS 握手中差异化的东西,众所周知在 TLS 握手时有一个客户端发送给服务端的Client Hello
报文,很有可能就是根据它来辨别浏览器和非浏览器请求的,因为在这个报文中,客户端要告诉服务端支持的加密套件,TLS 版本等等信息,而这些信息根据客户端的实现都会有所差异,先抓个正常浏览器请求的报文看看,如下图:
然后再通过 curl 访问抓包,如下图;
可以看到两边的报文确实存在很大的差异,逐一对比排查之后发现很有可能是因为 curl 的请求报文里缺少supported_versions
扩展信息导致的 403,浏览器那边在此扩展信息内容如图:
表示支持TLSv1.2
和TLSv1.3
,而且最终握手之后的协议也是切换到了TLSv1.3
,在上面两个对比图可以看到,浏览器走的是TLSv1.3
,而 curl 走的是TLSv1.2
,可能是一定要使用TLSv1.3
才能访问成功。
验证
马上 google 了下如何指定 curl 的 TLS 版本,发现只需要加上--tlsv1.3
参数就可以了,如下:
$ 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
经过反复验证,发现除了要指定tlsv1.3
之外,还需要加上accept-language
和user-agent
头,并且一定得是 http2 协议,三个条件缺一不可。
nodejs 访问
上面说到了一定要走 http2 协议,而现在市面上流行的 http client 基本都是只支持 http1.1,所以只能直接从基础库入手了,官方有一个http2
的库,一番调教之后也是成功请求了,代码如下:
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); })();
深入
虽然已经成功请求了,但是本着探索的精神继续深入发现 cloudflare 官方有一篇博客就是专门介绍这个 TLS 拦截技术的,链接如下:
https://blog.cloudflare.com/monsters-in-the-middleboxes/
其中有一段内容也证明了我的猜想,翻译后如下:
也就是说 cloudflare 会维护一组浏览器的 TLS 指纹,当收到一个 Client Hello 请求时,会检查这组指纹,如果匹配不上,就会拦截这个请求,这样可以拦截掉大部分不是来自浏览器的请求了。
以上就是突破神奇的Cloudflare防火墙的网络安全学习的详细内容,更多关于Cloudflare防火墙的资料请关注猪先飞其它相关文章!
原文出处:https://segmentfault.com/a/1190000042207804
相关文章
使用CloudFlare后提示网站“重定向的次数过多”解决办法
如果服务器设置了HTTP重定向到HTTPS,由于CloudFlare CDN默认SSL设置为“Flexible”模式(HTTP请求),这时服务器对于CloudFlare的响应会被加密,从而访问失败并不断重复发送相同请求...2021-09-04- 一般来说为了达到隐藏自身 IP,我们都会选择一些 CDN 服务,目前用的最多的免费 CDN 是 Cloudflare。但是正常情况下 Cloudflare 是不能自己选择IP,有时候分配给我们的 IP 可能表现不佳,也只能将就着用。但是我们都希望可以用上 CF 比较快的 IP。那么自选IP,就显得很必要了。...2022-09-23
2022年最新Cloudflare免费自选IP教程(非Partner)
写在开头众所周知,CF在去年底大规模禁用Host API key,使得Partner自选法失效.但最近,Cloudflare为所有计划添加了100个SaaS域免费额度(以前$2一个).经过一番摸索,这个船新的...2022-09-23- 这篇文章主要介绍了Ubuntu20.04防火墙设置简易教程(小白),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-30
- 这篇文章主要介绍了c# 通过代码开启或关闭防火墙的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2020-12-08
- 这篇文章主要介绍了为Nginx服务器配置黑名单或白名单功能的防火墙的方法,文中还附带介绍了一个基于lua的第三方防火墙模块,需要的朋友可以参考下...2016-02-02
- 这篇文章主要介绍了c# 如何将特定端口加入防火墙中,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2020-12-08
- 这篇文章主要介绍了Windows 2008 r2 防火墙设置端口例外的方法,需要的朋友可以参考下...2016-01-27
- Windows 2003提供的防火墙称为Internet连接防火墙,通过允许安全的网络通信通过防火墙进入网络,同时拒绝不安全的通信进入,使网络免受外来威胁。...2016-01-27
在Linux防火墙上编译Apache+PHP4+Mysql(转)
目的: 一台Redhat linux 6.2 用为防火墙,专线连结Chinanet,对内连结 局域网段192.168.11.0/24,需要enable PHP4和Mysql数据库,且局域网 上有另一台Apache服...2016-11-25- 这篇文章主要介绍了Python网络安全格式字符串漏洞任意地址覆盖大数字的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-10-14
- 这篇文章主要介绍了win2003防火墙导致ftp无法使用的解决方法,需要的朋友可以参考下...2016-01-27
linux下mysql开启远程访问权限 防火墙开放3306端口
这篇文章主要为大家详细介绍了linux下mysql开启远程访问权限,防火墙开放3306端口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-01-26- 这篇文章主要介绍了win2003服务器通过ipsec做防火墙的配置方法,需要的朋友可以参考下...2016-01-27
- 对于采用Windows2003或者WindowsXP的用户来说,不需要安装任何其他软件,因为可以利用系统自带的“Internet连接防火墙”来防范黑客的攻击。...2016-01-27
- 出于安全因素考虑,在 Windows Server 2008 上是不允许从外部对其执行 Ping 指令的...2016-01-27
- 为了进一步提高安全,您可以启用windows默认的防火墙.但需要注意如下问题,要不您的ftp,网站,远程管理就会无法访问。 ...2016-01-27
- 这篇文章主要为大家介绍了突破神奇的Cloudflare防火墙的网络安全学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...2022-07-23
- 由于WebKnight的配置很多,这里我只写一下推荐配置,个人观点,仅供参考,如果更好的建议,期待您的分享...2016-01-27
- 2003 server用于提供web和ftp服务,通过互联网用flashfxp实现远程上传网页。如果关闭防火墙,ftp上传下载正常,但启用windows防火墙后就不行,即使把web、ftp等服务列为例外也不行。...2016-01-27