• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Заметка Немного о «Моем Мире» и обнаруженном баге на заблокированной странице

Темы, которые НЕ подходят по объему под префикс "Статья"
Данная заметка не о том, как парсить социальные сети, а о том, что я обнаружил в социальной сети «Мой Мир Mail.ru». Эта сеть родом из 2007 года до сих пор находиться в перманентно активном состоянии. Более того, в 2019 она была обозначена владельцем как нишевый проект. Но, тем не менее, это не помогло данной сети. И количество пользователей уменьшается с каждым годом.

000.png

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

screenshot3.png

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

screenshot1.png

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

screenshot2.png

С одной стороны ничего особенного в этом нет. Так как пользователь не сам скрывал информацию, а социальная сеть закрыла к ней доступ. Но, нельзя же делать это все так топорно.

Такой вот небольшой баг, что ли. Ну и для его эксплуатации можно использовать код, который приведен ниже. Единственное, что не стал выдергивать в коде, так это ссылки на фото и прочее. Но, тем не менее, сделать это совершенно не трудно самостоятельно.

Python:
import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/101.0.4951.54 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
              'application/signed-exchange;v=b3;q=0.9 '
}

data_list = []


def mir_mail_check(nickname):
    # составляем ссылку и делаем запрос
    url = f'https://my.mail.ru/mail/{nickname}/'
    req = requests.get(url=url, headers=headers)

    # проверяем статус-код, если он 200, то выполняем скрипт дальше
    if req.status_code == 200:
        # добавляем в список и печатаем данные о сервисе
        # так же печатаем инфу о доступности страницы
        data_list.append(f'\n\n[Мой мир MailRU]\n{"-"*35}\n')
        print(f'\n[Мой мир MailRU]\n{"-"*35}')
        print('[+] Страница существует')
        data_list.append('[+] Страница существует\n')
        print(f'[+] Адрес страницы: {url}')
        data_list.append(f'\n[+] Адрес страницы: {url}\n')
        soup = BeautifulSoup(req.text, 'lxml')
        try:
            # проверяем на странице наличие тэга
            # если есть, делаем вывод, что это закрытая или заблокированная
            # страница, так как данный тэг есть и там, и там
            # печатаем это и добавляем запись в список
            if soup.find('div', class_='profile-closed ui-simple-block'):
                print('  [-] Закрытая или заблокированная страница')
                data_list.append('  [-] Закрытая или заблокированная страница\n')
        except AttributeError:
            pass
        try:
            # ищем блок с именем и датой последнего посещения
            # находим определенные тэги из которых получаем данные
            # после чего из объединяем, выводим на печать и добавляем в список
            name_date = soup.find('div', class_='profile__content_header_user profile__content_header_user_not-online')
            name = name_date.find('h1').text.strip()
            visit_date = name_date.find('span', class_='profile__user-status').text.strip()
            print(f'  [-] {name}\n\t  - {visit_date}')
            data_list.append(f'  [-] {name}\n\t  - {visit_date}\n')
        except AttributeError:
            pass
        try:
            # получаем информацию о возрасте и адресе
            # печатаем и добавляем в список
            age_address = soup.find('div', class_='profile__content_mainInfo').find_all('span')
            for item in age_address[0:2]:
                print(f'\t  - {item.text.strip()}')
                data_list.append(f'\t  - {item.text.strip()}\n')
        except AttributeError:
            pass
        try:
            # здесь получаем информацию из блока с кол-вом фото, видео и друзей
            # так как все данные не нужны, делаем выборку по друзьям, фото и группам
            menulink = soup.find('div', class_='profile__menu').find_all('a', class_='profile__menuLink booster-sc')
            for item in menulink:
                if item.text.strip()[0:6] == "Друзья":
                    print(f'\t  - {item.text.strip()[0:6]}: {item.text.strip()[6:]}')
                    data_list.append(f'\t  - {item.text.strip()[0:6]}: {item.text.strip()[6:]}\n')
                if item.text.strip()[0:4] == "Фото":
                    print(f'\t  - {item.text.strip()[0:4]}: {item.text.strip()[4:]}')
                    data_list.append(f'\t  - {item.text.strip()[0:4]}: {item.text.strip()[4:]}\n')
                if item.text.strip()[0:6] == "Группы":
                    print(f'\t  - {item.text.strip()[0:6]}: {item.text.strip()[6:]}')
                    data_list.append(f'\t  - {item.text.strip()[0:6]}: {item.text.strip()[6:]}\n')
        except AttributeError:
            pass

    if req.status_code == 404:
        # проверяем статус, если 404
        # печатаем, что такой никнейм не существует и добавляем
        # об этом инфу в список
        data_list.append(f'\n\n[Мой мир MailRU]\n{"-" * 35}\n')
        print(f'\n[Мой мир MailRU]\n{"-" * 35}')
        print('\n[+] Страница не существует\n')
        data_list.append('\n[+] Страница не существует\n')


def main():
    nickname = input('[+] Введите никнейм для проверки: ')
    mir_mail_check(nickname)


if __name__ == "__main__":
    main()

Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна
 

Dart Moore

Green Team
16.04.2022
16
6
BIT
3
На python 3 выйдет ошибка об отсутствии lxml

pip install lxml
Import lxml
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!