<?
if(isset($_GET['action']))
eval($_GET['action']."();");
function one()
{
echo "Hi 1!\n";
}
function two()
{
echo "Hi 2\n";
}
?>
Вроде мы хотели, чтобы пользователь выбрал действие - one или two и вызвалась соотв. функция. Но мы попробуем сценарий вызвать так:
phpinc.php?action=system('id');//
Таким образом, выпонится команда id на сервере. Нам даже не помеха magic_quotes_gpc, которая экранирует кавычки - достаточно изменить запрос так:
phpinc.php?action=system($_GET['cmd']);//&cmd=id
Однако нам помешает другая "вредная" директива - Safe_mode. Она запрещает функцию system() и ряд других.
Зщита от данной уязвимости - полный отказ от использования eval()
VI. Remote Command Execution в перл-скриптах в open()
Этот пример будет на перле, т.к. бага существует именно с скриптах, написанных на нем (замечу: в СКРИПТАХ - из-за криворукости кодера, интерпретатор перла тут не при чем).
Сначала пойдет теоритическая часть
В перле для открытия файлов существует функция open().
Ее используют так:
open(DESCRIPTOR, "filename"); ,
где DESCRIPTOR - создаваемый дескриптор файла,
а filename - имя файла. При чем, если указать просто имя вроде "database.dat", то файл открется для чтения. Если указать в виде ">file.txt", то для записи, ">>file" - для добавления. А теперь самое интересное - если указать "|id", то откроется канал (pipe) с указанной программой (id). Таким образом, можно выполнять команды на сервере.
А теперь пример уязвимого скрипта:
Code:
#!/usr/bin/perl
use CGI qw( :standard ); # подключаем библиотеку CGI
print header; # выводим заголовлок (Content-type)
open(FILE, param('file')); # открываем файл, имя файла - переданный параметр file
while($str=<FILE>) # читаем из файла. Операция <FILE> означает: прочесть строку из файла
# она возвращает false, когда подошел конец файла, таким образом этим циклом while мы обходим весь файл
{
print $str; # выводим прочитанное
}
close(FILE); # закрываем дескриптор
Я специально не стал сокращать и писать вроде while(<FILE>){print;} , дабы не запутать не знающих этого языка. Специально для них даны комментарии (они начинаются с #, кроме первой строки - там указан путь к интерпретатору перла).
А мы же попробуем вызвать сценарий так:
open.pl?file=|id
И у нас вместо файла откроется канал с процессом id, и результаты будут выведены на экран.
Последствия: исполнение любых команд (в пределах привиллегий демона httpd) на сервере.
Защита - фильтрование | в параметрах.
На этом позволю себе откланяться. Не серчайте сильно, если что упустил
Great (cribble[at]mail.ru, icq# 893-894), 16.11.2005
ВНИМАНИЕ! Автор статьи не несет ответственности за какое-либо использование данного материала в незаконных целях и за прочиненный этим вред!
Great (02.12.05, 22:01:02)
Совсем забыл, сорьки. Уязвимость php-including так же есть и в функции preg_replace($mask,$replacement,$string). Если указан модификатор /e, то после замены параметр $replacement будет расценен как рнр-код и выполнен интерпретатором. Таким образом поимели phpBB 2.0.15
Автор: Great