SQL Injection Search Automation

Автор: Алексей Немиро http://aleksey.nemiro.ru Източник: Списание RSDN #2-2008
Постановка на проблема Изпълнение Заключение
това

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

В тази статия ще разкажа и покажа, използвайки PHP и C# като примери, как да напиша програма, която автоматично ще сканира дадени сайтове за уязвимости на SQL Injection. Естествено, всичко това се прави, за да се премахнат подобни уязвимости. :)

Формулиране на проблема

Първата стъпка е да се определят задачите. Програмата трябва да може да:

Извършването на проста HTTP заявка не е трудно и в рамките на тази статия няма да се налага да отиваме по-далеч от GET заявки.

Като SQL код, който ще бъде добавен към параметрите на страницата, можете да използвате обичайните единични кавички ('), това е напълно достатъчно, за да може сървърът да даде някаква грешка, ако уеб програмистите имат криви ръце. Доста често уеб програмистите правят грешки с кавички, особено често такива грешки се правят в типове данни, когато параметърът изглежда като число, но в същото време, поради особеностите на използваните технологии, може да съдържа низови данни.

Сайтове, написани на класически ASP и PHP, често страдат от такива грешки, обикновено поради неопитност или банален мързел на програмистите. Струва си да се отбележи, че в ASP.NET вероятността за поява на SQL инжектиране е почти нулева и за да се създаде такава уязвимост, ръцете напрограмистите наистина трябва да растат не от мястото, където обикновено растат. Имайки това предвид, няма много смисъл да се опитвате да намерите SQL Injection на сайт, написан на ASP.NET.

Внедряване

И така, задачата е поставена, нека започнем изпълнението. Първо, нека напишем функция, която ще изпълнява обикновена GET заявка.

Както казах по-рано, връзките ще се търсят с помощта на регулярни изрази. Моля, имайте предвид, че връзките може да съдържат относителен път, така че такива връзки ще трябва да бъдат преобразувани в нормална форма. Необходимо е също така да се предвиди, че стойностите на параметрите на страницата могат да се променят и дубликатите на такива страници трябва да бъдат изключени от анализа.

И накрая, трябва да напишете най-важната функция, която ще "сканира интернет" и ще търси страници, които може да съдържат уязвимост на SQL Injection.

След това замествам единичен цитат в параметрите на намерените страници, правя заявка и анализирам съдържанието на тези страници. Променливата errorMessages съдържа списък с най-често срещаните думи и фрази, открити в съобщенията за грешки в базата данни, и това са думите, които ще търся в отговорите на сървъра. Между другото, сайтове, работещи на популярни двигатели, при получаване на необичайна стойност на параметъра може да покажат съобщение, че опитът за хакване е предотвратен, или просто да върнат празна страница.

Чрез търсачката намерих няколко сайта с SQL Injection, няма да крия, че трябваше да търся дълго време, най-вече се натъкнах на обикновени грешки в базата данни, от които не можеше да се получи нищо интересно. Въпреки това програмата работи и може да опрости работата по анализиране на уязвимостта на вашите собствени проекти.

Заключение

Разбира се, кодът не е идеален, но мисля, че общата идея е ясна. Ако говорим за каквоби било хубаво да се приложи, тогава това са такива дреболии като анализиране на заглавки, главно обработка на отговори с код 301 и 302. В PHP това ще трябва да анализира HTTP заглавки, а в C # това може да се направи автоматично с помощта на свойството AllowAutoRedirect. Можете също така да проверите вида на съдържанието, което сървърът връща, така че да не се опитвате да намерите връзки във файл с изображение например. Що се отнася до POST заявките, в които също можете да намерите много дупки, тогава трябва да получите съдържанието от етикетите на формуляра, да намерите контролите в това съдържание и да създадете url от тях и да замените поне добрите стари единични кавички в параметрите. От техническа страна това не е трудно за изпълнение, въпреки че може да изглежда малко досадно за някого, т.к. ще трябва да се вземат предвид много различни фактори.