Vortex777
Интересующийся
- Регистрация
- 27.06.2022
- Сообщения
- 98
- Реакции
- 0
- Гарант продажи
- 0
- Гарант покупки
- 0
- Депозит
- 0 р
SQL Injection – это довольно распространенная уязвимость web-сайтов, позволяющая злоумышленнику выполнять свой SQL-код путем подстановки его в ожидаемые параметры страницы. Таким образом, злоумышленник может запросто получить доступ к секретным данным, добавить, изменить или удалить данные.
В данной статье я расскажу и покажу на примерах языков PHP и C#, как написать программку, которая будет автоматически сканировать заданные сайты на предмет наличия в них уязвимости типа SQL Injection. Естественно, все это делается в целях устранения таких уязвимостей.
Постановка задачи
Первым делом необходимо определиться с задачами. Программа должна уметь:
Выполнить простейший HTTP-запрос несложно и в рамках данной статьи, дальше GET-запросов нам ходить не придется.
Список ссылок можно получить при помощи регулярных выражений. Нас будут интересовать только ссылки с параметрами, поскольку именно через параметры будет производиться поиск уязвимостей. Конечно же, поиск уязвимостей не ограничивается параметризированными адресами, уязвимость можно найти и при передаче данных через форму. Особенно это касается элементов формы, которые пользователь якобы не может изменять, таких, как списки (select) или скрытые поля формы (hidden). Но в рамках данной статьи я ограничусь лишь поиском уязвимостей в параметрах страницы.
В качестве SQL-кода, который будет добавляться в параметры страницы, можно использовать обычную одинарную кавычку ('), этого вполне достаточно, чтобы при наличии кривых рук у web-программистов сервер выдал какую-нибудь ошибку. Довольно часто web-программисты делают ошибки именно с кавычками, особенно часто подобные ошибки допускаются в типах данных, когда параметр вроде бы является числом, но в тоже время, за счет особенностей используемых технологий, может содержать строковые данные.
Подобными ошибками частенько страдают сайты, написанные на классическом ASP и PHP, обычно по причине неопытности или банальной лени программистов. Стоит заметить, что в ASP.NET вероятность возникновения SQL Injection равна практически нулю, и чтобы создать подобную уязвимость, руки у программиста действительно должны расти совсем не оттуда, откуда обычно растут. Учитывая это, пытаться найти SQL Injection на сайте, написанном на ASP.NET, особого смысла нет.
Реализация
Итак, задача поставлена, приступим к реализации. Первым делом напишем функцию, которая будет выполнять обычный GET-запрос.
В PHP функция ExecuteHTTPGetRequest принимает два параметра. Первый – адрес странички, которую нужно получить, а второй – булевский параметр, указывающий, нужно ли получить всю страницу, или только тэги <a></a>.
В C# функция принимает только адрес странички. В отличие от PHP, в C# прописаны обработчики ошибок. Кроме того, в C# (да и вообще в .Net Framework) может возникнуть ошибка типа «The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF», происходящая на почве неразберихи в стандартах. Для её предотвращения необходимо в файл конфигурации проекта (app.config или web.config) добавить следующие строки:
Далее, нам понадобится функция, которая будет искать и фильтровать адреса страниц. Для хранения адресов предусмотрены две переменные. Первая будет содержать список страниц, которые нужно просканировать, а вторая – список страниц с параметрами, которые мы будет проверять на наличие уязвимости.
Как я уже ранее говорил, поиск ссылок будет производиться при помощи регулярных выражений. Следует учесть, что ссылки могут содержать относительный путь, поэтому такие ссылки нужно будет преобразовать в обычный вид. Также необходимо предусмотреть, что значения параметров страницы могут меняться, и дубликаты таких страниц нужно исключить из анализа.
В данной статье я расскажу и покажу на примерах языков PHP и C#, как написать программку, которая будет автоматически сканировать заданные сайты на предмет наличия в них уязвимости типа SQL Injection. Естественно, все это делается в целях устранения таких уязвимостей.
Постановка задачи
Первым делом необходимо определиться с задачами. Программа должна уметь:
- Выполнять простейшие HTTP-запросы.
- Получать список всех внутренних ссылок сайта.
- Добавлять свой SQL-код в параметры адресов страниц.
- Анализировать полученный результат.
Выполнить простейший HTTP-запрос несложно и в рамках данной статьи, дальше GET-запросов нам ходить не придется.
Список ссылок можно получить при помощи регулярных выражений. Нас будут интересовать только ссылки с параметрами, поскольку именно через параметры будет производиться поиск уязвимостей. Конечно же, поиск уязвимостей не ограничивается параметризированными адресами, уязвимость можно найти и при передаче данных через форму. Особенно это касается элементов формы, которые пользователь якобы не может изменять, таких, как списки (select) или скрытые поля формы (hidden). Но в рамках данной статьи я ограничусь лишь поиском уязвимостей в параметрах страницы.
В качестве SQL-кода, который будет добавляться в параметры страницы, можно использовать обычную одинарную кавычку ('), этого вполне достаточно, чтобы при наличии кривых рук у web-программистов сервер выдал какую-нибудь ошибку. Довольно часто web-программисты делают ошибки именно с кавычками, особенно часто подобные ошибки допускаются в типах данных, когда параметр вроде бы является числом, но в тоже время, за счет особенностей используемых технологий, может содержать строковые данные.
Подобными ошибками частенько страдают сайты, написанные на классическом ASP и PHP, обычно по причине неопытности или банальной лени программистов. Стоит заметить, что в ASP.NET вероятность возникновения SQL Injection равна практически нулю, и чтобы создать подобную уязвимость, руки у программиста действительно должны расти совсем не оттуда, откуда обычно растут. Учитывая это, пытаться найти SQL Injection на сайте, написанном на ASP.NET, особого смысла нет.
Реализация
Итак, задача поставлена, приступим к реализации. Первым делом напишем функцию, которая будет выполнять обычный GET-запрос.
Код:
function ExecuteHTTPGetRequest($url, $deleteAllTags)
{
$url = parse_url($url); // разбираем url
$host = $url["host"];
$path = $url["path"];
$req = "GET $path HTTP/1.1\r\nUser-Agent: Bulbulator\r\n"
. "Host: $host\r\nConnection: Close\r\n\r\n";
$fp = fsockopen($host, 80); // открываем сокет
if (!$fp)
{ // ошибка
return
"Error.";
}
else
{
// отправляем запрос
fputs($fp, $req);
// считываем полученные данные в переменную кусками по 256 байт
$data = "";
while (!feof($fp))
{
$data .= @fgetss($fp, 256, $deleteAllTags === true ? "<a>" : NULL);
}
fclose($fp); // закрываем сокет
return $data; // возвращает полученные данные
}
}
Код:
string ExecuteHTTPGetRequest(string url)
{
try
// делаем запрос и возвращаем ответ
{
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
using(
StreamReader sr =
new StreamReader(rsp.GetResponseStream(),
Encoding.GetEncoding(1251)))
{
return sr.ReadToEnd();
}
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError
&& ex.Message.Contains("500"))
{ // если ошибка сервера, получаем ее описание
using (
StreamReader sr = new StreamReader(
ex.Response.GetResponseStream(), Encoding.GetEncoding(1251)))
{
return sr.ReadToEnd();
}
}
}
return
string.Empty; // другая ошибка
}
В C# функция принимает только адрес странички. В отличие от PHP, в C# прописаны обработчики ошибок. Кроме того, в C# (да и вообще в .Net Framework) может возникнуть ошибка типа «The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF», происходящая на почве неразберихи в стандартах. Для её предотвращения необходимо в файл конфигурации проекта (app.config или web.config) добавить следующие строки:
Код:
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
Код:
var $taskUrls = array(); // очередь адресов
var $analysUrls = array(); // адреса для анализа
Код:
List<string> _taskUrls = new List<string>();
List<string> _analysUrls = new List<string>();