1. Уязвимый код авторизации на Go
Уязвимый код авторизации на Go
Теория обретает смысл только на практике. Самый наглядный пример разрушительной силы SQL-инъекции — это обход формы входа. Мы увидим, как хакер может стать администратором, даже не зная ни одного пароля.
Разберем уязвимый код авторизации на Go и поймем, почему логика «Истина или Ложь» становится ключом ко всем дверям вашего приложения.
Как это выглядит в коде
Представьте стандартный веб-сервер на стандартной библиотеке net/http. Разработчик хочет сделать авторизацию максимально простой.
func loginHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
username := r.FormValue("username")
password := r.FormValue("password")
var userID int
// ❌ СМЕРТЕЛЬНО ОПАСНО: Формирование строки SQL через Sprintf
query := fmt.Sprintf("SELECT id FROM users WHERE user='%s' AND pass='%s'", username, password)
err := db.QueryRow(query).Scan(&userID)
if err == sql.ErrNoRows {
http.Error(w, "Неверный логин или пароль", http.StatusUnauthorized)
return
} else if err != nil {
http.Error(w, "Ошибка сервера", http.StatusInternalServerError)
return
}
// Если мы здесь — авторизация успешна!
fmt.Fprintf(w, "Добро пожаловать, пользователь #%d!", userID)
}
Почему этот код «дырявый»?
Хакер видит:
- Прямое использование
Sprintf— это значит, что в SQL-строку можно внедрить лишние кавычки. - Отсутствие валидации ввода — символы
',-,;никак не фильтруются.
Атака хакера:
Если хакер введет в поле username: admin' --, переменная query превратится в:
SELECT id FROM users WHERE user='admin' --' AND pass='...'
База данных увидит:
- Команда:
SELECT id FROM users WHERE user='admin'(Найти админа) - Комментарий:
--(Всё, что дальше, — игнорировать)
Пароль больше не проверяется. Любое значение в поле password будет принято!
Как это выглядит в браузере
На практике атака выглядит так: в поле Username вводится пейлоад admin' --, а в поле Password — любой текст. Onboarding-пример: пейлоад подсвечен красной рамкой, чтобы новичок сразу видел, что именно идёт в SQL-запрос:

После нажатия Sign In студент попадает в профиль администратора — без знания пароля. Дальше остаётся купить товар «CTF Flag» от имени admin, и флаг приходит в баннере:

Таблица последствий: Ожидалось vs Пэйлоад
| Параметр | Уязвимая строка (Sprintf) | Безопасная строка (Prepared) |
|---|---|---|
| Код | user='%s' AND pass='%s' |
user=? AND pass=? |
| Ввод | admin' -- |
admin' -- |
| Итог | ВЗЛОМ (база ищет админа) | ОТКАЗ (база ищет юзера с ТАКИМ именем) |
Уязвимость в авторизации — это критический риск, позволяющий получить доступ к любым аккаунтам. И всё это из-за того, что база данных интерпретирует ввод пользователя как часть кода.
Далее мы детально изучим логику объединения условий и легендарную конструкцию OR 1=1.
Продолжить чтение
Что бы прочитать модуль полностью, зарегистрируйтесь/войдите на платформу
Когда закончишь — отметь раздел, чтобы продолжить.