|

CGI-Checker по-русски
Xakep, номер #021, стр. 021-038-2
$end="\015\012"; # Код завершения строки, он нестандартный в протоколе http
$site="www.chat.ru"; # Сам сайт
$port=80; # Порт, на котором установлен нужный сервис
$addr=(gethostbyname($site))[4]; # Определяем ip сервера
$addrs=pack ('S n a4 x8', $AF_INET, $port, $addr);
# Переводим ip сервера и порт в специальный формат
if (!(socket(LOAD,$AF_INET,SOCK_STREAM,$protocol))){
print "Невозможно создать сокет!"; exit;} # Создаем сокет, если не можем, то ОШИБКА
if (!(connect(LOAD, $addrs))){
print "Невозможно соединиться!"; exit;} # Соединяемся, если не можем, то ОШИБКА
select(LOAD); $|=1; select(STDOUT); # Ставим, что все данные серверу отправились сразу
print LOAD "HEAD /cgi-bin/test.cgi HTTP/1.0$end"; # Вот и сам запрос
print LOAD "Host: $site$end$end"; # Его завершение
$str=<LOAD>; # Считываем ответ (только одну строку)
if ($str=~/200/) {print "НАЙДЕН!\n";} # Если ответ содержит число 200, то файл существует
else {print "не найден\n";} # А если нету
close (LOAD); # Закрываем соединение
Вот и вся программа, код получился небольшой, но ты внимательно разберись, а то толку мало получится, если ничего не поймешь. :(
Теперь усложним нашу задачу: нужно, чтобы имена дырявых скриптов считывались из файла. Пусть он будет называться cgi.dat. Он должен быть примерно следующего содержания:
/cgi-bin/environ.cgi
/cgi-bin/php.cgi
/cgi-bin/php
/cgi-bin/perl.exe
Также программа должна выводить лог своих действий на экран и в отдельный файл. Еще можно включать/выключать режим, чтобы программа показывала и записывала только информацию о найденных скриптах. Назови программу- check.pl, вот ее содержание:
#!/usr/bin/perl
# Это обозначает Perl программу
use Socket; # Использовать модуль для сокетов
$AF_INET=2; # Эту цифру нужно просто запомнить
$SOCK_STREAM=1; # Эту тоже
$protocol=(getprotobyname('tcp'))[2]; # Выбираем протокол TCP
$end="\015\012"; # Код завершения строки, он нестандартный в протоколе http
$cgi="cgi.dat"; # Файл с именами дырявых скриптов
$out="found.txt"; # Имя файла, где ведется лог
$site="www.chat.ru"; # Сам сайт
$port=80; # Порт сайта
$out_f=0; # Записывать лог файл 0 - нет, 1 - да
$out_m=1; # Выводить лог на экран 0 - нет, 1 - да
$all=1; # Говорить о несуществующих скриптах 0 - нет, 1 - да
$addr=(gethostbyname($site))[4]; # Определяем ip сайта
$addrs=pack ('S n a4 x8', $AF_INET, $port, $addr);
# Переводим ip сайта и порт в специальный формат
open (DAT, $cgi); # Открываем файл с дырявыми скриптами
while ($cur=<DAT>){ # Считываем имя, если еще не конец файла, то продолжаем
chomp ($cur); # Удаляем символ завершения строки
if (!(socket(LOAD,$AF_INET,SOCK_STREAM,$protocol))){
print "Невозможно создать сокет!"; exit;} # Создаем сокет, если не можем, то ОШИБКА
if (!(connect(LOAD, $addrs))){
print "Невозможно соединиться!"; exit;} # Соединяемся, если не можем, то ОШИБКА
select(LOAD); $|=1; select(STDOUT); # Ставим, что все данные серверу отправились сразу
print LOAD "HEAD $cur HTTP/1.0$end"; # Вот и сам запрос
print LOAD "Host: $site$end$end"; # Его завершение
Назад на стр. 021-038-1 Содержание Вперед на стр. 021-038-3
|