Проблема внедрения команд в методе контроллера - PullRequest
0 голосов
/ 20 января 2020

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

Дело в том, что я написал некоторый код для размещения кнопки в форме, поэтому, когда вы нажимаете на нее, вы проверяете некоторые вещи. Итак, у меня есть кнопка, которая вызывает метод test_oid, который находится в моем контроллере. Этот метод отображает файл с тем же именем и так далее.

Моя проблема в методе контроллера. Этот метод вызывается через ajax, и я передаю некоторые параметры через ajax этому контроллеру, параметры, которые имеют значение с params [: что угодно]. Теперь, когда я отправляю sh это на мой gitlab, я пытаюсь слить, это говорит мне об уязвимости с помощью некоторого внедрения команд в этом методе, и очевидно, что это связано с параметрами.

Я знаю о name_object_params, в котором вы разрешаете, какие из них вы хотите использовать. Это мой метод params:

def monitor_category_params
    params.require(:monitor_category)
      .permit(:name, :description, :technology, :category, :main_category,
              :impact, :operation, :sensor_types, :default,:oid, :snmp_vars, :snmp_oper,
              :custom_tab_name, :custom_tab_unit, :redfish, :ipmi)
  end

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

Теперь, это мой метод в контроллере:

def test_oid
    oid_result = ''
    sensor_id = nil
    sensor_ip = params[:sensor_ip] || nil
    oid = params[:oid] || nil
    if number?(params[:sensor_id])
      sensor_id = params[:sensor_id]
    end
    community = Sensor.find(sensor_id).snmp_community if !sensor_id.nil?
    if oid and community and sensor_ip
      oid_result = `whatever`
    end
    if request.xhr?
      render json: {result: oid_result}, :layout => false
    end
  end

и это вызов этого метода из ajax:

$.ajax({
       url: "/monitor/test_oid",
       type: 'GET',
       dataType: 'json',
       data: {oid: valor, sensor_id: sensor_id, sensor_ip: sensor_ip}
     })

, где я передаю переменные, которые я использую позже с параметрами.

Так в чем здесь проблема? Код работает и все, но есть эта проблема безопасности, в которой, я думаю, люди могут вводить код с параметрами, но поскольку параметры, с которыми я работаю, взяты из ajax, в чем проблема? Спасибо за ответы, я очень новичок в этом языке и все еще пытаюсь понять маги c.

Эта ошибка, которую возвращает тест.

+SECURITY WARNINGS+

+------------+-------------------+----------+-------------------+------------->>
| Confidence | Class             | Method   | Warning Type      | Message     >>
+------------+-------------------+----------+-------------------+------------->>
| High       | MonitorController | test_oid | Command Injection | Possible com>>
+------------+-------------------+----------+-------------------+------------->>

edit: as предложил, я использовал open3.capture2 вместо обратных галочек, так что теперь мой код выглядит так:

def test_oid
    oid_result = ''
    sensor_id = nil
    sensor_ip = params[:sensor_ip] || nil
    oid = params[:oid] || nil
    if number?(params[:sensor_id])
      sensor_id = params[:sensor_id]
    end
    community = Sensor.find(sensor_id).snmp_community if !sensor_id.nil?
    if oid and community and sensor_ip
      # We use Open3.capture2 to skip a command injection security problem.
      oid_result = Open3.capture2('nice', '-n', '19', 'snmpbulkwalk', '-v', '2c', '-c', community, sensor_ip, oid)
      oid_result2 = `echo "#{oid_result.first}" | awk '/kB$/{ $(NF-1)= $(NF-1)*1024;} {print $0}'  | sed 's/ [A-Za-z]*$//' | awk '{print $NF}' | grep -o '[[:digit:]]*' | paste -s -d';' -`
    end
    if request.xhr?
      render json: {result: oid_result2}, :layout => false
    end
  end

теперь тест выдает мне 2 ошибки ввода команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...