server-side/nginx

Access to the script ‘xxx’ has been denied (see security.limit_extensions)

C/H 2018. 7. 21. 08:30

==> access.log <==
127.0.0.1 - - [19/Jul/2018:21:31:36 +0900] "GET / HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"

==> error.log <==
2018/07/19 21:31:36 [error] 933#933: *13 FastCGI sent in stderr: "Access to the script '/mnt/c/Users/uncao/Projects/org.bitbucket/crawler4php/www' has been denied (see security.limit_extensions)" while reading response header from upstream, client: 127.0.0.1, server: crawler4php.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:", host: "domain.com"

==> access.log <==
127.0.0.1 - - [19/Jul/2018:21:32:36 +0900] "GET / HTTP/1.1" 403 20 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"

==> error.log <==
2018/07/19 21:32:36 [error] 933#933: *13 upstream timed out (110: Connection timed out) while reading upstream, client: 127.0.0.1, server: crawler4php.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.2-fpm.sock:", host: "domain.com"

Why

Nginx 설정오류로 인해서 악의적인 이미지(PHP코드가 삽입된)를 업로드가 된다면(일반적인 게시판 기능에서) Nginx는 이미지를 이미지를 fastCGI로 실행하게 되고, 이미지에 삽입된 PHP 코드는 $_SERVER['PATH_INFO']를 참조해서 /somefilename.php 을 생성한다. 이로인해 악의적인 사용자가 해킹을 할 수 있는 기능을 서버에 삽입이 성공한다.

이는 Ngix포럼 : Re: nginx 0day exploit for nginx + fastcgi PHP에 2010-05-21에 보고되고 논의 되었던 내용이다.

Conclusion

Nginx PATH_TRANSLATED 기능을 제거하면 정상적으로 동작한다.

  1. cgi.fix_pathinfo 기능을 FALSE 설정.
    기본값은 TRUE이다. FALSE로 변경할 경우 PATH_INFO를 사용하는 기능은 작동하지 않을 것이다.(예. 워드프레스)
  2. try_files $url =404; 추가
    Nginx와 FastCGI가 물리적으로 같은 서버에 있을 경우 동작
  3. 악의적인 탐색 URL을 차단하라.
    물론 URL만으로 탐지가 불가능하지만...
  4. 설정에서 업로드 폴더를 제외하라.
    새로운 어플리케이션(서버설정)을 추가할 때마다 계속 관리해야 한다.
  5. PHP가 없는 서버에서 업로드파일을 관리하라.
    콘텐츠는 어찌되었던 정적이기 때문에 별도의 하위 도메인에서 컨텐츠를 제공하면 된다.


반응형