Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Фильтрация bash команд в строке

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
In1ernal Error
Отправлено: 18 Августа, 2011 - 21:04:24
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2010  


Помог: 0 раз(а)




На сайте есть место, где можно редактировать пользовательские файлы, хранящиеся на сервере. Редактирование происходит с подключением по SSH.

Вкратце схема такая:

PHP:
скопировать код в буфер обмена
  1. $command.="echo \"$str\" >> $file;";

Где $str - строка, полученная от пользователя; $file - нужный мне файл.

Но здесь можно сделать инъекцию(не знаю даже как ее назвать, php/bash наверное), например, если в $str пользователь передаст строку

Цитата:
\" >> $file; touch admin_n00b; echo \"

то в итоге получится

PHP:
скопировать код в буфер обмена
  1. $command.="echo \"\" >> $file; touch admin_n00b; echo \"\" >> $file;";


То есть пользователь сможет выполнять на сервере все, что ему захочется (только то, что позволяют права, но все равно бяка будет)

Я попытался решить эту проблему просто отфильтровав некоторые значимые команды:

PHP:
скопировать код в буфер обмена
  1.  
  2. function check_bash_inj($str){
  3.         $bash = array(0 => 'rm ', 1 => 'cd ', 2 => 'touch ', 3 => 'cat ', 4 => 'echo ', 5 => '/etc', 6 => '/data', 7 => '/var', 8 => ';', 9 => 'ls ', 10 => 'mv ', 11 => 'su ', 12 => 'sudo ');
  4.         foreach($bash as $key => $value){
  5.                 if(strlen($str) < 64){
  6.                         if(strpos($str, $value) !== false){
  7.                                 new_mail("bash_inj: $str ____ $value");
  8.                                 die("Access denied. This incident will be reported");
  9.                         }
  10.                 } else {
  11.                         new_mail("strlen: ".strlen($str)."\r\n  str: $str\r\n   serv_id: $serv_id");
  12.                         die("String length exceeded (max 64)");
  13.                 }              
  14.         }
  15. }
  16.  


Но ведь команд сотни, и все их сюда не записать, тем более что могут быть и простые безобидные совпадения, если команд очень много.



Если у кого-то возникал подобный вопрос и было решение, то отпишите тут пожалуйста
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 08:03:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Не уверен что сработает, но попробуйте:

Еще что-то было у пхп для ограничения корневого рабочего каталога.
Поищите.
 
 Top
White
Отправлено: 19 Августа, 2011 - 08:12:06
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




DeepVarvar пишет:
Еще что-то было у пхп для ограничения корневого рабочего каталога
может chroot()?


-----
if(time()>1356048000) die();
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 08:12:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Тооочна..
 
 Top
In1ernal Error
Отправлено: 19 Августа, 2011 - 17:50:10
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2010  


Помог: 0 раз(а)




Bash команды выполняются от отдельного юзера.
В его корневой директории и лежат искомые файлы, которые надо защитить от кулхацкеров.
Поэтому в chroot() тут особого смысла нет. Нужна именно фильтрация команд
 
 Top
White
Отправлено: 19 Августа, 2011 - 19:07:12
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




а какую смысловую нагрузку несет в себе строка $str? может как то можно ее проверять на соответствие шаблону, например убрать из нее все пробелы и т.п.

(Отредактировано автором: 19 Августа, 2011 - 19:07:29)



-----
if(time()>1356048000) die();
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Августа, 2011 - 21:06:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




White пишет:
убрать из нее все пробелы и т.п.

In1ernal Error пишет:
команд сотни, и все их сюда не записать, тем более что могут быть и простые безобидные совпадения, если команд очень много.

Думаем дальше...
 
 Top
In1ernal Error
Отправлено: 21 Августа, 2011 - 01:25:29
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2010  


Помог: 0 раз(а)




Дак вот именно, что никакого смысла. Эта строка - строка конфига, который юзер редактирует через сайт
 
 Top
White
Отправлено: 21 Августа, 2011 - 09:37:09
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




In1ernal Error тогда если так.
1. получаем содержимое конфига.
2. создаем tmp файл в доступном для php месте.
3. записываем туда редактированный конфиг
4. перемещаем файл заменяя старый конфиг.
при этом в консоль не идут вообще никакие данные от юзера.


-----
if(time()>1356048000) die();
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Операционная система и системные вызовы »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB