Перейти к содержимому
Назад к пути
Теория 2 мин чтения

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)
}

Почему этот код «дырявый»?

Хакер видит:

  1. Прямое использование Sprintf — это значит, что в SQL-строку можно внедрить лишние кавычки.
  2. Отсутствие валидации ввода — символы ', -, ; никак не фильтруются.

Атака хакера:

Если хакер введет в поле 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.

Продолжить чтение

Что бы прочитать модуль полностью, зарегистрируйтесь/войдите на платформу

Когда закончишь — отметь раздел, чтобы продолжить.

🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru