nginx host头攻击漏洞
host头攻击漏洞概念
客户端在发起请求时,会发送一个host头给服务器,服务器会根据客户端发送的host识别要请求的页面或者转发的后端服务器,以此返回请求的内容。
有些网站的代码配置为,通过请求的host头拼接路径来形成访问的url,这时候攻击者会发送一个异常的host头,如果服务端没有进行host头识别判断的话,同意了这个请求,攻击者就会通过这个异常的host头拼接路径来制造陷阱,非法劫持网站中的一些信息,以及上传病毒代码或文件,甚至是取得整个网站或者服务器的控制权限,这就是host头攻击。
实验
通过url 301重定向,传递异常的host头来非法获取信息
设置172.25.230.47的18080为访问端口,配置两个域名:app.com和test.com,访问这两个域名分别转发到后端的172.25.230.53:8801及172.25.230.52:8801上
配置nginx
172.25.230.55
server1
app.com
server { listen 18080; server_name app.com; location /test1/ { return 301 http://app.com:18080/apptest1/test.html; ##设置url重定向,访问/test1/路径跳转到/apptest1/test.html上 } location /apptest1/ { proxy_pass http://172.25.230.53:8801; proxy_redirect off; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
server2
test.com
server2 test.com server { listen 18080; server_name test.com; location /test1/ { return 301 http://test.com:18080/apptest1/test.html; ##设置url重定向,访问/test1/路径跳转到/apptest1/test.html上 } location /apptest1/ { proxy_pass http://172.25.230.52:8801; proxy_redirect off; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
172.25.230.52
配置静态页面,访问test.com转发到这台8801端口上
##nginx配置 server { listen 8801; server_name test.com; location / { root html; index index.html index.htm index.php; } } ##静态页面配置 ]# echo 'this is 172.25.230.52:8801' > /nginx/html/apptest1/test.html
172.25.230.53
配置静态页面,访问app.com转发到这台8801端口上
##nginx配置 server { listen 8801; server_name app1.com; location / { root html; index index.html index.htm index.php; } } ##静态页面配置 ]# echo 'this is 172.25.230.53:8801' > /nginx/html/apptest1/test.html
分别访问app.com和test.com
curl -XGET -L http://app.com:18080/test1/
curl -XGET -L http://test.com:18080/test1/
在访问app.com时传递host头test.com
curl -XGET -L -H'Host:test.com' http://app.com:18080/test1/
发现变成了访问test.com时的内容
查看请求响应过程:
url进行了一次跳转,应该是跳转到http://app.com:18080/apptest/test1.html上,后端代理到172.25.230.53:8801上,由于nginx未进行host判断,将test.com识别成了请求的host头,因而返回的是test.com:18080的内容,后端代理到了172.25.230.52:8801上。
解决办法:
添加host头判断
if ($host !~* ^app.com$){
return 403;
}