MonoのWebClientにおけるURI
発端
発端は前の記事にあるように、tkbctf3の問題としてmiocatなるものを出してみたのはいいものの、意図とは異なる脆弱性を作り込んで250点問題が超絶ボーナス問題になりましたよ、というお話しです。
調査
miocatはC#で書かれており、実際の運用ではMonoランタイムで動いていました。というわけでMonoのソースコードを読めば解決です。やったね。
そういうわけでまずはWebClient
の実装を読んでみたのですが、怪しい箇所が一発で見つかりました。WebClient.cs#798、privateメソッドであるCreateUri(string)
なるメソッドです。DownloadString(string)
は、その引数をこのメソッドに渡してDownloadData(Uri)
を呼び出します。
try-catch
の中で渡されたアドレス(と、baseAddress
)を元にUri
のインスタンスを作ってCreateUri(Uri)
に渡していますが、ここで例外が発生するとreturn new Uri(Path.GetFullPath(address))
という恐怖のコードが走ります。