продолжение
Итак после того, как мы разобрались с ошибками характерных для perl, перейдем к следующему виду ошибок, которые касаются не только cgi, но и остальных приложений, например php
Ошибка # 3 межсайтовый скриптинг
Вы думали не актуально? ага щас... В perl подобное тоже присутствует.
В чем же все заключается?
Да все просто, эта ошибка начинается сразу после того, как мы ввели
print "Content-Type: text/html\n\n";
Теперь и Script тоже будет выполняться, и если программист разрешил пользователю скрипта присваивать значения некоторым переменным, которые в итоге выводятся в контенте страницы, причем без всяких ограничений, то это выливается в XSS рассмотрим наипростейший скрипт.
Код:
#!/usr/bin/perl
use CGI qw(:standard);
$parametr=param(load);
print "Content-Type: text/html\n\n";
print "$parametr";
в последней строчке, мы просто выводим переменную, которую может определить пользователь, а ему ничто не мешает в качестве параметра передать.
Код:
www.site/cgi-bin/script.pl?load=<script>alert('xak')</script>
То есть присвоить $parametr злое значение, которое в итоге выводится и выскакивает алертом. Многие программисты используют вывод в контент. Обычно можно наблюдать в полях поиска и в других ситуациях, когда нужна некая определенность.
Защита
Если уж сильно приспичило, выводите на здоровье, но поставьте хоть банальный фильтр на ненужные символы.
Код:
#!/usr/bin/perl
use CGI qw(:standard);
$parametr=param(load);
print "Content-Type: text/html\n\n";
$parametr =~ s/([;<>\*\|`&\$!#\(\)\[\]\{\}:'"\n])/\\$1/g;
print "$parametr";
Такой код очень попортит затеи хакера, если попытаться присвоить нашей переменной то же самое значение
Код:
www.site/cgi-bin/script.pl?load=<script>alert('xak')</script>
то фильтр хорошенько попортит скрипт и в результате выдастся что-то вроде.
Код:
\<script\>alert\(\'xak\'\)\</script\>
Такое чучело конечно же не подлежит выполнению.
Ошибка # 4 неаккуратное использование команды system()
Известны такие скрипты, которые используют для работы сие чудо. Эта функция несет самую, что есть прямую опасность.
Код:
#!/usr/bin/perl
use CGI qw(:standard);
$parametr=param(load);
print "Content-Type: text/html\n\n";
system($parametr);
Опять же простенький скрипт. И если передать параметру Load передать значение id который потом присвоится переменной $parametr. В результате мы будем наблюдать. Результат выполнения этой команды. Что не есть хорошо. Скрипты испольщующие эту функцию иногда встречаются, не так часто как вышеперчисленный, но встречаются.
Как защитить?
Выход всегда есть.
Самое главное давать system'у только свои значения, нельзя, чтобы они как-то передавались пользователем скрипта.
Код:
#!/usr/bin/perl
use CGI qw(:standard);
$parametr=param(load);
print "Content-Type: text/html\n\n";
if ($parametr eq com1) {
system("ваша команда");
}
if ($parametr eq com2) {
system("другая ваша команда");
}
else {
print"error";
}
вроде как ничего сложного, а обезопасить подобные скрипты всегда стоит.
Ошибка # 5 sql injection
И в perl есть модули для работы с базами данных. На этом особо внимание зациклиать не буду, так как проведение sql inj, и защита в perl. Мало чем отличается от этого например в php.
Google
Сайтов-жертв найти можно ООЧЕНь большое количество. Можно использовать для этих целей гугл например:
Код:
inurl:"/cgi/bin/index.cgi?file="
inurl:"/cgi/bin/index.pl?id="
B тому подобные запросы. Уязвимых скриптов хватает.
Заключение
Вот и все, что я хотел на данный момент рассказать, если есть дополнения или ошибки, жду комментариев, чтоб поправить или дополнить. На этом все, спасибо за прочтение.
(С)ImpLex