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
Форумы портала PHP.SU :: Версия для печати :: Фильтрация bash команд в строке
Форумы портала PHP.SU » » Операционная система и системные вызовы » Фильтрация bash команд в строке

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

1. In1ernal Error - 18 Августа, 2011 - 21:04:24 - перейти к сообщению
На сайте есть место, где можно редактировать пользовательские файлы, хранящиеся на сервере. Редактирование происходит с подключением по 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.  


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



Если у кого-то возникал подобный вопрос и было решение, то отпишите тут пожалуйста
2. DeepVarvar - 19 Августа, 2011 - 08:03:53 - перейти к сообщению
Не уверен что сработает, но попробуйте:

Еще что-то было у пхп для ограничения корневого рабочего каталога.
Поищите.
3. White - 19 Августа, 2011 - 08:12:06 - перейти к сообщению
DeepVarvar пишет:
Еще что-то было у пхп для ограничения корневого рабочего каталога
может chroot()?
4. DeepVarvar - 19 Августа, 2011 - 08:12:58 - перейти к сообщению
Тооочна..
5. In1ernal Error - 19 Августа, 2011 - 17:50:10 - перейти к сообщению
Bash команды выполняются от отдельного юзера.
В его корневой директории и лежат искомые файлы, которые надо защитить от кулхацкеров.
Поэтому в chroot() тут особого смысла нет. Нужна именно фильтрация команд
6. White - 19 Августа, 2011 - 19:07:12 - перейти к сообщению
а какую смысловую нагрузку несет в себе строка $str? может как то можно ее проверять на соответствие шаблону, например убрать из нее все пробелы и т.п.
7. DeepVarvar - 19 Августа, 2011 - 21:06:39 - перейти к сообщению
White пишет:
убрать из нее все пробелы и т.п.

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

Думаем дальше...
8. In1ernal Error - 21 Августа, 2011 - 01:25:29 - перейти к сообщению
Дак вот именно, что никакого смысла. Эта строка - строка конфига, который юзер редактирует через сайт
9. White - 21 Августа, 2011 - 09:37:09 - перейти к сообщению
In1ernal Error тогда если так.
1. получаем содержимое конфига.
2. создаем tmp файл в доступном для php месте.
3. записываем туда редактированный конфиг
4. перемещаем файл заменяя старый конфиг.
при этом в консоль не идут вообще никакие данные от юзера.

 

Powered by ExBB FM 1.0 RC1