✨
AppSec & Pentest
AppSec
AppSec
  • AppSec Book
  • Intro
  • PII: Персональные данные
  • Поисковые движки
  • Построение модели угроз / анализ угроз
  • Платформы оркестрации, автоматизации пентеста
  • Audit and Compliance
  • Methodologies
    • Security Check Lists
    • Security Cheat Sheets
    • MNA Process
    • DD Process
    • Написание политик
    • Какие-то модные прикладные инструменты
    • Pentest
      • BlackBox vs GreyBox vs WhiteBox
      • Threat Modeling
      • MITRE ATT&CK
      • OSSTMM
      • CVSS
      • CIS Standarts
      • WASC
      • OWASP Testing Guides
      • PCI DSS
      • PTES
      • NIST SP 800-115
      • ISSAF
  • peoples & blogs
    • Intro
    • Companies
    • Mobile
    • People & Gitbooks
    • Podcasts
    • Jobs
  • Базы уязвимостей
    • vulners
    • zero.today
    • Регистрация CVE
  • Pentest IDE
    • Nuclei (Go)
    • jaeles (Go)
    • Pentest Collaboration Framework
    • Lair Framework (Go)
    • Faraday IDE
    • Nucleus
    • Bulwark
    • Написание отчетов
  • Payloads & Wordlists
    • Генерация wordlists
    • Payloads
      • Подборка
      • Directories
      • Passwords
      • Поддомены
      • Пароли по умолчанию
      • usernames & logins
      • Headers
      • RCE
      • XXE
      • XXS
      • JWT Secrets
    • Расширения файлов, которые можно искать
    • Bypass Something
      • bypass dot
      • 40x bypass
  • AppSec / WEB
    • Common
      • Типовая последовательность действий
      • Common Go Tools
      • Guidelines
    • Automated WebApp Pentest
      • Other tools
      • Burp Suite
        • Режимы в Intruder
        • Как заводить крякнутый
        • Plugins
        • Инструменты для Burp
        • Написание расширений
          • Documentation & Examples
          • UI
          • kotlin
            • Basic
            • Examples
          • jpython
            • Пример
        • Papers
        • Tips
    • Server-Side Vulnerabilities
      • Broken Access Control
      • Bruteforce [credentials]
        • About
        • Papers & Books
        • Tools
          • Hydra
          • Medusa
          • Potator
      • Business Logic Vuln
      • CSV-injection
      • DOS
      • DDOS
      • Dependency Confusion Attack
      • Deserialization
        • About
        • JSON
        • Java
        • .Net / ViewState
        • PHP
        • Python
        • Ruby
        • Тестовые стенды
      • Host Header Injection
      • HTTP Smuggling
      • IDOR
      • JSON Hijacking
      • LFI
      • LFR
      • Open Redirect
        • Cases
          • Open Redirect To XSS
        • CheetSheets
      • OS Command Injection
      • Path Traversal
      • Phishing
      • Race Condition
      • Regular Expression
      • Reverse Shell
      • Searching
      • Session Fixation
      • SQLi
        • Description
        • Databases
          • HQL inj
          • DQL inj
          • postgres
          • Yandex ClickHouse
        • Exec Code
        • Tools
          • Как отработает запрос в разных базах
          • sqli exploit
        • Papers
          • SQLi in Node.js
          • Cheat Sheets
      • SSRF
        • Description
        • Tools
        • Papers
      • SSTI/CSTI
      • Subdomain Takeover
        • Description
        • Tools
        • Papers
      • Upload File
        • MIME type bypass & filter evasions
        • Example: Upload File
        • Some Attacks
        • ImageMagick
        • Inject Payloads
          • To Image
          • WebShell
          • In office macros
          • Контейнеры
            • png
          • XXE/XXS -> Office
        • Tools & MindMaps
      • XML/SOAP injection/XXE
        • About
        • Tools
        • Examples XXE
        • Papers
      • Web Cache Deception
      • Web Cache Poising
    • Client-Side Vulnerabilities
      • Vulnerabilities
      • CSRF
      • CRLF
      • XSS
        • Description
        • Attacks
          • Exploiting XSS
          • GTM (and other TMS) XSS
          • Через SVG
          • DOM-based vulnerabilities
            • About
            • DOM-based XSS
            • DOM-based open redirect
            • DOM Clobbering
          • Local File Read via HTML injection in PDF
          • RCE in DOMPDF
          • [висячая разметка] Dangling markup injection
          • String.prototype.replace
          • CSS injection
          • jQuery XSS
          • AngularJS Sandbox Escape
        • Gadgets
        • Tools
        • Cheat Sheets
        • Papers
      • Prototype Pollution Attack
      • Client-Side & Client-Server Communications
        • window.postMessage
        • Server-Sent Event (SSE)
      • Eval-based Injections
      • Serialization
      • Incorrect work with location
      • Clickjacking (UI redressing)
    • Technics
      • OSINT
        • Tools
          • Поиск по сервисам
            • Github
            • Gitlab
            • Slack
            • Google Dorks
            • Facebook / Instagram
            • LinkedIn
          • Swiss Army Knife
            • Bellingcat's Online Investigation Toolkit
            • MS Threat Intelligence Platform
            • foca/goca
            • spiderfoot
            • Shodan
            • BinaryEdge (Shodan alternative)
            • Maltego
            • theharvester
            • PublicWWW
            • Разное / TODO
          • Поиск по логину / имени/компании
          • Get IP or Geo-location
          • Разное
            • База CommonCrawl
            • ТОП сайтов
        • Certificate Transparency
        • Papers
      • Кодировки
      • Web Application Testing with CryptoPro Sign
      • Получить IP спрятанный за CDN (Search Real IP)
    • SSDLC
    • DevSecOps
      • Materials
      • IAST
      • SAST
        • About
        • SAST List
        • Python: Bandit
        • Semgrep
          • Intro
          • Getting Started
          • Writing rules
            • Pattern syntax
            • Rule syntax
          • Rulesets
          • Papers
        • CodeQL
          • Intro
          • Docs & Papers
          • Get Started
          • Usage
          • CodeQL CLI
          • Writing CodeQL queries
            • About
            • CodeQL Packs
            • CodeQL Queries
            • QL Language
              • About
              • Predicates
              • Queries
              • Types
            • Libraries
              • Intro
              • Javascript
            • Basic types
            • Creating alert queries
            • Creating path queries
          • TODO
        • Checkmarx
      • DAST
        • About
        • NetSparker
        • Rapid7
        • Acunetix
        • OWASP ZAP
        • HP WebInspect
        • Burp Enterprise
        • Wallarm FAST
      • RASP
      • API ST
      • OSA/SCA — Open Source Scanners & Dependency Check
    • Browser PWN
    • Вопросы
      • Как хранить пароли?
      • Куки или токены?
      • Сброс пароля через email
      • Про процессы и контроли
      • Application Security Design Antipatterns
    • ЯП
      • JS
        • Search links
        • RCE on Desktop Clients (ex: win)
        • Обход валидаторов
    • Books & Papers
    • Tools
      • Crawling
      • CSP bypass
      • Web Fuzzers
        • Intro
        • Tools
          • Other tools
          • ffuf (Go)
          • wfuzz
      • Subdomain Enum
        • Combines
          • Amass
          • Monitorizer
          • Findomain
          • dnsdumpster
        • Another tools
        • Brute subdomains
        • Sources
        • Mutators
        • Techniques
      • Other tools
      • Scanners
      • Fingerprinting
      • Scrappers
      • CVEs List
  • Technologies
    • WEB
      • Аналитика & Маркетинг
        • Dark
        • Dark SEO
        • Просто список
      • RSS-каналы
        • Клиенты
        • Atom
      • CMIS
        • About
      • HTTP/WEB
        • Рекомендуемые заголовки (Headers)
        • HSTS
        • SameSite
        • Content-Security-Policy (CSP)
        • Same-Origin Policy (SOP)
        • Cross-Origin Resource Sharing (CORS)
        • Типы запросов
        • First Party Sets
        • Subresource Integrity (SRI)
        • HTTP Reverse Proxy
        • Papers & Resources
      • CMS
        • ModX
        • Joomla
        • Drupal
        • WordPress
        • Liferay
      • Админки/CRM
        • Zend Framework
        • Bitrix
        • Salesforce
      • WAF
      • GraphQL
      • Virtual Hosts
      • OAUTH/OpenID/2FA
        • Общие рекомендации для авторизации
        • 2FA
        • OAuth 2.0
          • About
          • Definitions
            • Clients
            • Tokens
            • Scopes
            • Grant Types
            • Redirect URL
            • The Resourse Server
          • Flows
            • Server Side App Authorization Flow
            • Single Page App Auhtorization Flow
            • Mobile and Native Apps Authorization Flow
            • Authorization Flow
            • Access Tokens Flow
              • Authorization Code Request
              • Password Grant
              • Client Credentials
              • Access Token Reponse
              • Access Token Lifetime
              • Refreshing Access Tokens
              • Making Authenticated Requests
            • Listing Authorizations and Revoking Access Flow
            • OAuth for Browserless and Input Constrained Devices
            • PKCE
            • Token Introspection Server Flow
          • Vulnerabilities
            • Common 1
            • Common 2
        • OpenID Connect (OIDC)
          • About
          • Vulnerabilities
          • Papers
        • IndieAuth
        • Разница между OAuth и OpenID
        • JWT
      • Servers
        • Oracle WebLogic
        • Jetty
        • JBoss (WildFly)
        • Nginx
        • Apache
          • .htaccess
          • <server-url>/server-status
          • Apache Tomcat
          • Apache Struts2
          • CVE
        • F5 BIG-IP
    • Покупка SIM-карт и номеров
    • Banks & Payments
      • Definitions
      • Kind of payments
      • 3DS
      • PCI DSS
      • Эквайринг
      • Vulnerabilities
      • Доклады
      • ATM
    • Программы лояльности
    • Digital Rights Management (DRM)
    • ELK — Elasticsearch, Logstash, Kibana
      • About
      • Elasticsearch
      • Logstash
      • Kibana
    • 1C
    • CI/CD
      • Jenkins
      • huskyCI
      • Travis CI
      • CircleCI
      • Общее
    • SCM
      • Gitlab
      • Tools
      • Vulns
    • Honeypots
    • ChatGPT
  • Learning
    • Компетенции
    • Материалы SANS & Offensive Security
    • Просто норм материалы/gitbooks по пентесту вцелом...
    • Platforms & Playground Labs
    • Бумажная ИБ
      • Информация Общая
      • Иерархия (виды) информации
  • Bug Bounty
    • Notes
    • Browser Plugins
    • Cheat Sheets
    • Платформы
    • Specific tools
  • Hardware/IoT
    • Tools
    • Training
    • Papers & Books
Powered by GitBook
On this page
  • Ошибки конфигурации
  • Дефолтный конфиг
  • Один upstream
  • Missing root location
  • Off-by-Slash
  • Небезопасное использование переменных nginx
  • Обработка сырых данных от бэкенд сервера
  • Path Traversal

Was this helpful?

  1. Technologies
  2. WEB
  3. Servers

Nginx

PreviousJBoss (WildFly)NextApache

Last updated 4 years ago

Was this helpful?

Слышал как-то об инструменте для тестирования конфигураций веб-сервера nginx на наличие уязвимостей, но не обратил на него внимания. Сейчас узнал, что этот инструмент имеет в репозитории хорошо описанные сценарии эксплуатации искомых уязвимостей и неплохую Вики:

Ошибки конфигурации

Дефолтный конфиг

Пусть есть дефолтный конфиг nginx. Разработчик копирует его, называет example.com и настраивает на нем что-то (например, php). А default не удаляет. При обращении к example.com/index.php - отрабатывает страничка.

При входе на любой не существующий виртуальный домен на сервере (меняем host), выведется дефолтная страничка (ее обработает дефолтная конфигурация сервера) - "Welcome to Nginx".

Фишечка: можем сделать следующий запрос и увидеть сорцы:

GET /example.com/index.php
Host: localhost

Один upstream

Иногда пускают через один upstream поток на два сервиса (например, два разных сервачка).

Допустим, есть два хоста: a.example.com и b.example.com. На a-хосте вход по сертам, на b-хосте - нет. Тогда, иногда, может получится такая штука:

curl -H "Host: a.example.com" http://b.example.com -v -k

И мы попадаем на a.example.com без авторизации.

Missing root location

server {
        root /etc/nginx;

        location /hello.txt {
                try_files $uri $uri/ =404;
                proxy_pass http://127.0.0.1:8080/;
        }
}

В этом конфиге не описано как обрабатывать location /, а только location /hello.txt. При обращении например к /nginx.conf будет прочтен файл /etc/nginx/nginx.conf.

Off-by-Slash

server {
        listen 80 default_server;

        server_name _;

        location /static {
                alias /usr/share/nginx/static/;
        }

        location /api {
                proxy_pass http://apiserver/v1/;
        }
}

В этом конфиге location /api не закрыто слешем. Как происходиит обработка такого запроса:

http://apisesrver/api/user

 Сначала nginx нормализует URL (например: http://apiserver/api/user/../user -> http://apiserver/api/user). Затем ищет префикс /api и все, что после него, подставляет в proxy_pass:

http://apisesrver/api/user -> http://apiserver/v1//user

Затем этот URL нормализуется.

Ну а если мы запросим вот такой адрес?)

http://apisesrver/api../server-status

Ответ: он уйдет на http://apiserver/server-status.

Небезопасное использование переменных nginx

SCRIPT_NAME

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9000;
}

Здесь основная проблема в том, что PHP интерпретатору будет отправлен любой URL (если он оканчивается на php), даже если самого скрипта нет.

Например: если обратиться /v1/exploit_php.jpg/notexist.php, то если не выставлены определенные флаги, fastcgi интерпретатор отбросит notexist.php и попытается обратиться к exploit_php.jpg и проинтерпретировать его как php скрипт.

Обработка сырых данных от бэкенд сервера

Nginx в моде proxy_pass может скрывать ошибки и заголовки, приходящие с бэкенд-сервера. Это очень удобно. Nginx автоматом подсунет дефолтную страничку на ошибки. Но что, если nginx не поймет ответ сервера?

Если клиент отправит некорректный http запрос, то он будет переслан бэкенд-серверу как есть; сервер вернет raw ответ и Nginx его не сможет обработать и вернет его клиенту как есть. ТТаким образом можно увидеть какие-то необычные заголовки, данные и тп

Например:

Бэкенд приложение:

def application(environ, start_response):
   start_response('500 Error', [('Content-Type',
'text/html'),('Secret-Header','secret-info')])
   return [b"Secret info, should not be visible!"]

Nginx конфиг:

http {
   error_page 500 /html/error.html;
   proxy_intercept_errors on;
   proxy_hide_header Secret-Header;
}

Если отправить нормальный GET запрос, то Nginx вернет:

HTTP/1.1 500 Internal Server Error
Server: nginx/1.10.3
Content-Type: text/html
Content-Length: 34
Connection: close

Но, если отправить некорректный запрос, такой как:

GET /? XTTP/1.1
Host: 127.0.0.1
Connection: close

То Nginx вернет следующий ответ:

XTTP/1.1 500 Error
Content-Type: text/html
Secret-Header: secret-info

Secret info, should not be visible!

Path Traversal

Если директива в конфиге Nginx merge_slashes включена (on), то Nginx будет убирать лишние слэши, например /// -> /, ///../../ -> /../../.

Если директива выключена, то возможны случаи, когда:

/../index.js -> 404
///../index.js -> 200

Потому что в первом случае бэкенд серверу уйдет index.js, а во втором
//../index.js

Подробнее и больше примеров:

вернет страницу ошибки error_page, если код ответа сервера > 300

Подробнее:

https://github.com/yandex/gixy
https://github.com/wallarm/awesome-nginx-security
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#passing-uncontrolled-requests-to-php
proxy_intercept_errors
https://medium.com/appsflyer/nginx-may-be-protecting-your-applications-from-traversal-attacks-without-you-even-knowing-b08f882fd43d