nginx反向代理

前言

之前一直用的都是apache来作为服务器,对nginx和反向代理也只是了解,看到研究反向代理攻击方法的文章,来结合深入分析一下

环境:环境直接使用了phpstudy的nginx环境,比较方便,另外用docker开启了一个weblogic服务,作为反向代理到的服务器

正向代理与反向代理

  • 正向代理 代理客户端 隐藏真实客户端

  • 反向代理 代理服务器 隐藏真实服务端

Af9Eyn.png

nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。

nginx多用来做为反向代理服务器,配置信息主要集中在nginx.conf

反向代理攻击

绕过限制

配置为

1
2
3
4
5
6
7
location /console/ {
deny all;return 403;
}

location / {
proxy_pass http://weblogic;
}

直接访问/console/会拒绝

Weblogic把#作为有效成分,所以可以构造:GET /#/../console/ HTTP/1.1

Nginx处理请求时,它无视了#后面的所有东西,这样可以绕过访问/console/的限制。转发原始的/#/../console/给Weblogic,Weblogic根据规范处理这个路径,所以进入了/console/

AfmNJ1.png

一个/

遍历其他目录

配置为

1
2
3
location /to_app {
proxy_pass http://server/any_path/;
}

注意到这里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
2
3
location /to_app {
proxy_pass http://192.168.214.145:7001/hello/;
}

配置文件限制只能访问到hello
Afmaz6.png

构造GET /to_app../console HTTP/1.1,就能访问到后台管理界面
AfmURx.png

去掉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
2
3
4
5

- `proxy_pass http://backend`

直接转发原始请求
```/!"$&'()*+,-./:;<=>@[\]^_`{|}~?a#z``` -> ```/!"$&'()*+,-./:;<=>@[\]^_`{|}~?a#z

%01-%FF -> %01-%FF

referer