しかし、実際に
require "open-uri"
パッチKernel.openが
require "open-uri"
、異なる引数に対して異なるコードを呼び出します。これにより、サーバー上のファイルのリモートコード実行または読み取りが行われる可能性があります。
open(params[:url])
は、url =
|ls
で始まるコード実行です。 システムコールとみなされます。
open(params[:url]) if params[:url] =~ /^http://
url =
|touch n;\nhttp://url.com
( 壊れたレギュラーはRCEにつながる可能性があり、\ Aを使用\ z )。
open(URI(params[:url]))
はサーバー上のすべてのファイルを読み取ります。 url = / etc / passwdは有効なURLですが、引数がhttpで始まっていないため、open-uriは元のKernel.openを呼び出します://
open-uriは、Rubyが最初から問題を作成する方法の優れたデモンストレーションです。ユーザー入力を含む可能性が高い外部URLを読み取るためにのみ、重要なシステムメソッドにパッチを適用します。 また、RailsにはデフォルトでXMLパーサーが付属していたため、これについては誰にも警告しません。これは、すべての鉄道サイトでRCEをもたらしました。
別の例:
open(params[:url]) if URI(params[:url]).scheme == 'http'
。 すでに良く見えますが、httpフォルダーを作成できた場合、攻撃者は
http:/../../../../../etc/passwd
(hello、CarrierWave!)を使用して任意のファイルを読み取ることができます。 もちろん、このようなフォルダーを作成できるとは考えられませんが、これはURL解析が難しい理由と、別個のopenURI(url)を作成する代わりにオープンシステムメソッドを拡張するのがいかに悪い考えであるかを示す良いデモンストレーションです。
レールの魔法の問題に関する私の過去の考え 。