Создание фальшивого сообщения WhatsApp с помощью SQLite
База данных SQLite. Такая манипуляция позволяет сообщению выглядеть так, будто оно было отправлено другой стороной, хотя на самом деле оно никогда не передавалось. Автор уязвимости разберет структуру хранилища сообщений WhatsApp и объяснит, как изменение определенных полей может обмануть приложение, заставив его отображать сфабрикованное сообщение как легитимное.
Хранение сообщений WhatsApp: Основы
WhatsApp хранит все сообщения пользователя в локальной базе данных SQLite под названием msgstore.db
.
Эта база данных содержит несколько таблиц, но наиболее важной для нашей цели является таблица message
.
Каждая строка в message
таблице представляет одно сообщение, столбцы которого определяют его метаданные, включая отправителя, временные метки, статус и содержимое.
Ключевые столбцы в таблице сообщений
Вот некоторые из наиболее важных столбцов, участвующих в манипулировании сообщениями:
Первичный ключ сообщения, автоматически увеличивается для каждого нового сообщения
Указывает на беседу, к которой относится данное сообщение
Указывает направление сообщения:
1
если сообщение отправлено с устройства,
0
Уникальный идентификатор сообщения, обычно хэш
Время отправки сообщения (время Unix в миллисекундах)
Время, когда сообщение было получено
Фактическое содержимое сообщения
Указывает статус доставки/прочтения (например, 13 для "замечено")
sort_id
Определяет порядок отображения сообщения
Зачем увеличивать ID?
При ручной вставке новой строки в таблицу message
поле _id
должно быть уникальным. Поскольку оно обычно увеличивается автоматически, необходимо убедиться, что вставленное значение _id
больше текущего максимального значения в таблице.
Например, если в последнем сообщении есть _id = 532
, вы должны вставить своё сфабрикованное сообщение с _id = 533
. Это сохранит целостность базы данных и гарантирует, что сообщение будет считаться самой новой записью.
Кроме того, sort_id
должно совпадать с _id
, если вы хотите, чтобы сообщение отображалось в правильном месте чата. В противном случае WhatsApp может неправильно отобразить его или проигнорировать.
Процесс Манипулирования
- Выберите существующее сообщение из таблицы
message
. Обратите внимание наchat_row_id
,timestamp
, иreceived_timestamp
. - Подготовьте запрос INSERT с помощью:
- Новое значение
_id
(увеличенное на единицу) - Те же
chat_row_id
для того, чтобы сообщение появилось в том же чате from_me = 0
чтобы создать впечатление, будто сообщение пришло от другого человека- Реалистичная
key_id
строка - Скопированные или изменённые временные метки соответствуют порядку сообщений
- Ваш пользовательский
text_data
(например,'this is a test message'
) - Выполните запрос с помощью
sqlite3
или другого редактора баз данных, пока приложение закрыто. - Перезапустите WhatsApp, и сообщение появится в истории переписки.
Как это работает?
Основная причина, по которой эта манипуляция работает, заключается в том, что WhatsApp не проверяет целостность сообщений с помощью внешних средств при чтении из msgstore.db
. Приложение просто загружает сообщения из базы данных и отображает их на основе метаданных.
В локальной базе данных нет цифровой подписи, контрольной суммы или криптографической проверки на уровне обычного текстового сообщения. Это позволяет вставлять поддельные сообщения, которые кажутся пользователю абсолютно легитимными.
Итог
Понимание структуры локального хранилища сообщений WhatsApp позволяет проводить целенаправленные манипуляции, такие как внедрение поддельных сообщений. Правильно изменяя такие поля, как _id
, from_me
, и timestamp
, можно создавать правдоподобные поддельные сообщения, которые органично вписываются в историю чата.