Как я могу автоматизировать тестирование сайта на наличие уязвимостей SQL инъекций - PullRequest
0 голосов
/ 20 марта 2011

Вот основной план. Я счастлив создать что-то похожее на успех, это проект Uni. Псевдокод отличный.

  1. Паук на сайте.
  2. Поиск форм на каждой странице.
  3. Отправьте каждую форму без заполнения реквизитов, чтобы выявить гарантированный сбой.
  4. Заполните первое поле в форме с помощью '-.
  5. Отправьте форму и сравните ответ с ошибкой (вызвано 3).
  6. Если ответ (вызванный 5) отличается (чем отказ), тогда предположите уязвимость.
  7. Если то же самое (ответ = ошибка), вернитесь к 4., но перейдите к следующему полю.
  8. Если больше полей не осталось, перейдите на другую страницу.

...

Однако, 6. явно является критической частью приложения и неправильной. Например, страница может ответить так:

Error: '-- is not a valid user name.

Где на этапе 4. Ответ был

Error:  is not a valid user name.

Или

Error: username must be a minimum of 6 characters.

Ответы [ 2 ]

0 голосов
/ 31 марта 2011

«Атаки и защита с помощью SQL-инъекций» Джастина Кларка.

Предлагает ряд тестов для обнаружения и подтверждения уязвимостей с помощью SQL-инъекций, вот мое резюме на стр. 65.

Ошибка запуска

"Отправьте ' или '-- и ожидайте получения ошибки."

Сообщение об ошибке или ошибка 500 на сервере указывают на уязвимость.Ответы, аккуратно содержащие ' или '-- (как у пользователя ' или '--, недоступны с этим паролем ...), вероятно, не будут уязвимы, если не будут отслеживаться в стеке.

Всегдаистинное условие

"Отправьте 1' or '1'='1 или 1') or ('1'='1 и ожидайте получения каждой записи в базе данных."

Можно предположить, что сайт уязвим, еслиКод ответа - 200, и строка ответа не получена в ответе.Страницы, содержащие слово «ошибка» или строку атаки, обозначают сопротивление, как и 500.

Нет условия

"Отправьте value' or '1'='2 или value') or ('1'='2 и ожидайте уязвимое приложениеответить, как если бы он только получил value. "

Всегда ложное условие

" 1' and '1'='2 или 1') and ('1'='2. В случае успеха он не возвращает строкиз таблицы. "

Конкатенация Microsoft SQL Server

" 1' or 'ab'='a'+'b или 1') or ('ab'='a'+'b. В случае успеха возвращается та же информация, что и всегда истинное условие "

Конкатенация MySQL

"1' or 'ab'='a' 'b или 1') or ('ab'='a' 'b. В случае успеха возвращается та же информация, что и всегда истинное условие"

Конкатенация Oracle

"1' or 'ab'='a'||'b или 1') or ('ab'='a'||'b. В случае успеха возвращается та же информация, что и всегда истинное условие"

Дополнительные примеры приведены повсюдукнига.

0 голосов
/ 20 марта 2011

Похоже, что в (4) вы хотите сначала попытаться отправить несколько доброкачественных значений, чтобы увидеть, какой тип страницы возвращается в нормальных условиях.

Например, сгенерируйте случайное трехбуквенное «имя пользователя» и отправьте его. Вы, вероятно, получите ответ типа «Ошибка: bfw не является действительным именем пользователя». или «Ошибка: имя пользователя слишком короткое».

Как только вы это сделаете, вы можете отправить свою строку, пытаясь ввести SQL, и посмотреть, качественно ли отличается результат. Поэтому, если вы отправляете '-- и получаете тот же результат, что и при отправке случайного доброкачественного «имени пользователя», это, вероятно, не уязвимо. С другой стороны, если вы получите ответ, который отличается от предыдущего и содержит текст типа «Предупреждение, у вас ошибка в SQL в строке 1 ...», то он, вероятно, уязвим. (Тем не менее, вам не нужно выдавать предупреждения, чтобы сделать вывод, что он уязвим. Даже общая страница с ошибкой может указывать на уязвимость, если она существенно отличается от ответа, полученного от ваших доброкачественных данных.)

...