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