nginx反向代理
前言
之前一直用的都是apache来作为服务器,对nginx和反向代理也只是了解,看到研究反向代理攻击方法的文章,来结合深入分析一下
环境:环境直接使用了phpstudy的nginx环境,比较方便,另外用docker开启了一个weblogic服务,作为反向代理到的服务器
正向代理与反向代理
正向代理 代理客户端 隐藏真实客户端
反向代理 代理服务器 隐藏真实服务端
nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。
nginx多用来做为反向代理服务器,配置信息主要集中在nginx.conf
反向代理攻击
绕过限制
配置为
1 | location /console/ { |
直接访问/console/
会拒绝
Weblogic把#
作为有效成分,所以可以构造:GET /#/../console/ HTTP/1.1
Nginx处理请求时,它无视了#
后面的所有东西,这样可以绕过访问/console/
的限制。转发原始的/#/../console/
给Weblogic,Weblogic根据规范处理这个路径,所以进入了/console/
一个/
遍历其他目录
配置为
1 | location /to_app { |
注意到这里proxy_pass
的最后是有一个/
的
服务器配置的规则为location /to_app
,即/to_app
是作为后面添加字符的前缀。因此,/to_app
,/to_app/
,/to_app_anything
(包括特殊符号)都可以通过该规则。并且,/to_app
后面的字符将被提取并与proxy_pass
联合(解析)起来。
Nginx处理完/to_app_anything
后,其转发(到后端服务器)的请求格式为http://server/any_path/_anything
构造GET /to_app../other_path HTTP/1.1
可以遍历后端服务器的所有位置
首先/to_app
与Nginx规则相匹配,然后Nginx提取出../other_path
,与proxy_pass
的/any_path/
相结合,最终转发的请求为:http://server/any_path/../other_path
则可访问到其他目录
验证
1 | location /to_app { |
配置文件限制只能访问到hello
构造GET /to_app../console HTTP/1.1
,就能访问到后台管理界面
去掉proxy_pass
最后的/
,则404
编码
除去上边的区别,proxy_pass
最后是否有/
还会影响是否转发原始请求(是否进行urldecode)
proxy_pass http://backend/
:
%01-%FF
in path -> 1
2
会对url进行解码, `<> ' " `可以来构造xss
Browser -> http://victim.com/path/%3C%22xss_here%22%3E/ -> Nginx -> http://backend_server/path/<”xss_here”>/ -> WebApp
1 |
|
%01-%FF
-> %01-%FF
referer
- https://xz.aliyun.com/t/4577
- https://github.com/GrrrDog/weird_proxies/wiki
- https://www.contextis.com/en/blog/server-technologies-reverse-proxy-bypass
- https://www.slideshare.net/GreenD0g/reverse-proxies-inconsistency
- https://www.acunetix.com/blog/articles/a-fresh-look-on-reverse-proxy-related-attacks/
- https://www.anquanke.com/post/id/150436