用constantize在ruby中远程执行代码

gin*_*ime 8 ruby security ruby-on-rails

我正在尝试contantize使用ruby/rails中的远程代码执行漏洞.

我知道能够为服务器提供任何类名可能是有潜在危险的,但我想知道这本身是否危险.

例如,如果rails控制器代码看起来像这样(即在实例化对象上执行硬编码方法):

klass = params[:class].classify.constantize
klass.do_something_with_id(params[:id]) if klass.respond_to?('do_something_with_id')
Run Code Online (Sandbox Code Playgroud)

这段代码容易受到攻击 或者只是结合能够同时指定要在类上调用的方法?

Jon*_*rns 7

将字符串转换为常量本身并不危险,但是如何使用该常量是有潜在危险的(即随后调用的方法).

如果你真的需要这样做,那么最好提供一个允许的类列表.例如

klass = params[:class].classify
if %w(Class1 Class2 Class3).include? klass
  klass.constantize.do_something_with_id(params[:id])
else
  raise 'Forbidden'
end
Run Code Online (Sandbox Code Playgroud)

无论如何,它可以帮助您在晚上睡觉,知道输入相当有限.

更新

另一种控制创建的方法是使用case语句:更明确但更冗长.

def create_klass(option)
  case option
  when "option1"
    Class1
  when "option2"
    Class2
  when "option3"
    Class3
  else
    raise "Unknown option"
  end
end
Run Code Online (Sandbox Code Playgroud)

这样,您就不需要将系统的内部暴露给客户端.如果有很多选项,那么您可以使用带有选项映射到类的哈希.