一 简介
如题所示,使用过nginx的同学应该知道nginx的反向代理功能是非常强大的。当一个网站每天的流量很大时,我们可以通过nginx的反向代理功能将客户端的请求均匀地分配到后端的多个业务服务器进行处理,最后通过nginx将执行结果返回给客户端(PS:更多的关于nginx做负载均衡的内容可以参考我的这篇文章:https://www.zifangsky.cn/611.html)
既然nginx可以将用户的请求分发到内网的多个业务服务器去处理,那么我们是否可以这样想:我们能否在用户访问我们的域名时,通过nginx的反向代理将请求分发到一个不属于我们的网站去处理,最后我们只需要将处理的结果通过nginx再返回给用户。经过nginx的这一中间人处理之后,那么用户是否能够分辨出来他访问的仅仅只是一个“空壳”网站?而后台根本就没有对应的业务程序来响应用户的请求
这就是我今天要介绍的如何使用nginx来克隆一个已知网站的镜像网站。不仅如此,我们还可以使用nginx的一个插件达到:不仅克隆他人的网站,而且还可以根据关键字将某些文字进行替换之后返还给用户展示。用通俗一点的语言来说就是,我们可以将原网页中的广告内容替换成我们自己的推广链接;将原网页指定的文字替换成其他一些不好的文字,达到抹黑对方的目的;再比如说配合一个相似的域名用于钓鱼攻击,因为只是替换了表单的action地址,其他的跟原网页一模一样,因此非常具有具有迷惑性;或者可以在一个境外服务器上装上nginx,克隆被大陆屏蔽的网站(PS:Google、Facebook等),达到不用翻 墙就可以访问的目的等等。当然,最重要的一点就是仅仅只是在一台服务器上安装一个nginx,以及添加上对应的配置文件,并不需要额外安装其他的应用服务,所以可以极大的节省我们自己的服务器资源,消耗被克隆网站的服务器资源
对于被克隆的网站来说,我觉得有一个非常恰当的词来形容,那就是:
苦恨年年压金线,为他人作嫁衣裳
其实,我上面介绍的nginx能够做到的这些功能已经可以算作“中间人攻击”了。下面我将以具体的实例来简单说明如何实现这一目的
在正式介绍代码实现之前,我先放上我的测试实例,也就是我对我51CTO上的博客进行了克隆:
- 原地址:http://983836259.blog.51cto.com
- 用nginx做的镜像地址:http://51cto.zifangsky.cn
有心的同学可以认真对比下二者之间的区别,看看是否做到了很逼真的“克隆”
注:
- 中间人攻击(Man-in-the-Middle Attack, MITM)是一种由来已久的网络入侵手段,并且在今天仍然有着广泛的发展空间,如SMB会话劫持、DNS欺骗等攻击都是典型的MITM攻击。简而言之,所谓的MITM攻击就是通过拦截正常的网络通信数据,并进行数据篡改和嗅探,而通信的双方却毫不知情(PS:参考至百度百科)
- 在51CTO博客后台是不能配置自定义域名的,这里只是随便找了一个站点效果测试,为了不侵犯他人的权益因此我使用了我51CTO上的备份博客,使用随便一个其他网站理论上也是可行的
二 代码实现
如果仅仅只是做镜像网站,而不需要对网页内容进行“修改”(篡改)的话,那么仅仅只是nginx就足够了。反之需要额外安装一个nginx的第三方插件——ngx_http_substitutions_filter_module
(1)下载ngx_http_substitutions_filter_module:
1 2 3 | [root@localhost src]# wget https://github.com/yaoweibin/ngx_http_substitutions_filter_module/archive/master.zip [root@localhost src]# unzip ngx_http_substitutions_filter_module-master |
(2)重新configure一下nginx:
./configure –prefix=/usr/local/nginx –user=www –group=www –with-http_stub_status_module –with-http_ssl_module –with-openssl=/usr/local/ssl –with-pcre=/usr/local/src/pcre-8.38 –add-module=/usr/local/src/ngx_cache_purge-2.3 –with-http_gzip_static_module –add-module=/usr/local/src/ngx_http_substitutions_filter_module-master
注:这里主要是添加我最后标注的这个模块,其他模块如果用不到的话可以不用安装
(3)接着是编译安装:
1 | [root@localhost nginx-1.11.4]# make && make install |
(4)给nginx添加一个配置文件:
1 | [root@localhost conf]# vim /usr/local/nginx/conf/vhost/51cto.conf |
其内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | server { listen 80; server_name 51cto.zifangsky.cn; index index.php index.html index.htm; location / { if ($http_user_agent ~* (baiduspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|YoudaoBot|robozilla|msnbot|MJ12bot|NHN|Twiceler)) { return 403; } default_type text/html; subs_filter_types text/css text/xml; subs_filter '983836259.blog.51cto.com' '51cto.zifangsky.cn' g; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Referer http://983836259.blog.51cto.com; proxy_set_header Host 983836259.blog.51cto.com; proxy_pass http://983836259.blog.51cto.com; proxy_set_header Accept-Encoding ""; } } |
当然,在nginx的nginx.conf配置文件中需要引入此文件( http配置结束之前引入):
include vhost/*.conf; #nginx虚拟主机包含文件目录
关于上面的配置,我这里简单介绍一下:
i)server_name 后面跟的是监听的域名,因此不多说
ii)subs_filter_types 用于指定subs_filter标签要检查的内容的类型,默认是text/html
iii)subs_filter 用于替换目标网站返回内容中的文本,然后再返回给用户。其格式是:subs_filter ‘原内容’ ‘替换之后的内容’ [作用域]
这里的作用域一共分为四种,分别是:
- g(default) 替换所有匹配到的字符串
- i 执行不区分大小写的匹配
- o 只替换匹配到的第一个
- r 处理模式为一个正规表达式,默认是一个固定的字符串
subs_filter ‘<(script.*?)>var cnzz_protocol.*?</script>’ ” or;
1 | [root@localhost vhost]# service nginx reload |
(6)效果如下:
三 反思
因为HTTP是明文传输,因此是很容易发生这种“中间人攻击”的。如果我们的网站就这样被人恶意克隆并替换了其中一些关键内容,不仅我们自己的利益会收到很大损害,而且一旦被用作钓鱼攻击使客户也发生了危害,那就是我们非常不愿意看到的事情了。即使克隆的人仅仅只是窃取网站内容,并没有做其他危害更大的行为。但是可怜我们经常生产原创内容,结果流量或者说潜在客户却被他人轻易“截胡”,我想这也是大家非常不愿意看到的结果吧
总之一句话就是:我建议站长们积极响应Google他们的建议,尽快给我们的网站全站HTTPS
因为HTTPS之后,如果网站被克隆了,里面的域名被替换,那么将会因为域名与预期不符从而导致网站显示异常,比如说像这样:
上图是我对我的个人博客(https://www.zifangsky.cn)进行的克隆,因为我的博客已经整站都SSL加密了,所以可以发现一些资源因为证书不符导致并不能加载出来
参考文章:
静静 2016/11/07 17:09
HTTPS大法好
admin 博主 2016/11/07 17:43
@
静静 2016/11/08 13:36
@ 这个是你那边ISP的问题吧,你用的是电信还是联通?
admin 博主 2016/11/08 17:04
@ 不知道,不管了,反正我有梯子,不怕墙
77衣都穿衣打扮 2016/10/20 23:48
谢谢楼主分享
admin 博主 2016/10/21 09:39
@ 不客气,哈哈