Предотвращение внедрения кода в sh из http-демона busybox

#linux #shell #security #busybox

#linux #оболочка #Безопасность #busybox

Вопрос:

У меня следующий сценарий:

httpd busybox (https://openwrt.org/docs/guide-user/services/webserver/http.httpd ) установлен в моей встроенной системе Linux, и я вызываю скрипты из подпапки /cgi-bin/ .

Я вызываю скрипты и предоставляю GET-параметры, которые пересылаются фактической команде (вызываемой в скрипте) (например, из «…?param1= привет amp; param2=текст » to «-param1 привет -param2 текст») .

Я хочу предотвратить то, что кто-то может расширить мою очередь get для ввода других команд; что-то вроде этого:

 "http://192.168.1.1/cgi-bin/myScript?param=1%2&&,at /etc/passwd"  
  

Какой URL-адрес будет декодирован в командной строке

param=1 amp;amp; cat /etc/passwd

(Я имею в виду, что это создаст командную строку «MyApp -параметр 1 amp;amp; cat /etc / passwd», поэтому я ввожу вторую команду независимо от первой и могу, например, вывести список пользователей в моей системе)

Конечно, приведенный выше синтаксис неверен, мне интересно, как злоумышленник должен был бы написать это / если это вообще сценарий атаки / что мне пришлось бы фильтровать, чтобы предотвратить такие запросы. Достаточно ли amp;amp; и ; фильтрации?

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

Спасибо всем

Ответ №1:

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

В этом случае то, что вы хотите сделать, это перенести данные в переменную и убедиться, что любой потенциально вредоносный код, введенный из неконтролируемого источника в виде данных, превращается в строку (или выполняет другие действия, такие как создание отчетов с ним), прежде чем он может быть случайно выполнен.

В вашем примере не указано, на каком языке написаны ваши CGI-скрипты, например perl , ruby , shell , или что-то еще. Основываясь на ваших опасениях в amp;amp; cat /etc/passwd качестве примера вредоносной активности, похоже, вы хотите предотвратить внедрение кода оболочки, которое является формой выполнения произвольного кода. Существует ряд специальных символов, которые могут вызвать случайное выполнение произвольного кода на shell языке, поэтому я бы отфильтровал все, что не является числовым для параметров.

Это можно легко сделать с помощью простой egrep команды и предложения or ( || ), например:

 param1=$(echo $param1 |egrep '^[0-9]$') || param1=""