Название: NightCity Data Exchange Cтек: Crystal + Postgresql
Порты: 7331
Описание: Биржа уязвимостей, где покупают и продают найденные эксплойты, за внутренние кредиты. При регистрации и за добавление уязвимостей — начисляются , эксплойты можно купить. Кредиты можно обменивать между пользователями.
- Порт PostgreSQL проброшен наружу:
...
ports:
- "8432:8432"
...
В конфиге указано подключение к БД без безопасных параметров:
database: "postgres://postgres:postgres@localhost:7432/nde"Любой пользователь в пределах сети может подключиться к базе данных с дефолтным логином/паролем (postgres:postgres), получить доступ к данным, выполнить SQL-инъекции или удалить всё.
-
При переводе средств (транзакция
/users/transfer) можно подменить email отправителя (from_user). -
На сервере нет проверки соответствия текущего пользователя
from_user.
Email'ы других пользователей можно спарсить с публичной страницы /transactions, где почта замаскирована, но легко угадывается c помощью данных со страниц /users/:id.
Пример эксплойта: exploit/simpleidor.rb
- Метод обновления пользователя вызывает
DBC.query(...), который открывает транзакцию и не завершает её:
query = "UPDATE users SET username = $1, email = $2 WHERE id = $3"
result = DBC.query(query, self.username, self.email, self.id) # query открывает транзакцию- При большом числе одновременных запросов — пул подключений быстро заполняется, и сервис перестаёт отвечать (
DB::PoolRetryAttemptsExceeded).
exploit/
├── dos.rb # Занимает пул подключений, вызывает отказ в обслуживании
└── simpleidor.rb # Использует IDOR для перевода средств от имени другого пользователя
