域名被别人CNAME
CNAME恶意解析(CNAME攻击)是指攻击者利用DNS(域名系统)中的CNAME记录(别名记录)进行恶意操作的一种手段。该文章分别介绍CNAME与IP空间被恶意指向,以及相关的处理方案。CNAME记录用于将一个域名(别名)映射到另一个域名(规范名称),但在某些情况下,攻击者可能通过操控CNAME记录来实现以下恶意目的:
流量劫持:攻击者将CNAME记录指向一个恶意服务器,从而将用户的访问流量重定向到恶意网站,用于窃取用户信息(如登录凭证)、传播恶意软件或实施钓鱼攻击。
域名接管(Subdomain Takeover):当CNAME记录指向的外部服务(如云存储、CDN或第三方平台)已停止使用或未正确配置,且该服务允许未授权用户认领该域名时,攻击者可以接管该子域名,托管恶意内容。
DNS欺骗:通过篡改CNAME记录,攻击者可以伪装成合法域名,诱导用户信任并访问恶意站点/钓鱼站点。
拒绝服务(DoS):攻击者可能将CNAME记录指向不存在或不可用的域名,导致服务中断。
电子邮箱诈骗:攻击者不需要自己建站,而通过电子邮件进行相关诈骗。攻击成本极低,而受害者误信伪装域名而损失钱财。
竞争对手恶意行为:竞争对手使用cname攻击的方法,使对手品牌受损。
适用处理范围:
1,处理域名被别人CNAME恶意解析;被CNAME
2,处理IP空间的IP地址被恶意解析;被域名非法指向IP
3,进一步提高安全性,增加安全头配置
4,禁止IP访问提高IP安全性,不允许IP直接访问
5,禁止CNAME未授权解析,非法CNAME不被访问
6,非法域名指向自有空间的IP,直接拒绝连接杜绝非法指向
文章结构:
CNAME劫持以及IP空间劫持解析原理
处理方案
安全升级
通过curl命令测试
CNAME劫持以及IP空间劫持解析原理
域名被别人恶意CNAME,或者是IP空间被人用域名恶意指向。这种属于边界外劫持,时间越久危害越大。
域名的恶意指向如果在搜索引擎中已经排名是非常危险的,时间过久以后会变成权威域名,接着攻击者将域名指向钓鱼网站,就可以窃取用户的信息和相关账号,进行社会工程学攻击。
另外一种可能得情况也会使品牌受损,如将恶意站点改为其他的推广或宣传,利用品牌进行相关恶意营销,以及危害比较大的电子邮件诈骗,潜在危害非常大。
为了杜绝这种现象,构建边界外劫持信息安全,我们应该构建一个相关的安全配置,保护我们的品牌以及网站不受损。
处理方案
善用反代理软件Nginx,nginx可以将非授权服务直接断开连接。以下是相关的架构图
nginx除了可以将非法域名的解析杜绝连接,还可以控制跳转到一些特定的页面。比如403,或者444(直接断开),亦或者将其他非授权域名指向一个广告推送或者其他相关配置上面。这里重点介绍配置444。
配置路径默认位置为:
/etc/nginx/nginx.conf
配置中的关键节点为 server
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
# SSL 证书配置
ssl_certificate /www/ssl/ssl/example.com.pem;
ssl_certificate_key /www/ssl/ssl/example.com.key;
server_name _;
return 444;
}
配置说明:
listen 80 default_server;
监听IPv4的80端口,即http的默认端口,其中default_server指的是默认服务器。如果客户端请求的域名没有匹配到其他的server块,这个server块将处理这个请求。
也就是说,如果不是你配置的server块配置文件(多域名解析,反向代理等),其他非配置文件的默认处理,由这个块进行处理。
listen [::]:80 default_server;
监听IPv6的80端口,即http的v6默认端口,defaul_server同理。
listen 443 ssl default_server;
监听IPv4的443端口,即https的默认端口,defaul_server同理。
listen [::]:443 ssl default_server;
监听IPv6的443端口,即https的默认端口,defaul_server同理。
ssl_certificate /www/ssl/ssl/example.com.pem;
ssl的证书目录以及证书,可以自签证书,也可以用你已经有的ssl域名证书。
ssl_certificate_key /www/ssl/ssl/example.com.key;
ssl的证书的密钥key,同样可以是自签证书,也可以是你的ssl证书key。
server_name _;
_
:一个无效的占位符域名,表示不匹配任何具体的域名。
结合 default_server,这个配置使得该 server 块成为默认服务器,处理所有无法匹配到其他 server 块的请求。通常用于兜底配置。
return 444;
Nginx 自定义的状态码,表示“无响应”。它会立即关闭客户端连接,不返回任何响应内容。
这是一个非常强的拒绝策略,用于阻止任何未明确配置的请求。通常用于默认服务器,防止未经授权的访问或探测。
配置以后的效果: 非nginx配置的域名,或者是直接的IP访问都是无法连接的。
说明
这是一个默认服务器配置:
该 server 块被配置为 default_server,处理所有未匹配到其他 server 块的 HTTP(80 端口)和 HTTPS(443 端口)请求,无论是 IPv4 还是 IPv6。
由于 server_name ; 是一个无效域名,任何请求都不会直接匹配到这个 servername,但 default_server 确保它会捕获所有未被其他 server 块处理的请求。
安全策略:
通过 return 444;,任何匹配到这个 server 块的请求都会被立即拒绝,且不返回任何响应。这种配置常用于防止恶意扫描、未授权访问或不希望处理的流量。
配置了 SSL 证书和私钥,表明服务器支持 HTTPS 请求,但由于 return 444;,即使是 HTTPS 请求也会被拒绝。
典型用途:
这种配置通常用作 Nginx 的“兜底”服务器,防止未配置的域名或 IP 访问服务器时返回不必要的信息。
它可以保护服务器免受不必要的探测或攻击,例如通过直接访问服务器 IP 或未绑定的域名发起请求。
安全升级
增加安全头配置,在nginx的配置中,增加相关的安全配置,进一步提高安全性。
# 添加其他安全头
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options SAMEORIGIN;
通过对nginx增加 add_header
指令为 HTTP 响应添加了安全相关的头部。这些头部旨在增强 Web 应用程序的安全性,防止常见的 Web 攻击。以下逐一解析:
X-Content-Type-Options: nosniff
作用:防止浏览器对响应内容进行 MIME 类型嗅探(MIME sniffing)。
为什么需要:
浏览器有时会尝试猜测(嗅探)响应内容的 MIME 类型,而不是严格遵循服务器发送的 Content-Type 头部。例如,一个声称是 text/plain 的文件可能被浏览器解析为 text/html 或 application/javascript,从而导致恶意代码被执行。
设置 nosniff 强制浏览器严格遵守服务器指定的 Content-Type,降低内容被错误解释的风险。
效果:
防止攻击者通过上传伪装成无害文件(如图片)的恶意脚本文件,利用 MIME 嗅探执行 XSS(跨站脚本攻击)。
增强对静态文件(如 CSS、JS、图片等)的安全处理。
适用场景:适用于所有 Web 服务器,特别是提供用户上传内容的网站。
X-XSS-Protection: "1; mode=block"
作用:启用浏览器的内置 XSS(跨站脚本攻击)保护机制,并在检测到潜在 XSS 攻击时阻止页面加载。
为什么需要:
许多现代浏览器(如 Chrome、Safari、旧版 Edge)内置了 XSS 过滤器,可以检测反射型 XSS 攻击(即通过 URL 参数或表单输入注入恶意脚本)。
默认情况下,浏览器可能仅清理(sanitize)可疑脚本,但仍允许页面加载。mode=block 使浏览器在检测到 XSS 时完全阻止页面加载,增加安全性。
效果:
如果浏览器检测到潜在的 XSS 攻击(例如通过 URL 注入的 <script> 标签),页面不会渲染,保护用户免受恶意脚本执行。
注意:此头部对不支持 XSS 过滤的浏览器(如 Firefox、现代 Edge)无效,且已被部分浏览器弃用(例如 Chrome 在较新版本中已移除此功能)。
适用场景:适合需要兼容旧浏览器的场景,但现代应用更推荐使用 Content Security Policy (CSP)。
X-Frame-Options: SAMEORIGIN
作用:防止页面被嵌入到其他网站的 <iframe>、<frame> 或 <object> 中,除非嵌入方与当前页面同源(即协议、域名、端口相同)。
为什么需要:
防止“点击劫持”(clickjacking)攻击,即攻击者通过将目标网站嵌入 iframe 并覆盖透明层,诱导用户在不知情的情况下点击目标网站的功能(如按钮)。
SAMEORIGIN 限制只有同源页面才能嵌入当前页面。
效果:
浏览器会拒绝在不同源的 iframe 中加载页面,保护用户免受点击劫持攻击。
例如,example.com 的页面只能被 example.com 的 iframe 嵌入,malicious.com 无法嵌入。
适用场景:适用于任何需要防止页面被恶意嵌入的网站,尤其是涉及用户交互(如登录表单、支付页面)的场景。
这些安全头可以进一步提高服务器的安全性
降低常见攻击风险:如 XSS、点击劫持、MIME 类型嗅探等。
增强浏览器安全机制:利用浏览器内置的安全功能,减少服务器端漏洞被利用的可能性。
合规性要求:许多安全标准(如 OWASP、PCI-DSS)推荐或要求使用这些头部。
简单高效:添加这些头部只需少量配置,无需修改应用程序代码,就能显著提升安全性。
其他常见的安全头配置
Content Security Policy (CSP)
作用:定义页面允许加载的资源来源(如脚本、样式、图片等),有效防止 XSS 和数据注入攻击。
示例配置:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self';";
效果:
限制页面只加载来自同源的资源,防止外部恶意脚本执行。
支持细粒度控制,例如允许特定域的 CDN 资源。
注意:需要根据应用需求定制策略,避免过于严格导致正常功能受限。
Strict-Transport-Security (HSTS)
作用:强制浏览器通过 HTTPS 访问网站,防止中间人攻击和协议降级攻击。
示例配置:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
效果:
max-age:指定 HSTS 生效的时间(秒),通常设为一年(31536000 秒)。
includeSubDomains:对所有子域名生效。
preload:允许网站加入浏览器的 HSTS 预加载列表(需手动提交)。
浏览器会拒绝非 HTTPS 连接,防止 HTTP 被拦截。
适用场景:任何启用了 HTTPS 的网站。
Referrer-Policy
作用:控制请求中发送的 Referer 头部信息,保护用户隐私。
示例配置:
add_header Referrer-Policy "strict-origin-when-cross-origin";
效果:
仅在跨站请求时发送源信息(协议+域名),不发送完整 URL 路径。
防止敏感信息(如 URL 参数中的 token)通过 Referer 泄露。
常见值:
no-referrer:不发送任何 Referer 信息。
same-origin:仅同源请求发送 Referer。
strict-origin:仅 HTTPS 请求发送源信息。
Permissions-Policy
作用:控制浏览器功能(如地理位置、摄像头、麦克风)的访问权限。
示例配置:
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()";
效果:
禁用指定功能,防止恶意脚本滥用浏览器 API。
可根据需求启用特定功能,如 geolocation=('self') 允许同源访问地理位置。
Cache-Control
作用:控制浏览器和代理的缓存行为,防止敏感数据被缓存。
示例配置:
add_header Cache-Control "no-store, no-cache, must-revalidate, private";
效果:
no-store:禁止任何缓存。
no-cache:强制验证缓存。
must-revalidate:缓存过期后必须重新验证。
private:仅浏览器可缓存,代理不可缓存。
适用场景:敏感页面(如登录、支付页面)。
示例配置
将安全头添加到所有响应: 在 Nginx 的 server 块中使用 add_header 确保所有响应都包含这些头部。如果某些头部只适用于特定路径,可以在 location 块中配置。
server {
listen 80;
listen 443 ssl;
server_name example.com;
# 全局安全头
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "default-src 'self'";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Referrer-Policy "strict-origin-when-cross-origin";
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()";
}
通过curl命令测试
curl -H "Host:https://a" https://b
解释命令 curl -H "Host:https://a" https://b
这里假设 https://a
为劫持你的域名,https://b
为你所拥有的域名。
实际测试,请按照这个修改为你的实际域名即可。
curl 是一个用于发起 HTTP 请求的命令行工具。上述命令的具体含义如下:
-H "Host:https://a"
: 使用 -H 参数手动设置 HTTP 请求头中的 Host 字段,指定为 https://a。这告诉服务器,请求的目标主机名是 a,即使实际请求的地址是 https://b。https://b
: 这是实际发起请求的目标 URL,curl 会向 b 的 IP 地址发送请求,但请求头中携带的 Host 是https://a
。
这种命令的用途:
常用于测试虚拟主机配置、DNS 解析问题或模拟特定场景下的请求。
在 CNAME 相关场景中,攻击者可能尝试通过伪造 Host 头来测试是否存在 CNAME 解析漏洞(如子域名接管)。
命令行为:
curl
会解析 https://b 的域名,获取其 IP 地址,然后发送 HTTP 请求到该 IP。请求头中的
Host: https://a
会告诉服务器,客户端认为它正在访问 a,而不是 b。如果 b 的服务器配置了基于 Host 头的虚拟主机,它会根据 Host: https://a 返回与 a 相关的响应(如果存在这样的配置)。
测试防御效果
预期结果,防御成功,请求遭到拒绝,返回403或者404,或者直接无法连接。
444断开连接效果,防御成功。这里跟 default_server配置的默认块,return返回决定。
403断开连接效果,防御成功。这里跟 default_server配置的默认块,return返回决定。
防御失败
如果返回跟你前端一样的页面,则表示防御失败,需要检查配置是否正确,nginx是否正常工作。
额外扩展防御
安全:启用DNSSEC(DNS安全扩展)以防止DNS记录被篡改,使用强密码和双因素认证保护DNS管理账户。
Comment