设为首页收藏本站

安而遇随-随遇而安

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
安而遇随-随遇而安 首页 其他 转载 查看内容

使用Lua保护Nginx远离CC攻击

2015-2-28 20:42| 发布者: 随便、先森。| 查看: 435| 评论: 0|来自: JTwo.Me

摘要: 简单,以下方法不需要额外安装模块:location ~ \.php$ { if ($cookie_reCAPTCHA != "$remote_addr"){ add_header Set-Cookie "reCAPTCHA=$remote_addr; PATH=/"; rewrite .* "$scheme://$host$uri" redirect; #rewr ...

简单,以下方法不需要额外安装模块:

location ~ \.php$ {
	if ($cookie_reCAPTCHA != "$remote_addr"){
		add_header Set-Cookie "reCAPTCHA=$remote_addr; PATH=/";
		rewrite .* "$scheme://$host$uri" redirect;
		#rewrite .* "$scheme://localhost:$remote_port" redirect;
	}
	
	... ...
}

进阶,返回JS跳转代码过滤模拟访问:

location ~ \.php$ {
	default_type text/html;
	if ($cookie_reCAPTCHA != "$remote_addr"){
		add_header Set-Cookie "reCAPTCHA=$remote_addr; PATH=/";
		return 200 "<script>location.reload()</script>\n";
	}
	
	... ...
}

PERL,返回JS设置COOKIE并自动刷新:

http {
	perl_set $reCAPTCHA 'sub{use Digest::MD5 qw(md5_base64); md5_base64("SALT",shift->variable("remote_addr"))}';
	... ...
	server {
		... ...
		location ~ \.php$ {
			default_type text/html;
			if ($cookie_reCAPTCHA != $reCAPTCHA){ #访问非text/html会异常,换用add_header设置Cookie避免js无法执行
				return 200 '<script>\ndocument.cookie="reCAPTCHA=$reCAPTCHA";\nlocation.reload();\n</script>\n';
			}
			... ...
		}
	}
}

综合以上方法,笔者当前使用的配置:

http {
    perl_set $reCAPTCHA 'sub{use Digest::MD5 qw(md5_base64); my $r = shift;
    md5_base64("salt:RANDOM".$r->variable("remote_addr").$r->variable("http_user_agent"))}';
    ... ...
    server {
        ... ...
        location / {
            default_type text/html;
            if ($cookie_reCAPTCHA != $reCAPTCHA){
                add_header Set-Cookie "reCAPTCHA=$reCAPTCHA; PATH=/";
                return 200 '<script>location.reload()</script>';
            }
            proxy_pass http://www.baidu.com;
        }
    }
}

LUA,大同小异,需要安装扩展模块:apt-get install nginx-extras

location ~ \.php$ {
	rewrite_by_lua '
		local md5token = ngx.md5(ngx.var.remote_addr .. ngx.var.http_user_agent)
		if (ngx.var.cookie_reCAPTCHA ~= md5token) then
			ngx.header["Set-Cookie"] = "reCAPTCHA=" .. md5token
			return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)
		end
	';
	
	... ...
}

参考: https://jiji262.github.io/wooyun_articles/drops/通过nginx配置文件抵御攻击.html



防御思路

因为CC攻击通过工具软件发起,而普通用户通过浏览器访问,这其中就会有某些区别。想办法对这二者作出判断,选择性的屏蔽来自机器的流量即可。

初级

普通浏览器发起请求时,除了要访问的地址以外,Http头中还会带有Referer,UserAgent等多项信息。遇到攻击时可以通过日志查看访问信息,看攻击的流量是否有明显特征,比如固定的Referer或UserAgent,如果能找到特征,就可以直接屏蔽掉了。

中级

如果攻击者伪造了Referer和UserAgent等信息,那就需要从其他地方入手。攻击软件一般来说功能都比较简单,只有固定的发包功能,而浏览器会完整的支持Http协议,我们可以利用这一点来进行防御。

首先为每个访问者定义一个字符串,保存在Cookies中作为Token,必须要带有正确的Token才可以访问后端服务。当用户第一次访问时,会检测到用户的Cookies里面并没有这个Token,则返回一个302重定向,目标地址为当前页面,同时在返回的Http头中加入set cookies字段,对Cookies进行设置,使用户带有这个Token。

客户端如果是一个正常的浏览器,那么就会支持http头中的set cookie和302重定向指令,将带上正确的Token再次访问页面,这时候后台检测到正确的Token,就会放行,这之后用户的Http请求都会带有这个Token,所以并不会受到阻拦。

客户端如果是CC软件,那么一般不会支持这些指令,那么就会一直被拦在最外层,并不会对服务器内部造成压力。

高级

高级一点的,还可以返回一个网页,在页面中嵌入JavaScript来设置Cookies并跳转,这样被伪造请求的可能性更小

Token生成算法

Token需要满足以下几点要求

1,每个IP地址的Token不同

2, 无法伪造

3, 一致性,即对相同的客户端,每次生成的Token相同

Token随IP地址变化是为了防止通过一台机器获取Token之后,再通过代理服务区进行攻击。一致性则是为了避免在服务器端需要存储已经生成的Token。

推荐使用以下算法生成Token,其中Key为服务器独有的保密字符串,这个算法生成的Token可以满足以上这些要求。

Token = Hash( UserAgent + client_ip + key )

来源:https://www.jianshu.com/p/dff5a0d537d8


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

返回顶部