Open-URIを使用することの危険性

RubyのOpenURIは、 Net:HTTP / HTTPS / FTPを組み合わせた、URLの操作を大幅に簡素化する標準ライブラリであり、単なるオープンメソッドです。 私の知る限り、これはファイルをダウンロードしたり、リクエストを取得したり、データを読み込んだりする最も一般的な方法です。



しかし、実際に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)を作成する代わりにオープンシステムメソッドを拡張するのがいかに悪い考えであるかを示す良いデモンストレーションです。



レールの魔法の問題に関する私の過去の考え



All Articles