TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
練習問題のScoreServerで学ぶ
ウェブセキュリティ
@nomuken
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
Agenda(このスライドの)
1. 自己紹介
2. 楽しいインターネット
3. Webの脆弱性のお話
4. 練習問題の答え合わせ
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
1.自己紹介
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
自己紹介
●
Nomuken (@nomuken)
●
ArchLinuxとごちうさと初音ミクが好き
●
CTFとか面白いけどマジわからない系男子
●
調子乗ってmlabCTFやったらTDUCTFの主催になっていた
●
大学2年生 (あと3日で3年生)
●
好きな脆弱性はディレクトリトラバーサルとOSコマンドイン
ジェクション
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
2.楽しいインターネット
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
楽しいインターネット
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
楽しいインターネット
●
練習問題を公開して沢山のアクセスが来ました
●
GEKI-YABA
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
来訪者の皆様
●
ShellShock
●
機械的なアクセス
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
来訪者の皆様
●
何らかのペネトレーションツール(と思われる物)の利用
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
来訪者の皆様
●
SQLi勢(とXSS勢)
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
来訪者の皆様
●
alert勢
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
来訪者の皆様
●
CSRF勢
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
来訪者の皆様
●
admin勢
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
_人人人人人人人人人人人人人_
> 後半,同じ人じゃねぇか <
 ̄Y Y Y Y Y Y Y Y Y Y Y Y Y^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ̄
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
感想
●
…… ……あぁ 狙われているなぁ
●
攻撃成立しちゃってんじゃねぇか,やだー
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
極めつけ
●
"GET /question/?%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E9%96%8B
%E5%82%AC%E3%80%81%E3%81%8A%E5%BE
%85%E3%81%A1%E3%81%97%E3%81%A6%E3%81%8A%E3%82%8A%E3%81%BE
%E3%81%99%E2%98%86%EF%BC%88%E3%82%9D%CF%89%E3%83%BB%EF
%BC%89v HTTP/1.1"
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……つまり
●
「リモート開催、お待ちしております☆(ゝω・)v」
●
結構スマートかつさり気なくてカッコいい
●
……もしかして?
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
余談
●
載せてるとキリがない量で攻撃がありました
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……というわけで
●
スコアサーバーのWebっぽい脆弱性からXSSとSQLiについて話
します
●
やぎはしゅ先生によるXSSとSQLiの話はCTF4bで聞こう!
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
3.Webの脆弱性のお話
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……の前に
●
攻撃者は何がしたい?
●
例えば,先ほど見せた攻撃は何のためにする?
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
攻撃者の目的(Web関連において)
●
サーバーを奪取する
→自分の操作を増幅してくれるbotにしたい,bitcoinマイニングに使
……いたい
●
情報を奪いたい
……→クレジットカード番号,個人情報,パスワード
●
実力誇示
→これをする実力があると見せつける(過激派組織に多い?)
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……目的を達成するために
●
” ”ご存知の通り, 作者の粗 を探し,そこを踏み台にする.
→その粗が「XSS」だったり「SQLi ……」だったり
●
その粗こそ脆弱性
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
XSS
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
XSS(クロスサイトスクリプティング)
●
javascriptでよしなにする
●
解説はどう考えたってxss.moeな人がやるべきかもしれない
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
どういったものか
●
ウェブページ内で好きなjavascriptが実行できる.
→つまりブラウザでできることは大抵できる
●
目的としては,ページの書き換え,Cookieを盗んだり等
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……ところで
●
これ好きな人いますか?(例をphpで書きます)
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
_人人人人人人人人_
> 目を背けない <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
phpのコード
(略)
<body>
<h1>xss</h1>
<hr>
<form method="get">
<input type="text" name="s" value="<?php echo $_GET["s"];?>">
<button type="submit">Go</button>
</form>
</body>
(略)
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……つまり
●
GETで与えられたパラメータ(?s=hoge)をvalueに表示するプ
ログラム.
→検索機能とかがあるけれどサイトでよくある
●
適切にエスケープされてないがためにhtmlコードを渡すことが
できる
→javascriptを埋め込める
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
こんな値で送信する
●
「” autofocus onfocus=”alert('yagihashoo');」
→送信してページを開いた瞬間にXSSと表示される
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
Demo
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
原理
●
<input type="text" name="s" value=" $_GET['s'] ">に注目
●
先ほどの入力を含めると
<input (略)value="" autofocus onfocus="alert('yagihashoo');">
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
出来上がったものを考える
●
valueの中身は今のところ興味ないのでひとまず終了("を入れ
る)する
●
autofocusでロードするとすぐに選択されるようになっている
●
イベントハンドラのonfocusで,対象のフォームが選択された
時,任意のjavascriptを実行する
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……結果的に
●
ページ開いた瞬間にjavascript実行できちゃいますね
●
ちなみに,単純にscriptタグを埋め込むことも出来ます.
→ "><script>alert('yagihashoo');</script><!--
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
原因
●
文字のエスケープ漏れによって発生します.
→適切にエスケープをしましょう
→でも,オレオレなエスケープ関数は作らないこと.漏れが
あったらどうする?
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……攻撃者的には
●
フォームに「特別な意味を持つ文字」を送信して表示された結
果からどのような文字を入れるべきかを考えます.
平均的な一般(?)攻撃者
" ' >< & ...
&#039; &quot; &gt; &lt; &amp;
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
まとめ
●
XSSとはページにjavascriptを埋め込めてしまう脆弱性
●
原因はユーザの入力文字列をエスケープできていないこと
●
そもそもあるライブラリもしくは,フレームワークを利用して
安全にエスケープしていきましょう
●
ユーザーはほぼ全員が敵と考えるほうが無難か?
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
SQLi
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
SQLi(SQLインジェクション)
●
データベースを扱うSQLに起因する脆弱性です.
●
xss.moeなh(ry
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
どういったものか
●
存在するSQL文を全く別の意味に変え,想定するものとは別の
操作を出来てしまう脆弱性
●
目的としては,脆弱なWebアプリからユーザとパスワードを盗
……む,認証を通過する 等
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
phpのコード
$sql = "SELECT * FROM users WHERE id='".$_GET['s']."';";
$stmt = $pdo->query($sql);
foreach( $r as $stmt){
$article['title'] = $s['title']
...
}
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……つまり
●
一応記事を検索するプログラムのつもり.タイトルからキー
ワードが含まれる記事を探してきて表示をする.
●
適切にエスケープがされていないため,SQL文を改変すること
ができる.
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
こんな値を送信する
●
「' union all select 1,sql,1 from sqlite_master;--」
→データベース内に登録されている全てが表示された後,sql文
が表示される.
●
なお,ここではsqliteを想定します
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
Demo
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
何が起きた?
●
クエリに注目
SELECT * FROM users WHERE id='' union all select 1,sql,1
from sqlite_master;--';
●
任意のテーブルからデータを取り出せた!
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
解説
●
「' 」でidに対する検索文字列を終了する
●
「union all select 」でテーブルの連結を行う
→他のテーブルから値を取り出し連結する
●
「1,sql,1」で1という値とsqlカラムの内容を取り出す
→ちなみに,3つカラムを指定しているのは,そもそものusersと数を合わせ
ているため
●
「from sqlite_master;--」でsqliteの各種データを持つテーブルにアクセス
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
原因
●
XSSと同様で文字列に対して適切にエスケープされていない
→なお,XSSへのエスケープとSQLへのエスケープは全く違う
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
対策
●
適切なエスケープを行いましょう
→SQLを書かなくても扱えるようなものを利用すると良いです
→でなくても,プリペアードステートメントの利用を!
→オレオレエスケープは絶対にダメ!
●
SQL文を覚えることも大切です
→攻撃が分かれば対策も取れるはず
TDU CTF 2014 Satellite in ConoHa
HashTag - #tductf
……攻撃者としては
●
SQLにとって特別な文字を入力しその反応を見るのが良いです
→多くの場合「'」や「"」 ……でエラーが出る はず.
● どのデータベースを利用しているか調べるのも重要です
→コメント文字の扱いを見るのも良いです.
sqliite → 「#」はコメントにならない(エラーにならない)
mysql → 「#」はコメントになる(エラーになる)

スコアサーバーに起きた脆弱性で学ぶWebセキュリティ

  • 1.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 練習問題のScoreServerで学ぶ ウェブセキュリティ @nomuken
  • 2.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf Agenda(このスライドの) 1. 自己紹介 2. 楽しいインターネット 3. Webの脆弱性のお話 4. 練習問題の答え合わせ
  • 3.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 1.自己紹介
  • 4.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 自己紹介 ● Nomuken (@nomuken) ● ArchLinuxとごちうさと初音ミクが好き ● CTFとか面白いけどマジわからない系男子 ● 調子乗ってmlabCTFやったらTDUCTFの主催になっていた ● 大学2年生 (あと3日で3年生) ● 好きな脆弱性はディレクトリトラバーサルとOSコマンドイン ジェクション
  • 5.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 2.楽しいインターネット
  • 6.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 楽しいインターネット
  • 7.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 楽しいインターネット ● 練習問題を公開して沢山のアクセスが来ました ● GEKI-YABA
  • 8.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 来訪者の皆様 ● ShellShock ● 機械的なアクセス
  • 9.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 来訪者の皆様 ● 何らかのペネトレーションツール(と思われる物)の利用
  • 10.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 来訪者の皆様 ● SQLi勢(とXSS勢)
  • 11.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 来訪者の皆様 ● alert勢
  • 12.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 来訪者の皆様 ● CSRF勢
  • 13.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 来訪者の皆様 ● admin勢
  • 14.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf _人人人人人人人人人人人人人_ > 後半,同じ人じゃねぇか <  ̄Y Y Y Y Y Y Y Y Y Y Y Y Y^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ̄
  • 15.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 感想 ● …… ……あぁ 狙われているなぁ ● 攻撃成立しちゃってんじゃねぇか,やだー
  • 16.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 極めつけ ● "GET /question/?%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E9%96%8B %E5%82%AC%E3%80%81%E3%81%8A%E5%BE %85%E3%81%A1%E3%81%97%E3%81%A6%E3%81%8A%E3%82%8A%E3%81%BE %E3%81%99%E2%98%86%EF%BC%88%E3%82%9D%CF%89%E3%83%BB%EF %BC%89v HTTP/1.1"
  • 17.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……つまり ● 「リモート開催、お待ちしております☆(ゝω・)v」 ● 結構スマートかつさり気なくてカッコいい ● ……もしかして?
  • 18.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 余談 ● 載せてるとキリがない量で攻撃がありました
  • 19.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……というわけで ● スコアサーバーのWebっぽい脆弱性からXSSとSQLiについて話 します ● やぎはしゅ先生によるXSSとSQLiの話はCTF4bで聞こう!
  • 20.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 3.Webの脆弱性のお話
  • 21.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……の前に ● 攻撃者は何がしたい? ● 例えば,先ほど見せた攻撃は何のためにする?
  • 22.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 攻撃者の目的(Web関連において) ● サーバーを奪取する →自分の操作を増幅してくれるbotにしたい,bitcoinマイニングに使 ……いたい ● 情報を奪いたい ……→クレジットカード番号,個人情報,パスワード ● 実力誇示 →これをする実力があると見せつける(過激派組織に多い?)
  • 23.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……目的を達成するために ● ” ”ご存知の通り, 作者の粗 を探し,そこを踏み台にする. →その粗が「XSS」だったり「SQLi ……」だったり ● その粗こそ脆弱性
  • 24.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf XSS
  • 25.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf XSS(クロスサイトスクリプティング) ● javascriptでよしなにする ● 解説はどう考えたってxss.moeな人がやるべきかもしれない
  • 26.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf どういったものか ● ウェブページ内で好きなjavascriptが実行できる. →つまりブラウザでできることは大抵できる ● 目的としては,ページの書き換え,Cookieを盗んだり等
  • 27.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……ところで ● これ好きな人いますか?(例をphpで書きます)
  • 28.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf _人人人人人人人人_ > 目を背けない <  ̄Y^Y^Y^Y^Y^Y^Y ̄
  • 29.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf phpのコード (略) <body> <h1>xss</h1> <hr> <form method="get"> <input type="text" name="s" value="<?php echo $_GET["s"];?>"> <button type="submit">Go</button> </form> </body> (略)
  • 30.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……つまり ● GETで与えられたパラメータ(?s=hoge)をvalueに表示するプ ログラム. →検索機能とかがあるけれどサイトでよくある ● 適切にエスケープされてないがためにhtmlコードを渡すことが できる →javascriptを埋め込める
  • 31.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf こんな値で送信する ● 「” autofocus onfocus=”alert('yagihashoo');」 →送信してページを開いた瞬間にXSSと表示される
  • 32.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf Demo
  • 33.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 原理 ● <input type="text" name="s" value=" $_GET['s'] ">に注目 ● 先ほどの入力を含めると <input (略)value="" autofocus onfocus="alert('yagihashoo');">
  • 34.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 出来上がったものを考える ● valueの中身は今のところ興味ないのでひとまず終了("を入れ る)する ● autofocusでロードするとすぐに選択されるようになっている ● イベントハンドラのonfocusで,対象のフォームが選択された 時,任意のjavascriptを実行する
  • 35.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……結果的に ● ページ開いた瞬間にjavascript実行できちゃいますね ● ちなみに,単純にscriptタグを埋め込むことも出来ます. → "><script>alert('yagihashoo');</script><!--
  • 36.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 原因 ● 文字のエスケープ漏れによって発生します. →適切にエスケープをしましょう →でも,オレオレなエスケープ関数は作らないこと.漏れが あったらどうする?
  • 37.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……攻撃者的には ● フォームに「特別な意味を持つ文字」を送信して表示された結 果からどのような文字を入れるべきかを考えます. 平均的な一般(?)攻撃者 " ' >< & ... &#039; &quot; &gt; &lt; &amp;
  • 38.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf まとめ ● XSSとはページにjavascriptを埋め込めてしまう脆弱性 ● 原因はユーザの入力文字列をエスケープできていないこと ● そもそもあるライブラリもしくは,フレームワークを利用して 安全にエスケープしていきましょう ● ユーザーはほぼ全員が敵と考えるほうが無難か?
  • 39.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf SQLi
  • 40.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf SQLi(SQLインジェクション) ● データベースを扱うSQLに起因する脆弱性です. ● xss.moeなh(ry
  • 41.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf どういったものか ● 存在するSQL文を全く別の意味に変え,想定するものとは別の 操作を出来てしまう脆弱性 ● 目的としては,脆弱なWebアプリからユーザとパスワードを盗 ……む,認証を通過する 等
  • 42.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf phpのコード $sql = "SELECT * FROM users WHERE id='".$_GET['s']."';"; $stmt = $pdo->query($sql); foreach( $r as $stmt){ $article['title'] = $s['title'] ... }
  • 43.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……つまり ● 一応記事を検索するプログラムのつもり.タイトルからキー ワードが含まれる記事を探してきて表示をする. ● 適切にエスケープがされていないため,SQL文を改変すること ができる.
  • 44.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf こんな値を送信する ● 「' union all select 1,sql,1 from sqlite_master;--」 →データベース内に登録されている全てが表示された後,sql文 が表示される. ● なお,ここではsqliteを想定します
  • 45.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf Demo
  • 46.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 何が起きた? ● クエリに注目 SELECT * FROM users WHERE id='' union all select 1,sql,1 from sqlite_master;--'; ● 任意のテーブルからデータを取り出せた!
  • 47.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 解説 ● 「' 」でidに対する検索文字列を終了する ● 「union all select 」でテーブルの連結を行う →他のテーブルから値を取り出し連結する ● 「1,sql,1」で1という値とsqlカラムの内容を取り出す →ちなみに,3つカラムを指定しているのは,そもそものusersと数を合わせ ているため ● 「from sqlite_master;--」でsqliteの各種データを持つテーブルにアクセス
  • 48.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 原因 ● XSSと同様で文字列に対して適切にエスケープされていない →なお,XSSへのエスケープとSQLへのエスケープは全く違う
  • 49.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf 対策 ● 適切なエスケープを行いましょう →SQLを書かなくても扱えるようなものを利用すると良いです →でなくても,プリペアードステートメントの利用を! →オレオレエスケープは絶対にダメ! ● SQL文を覚えることも大切です →攻撃が分かれば対策も取れるはず
  • 50.
    TDU CTF 2014Satellite in ConoHa HashTag - #tductf ……攻撃者としては ● SQLにとって特別な文字を入力しその反応を見るのが良いです →多くの場合「'」や「"」 ……でエラーが出る はず. ● どのデータベースを利用しているか調べるのも重要です →コメント文字の扱いを見るのも良いです. sqliite → 「#」はコメントにならない(エラーにならない) mysql → 「#」はコメントになる(エラーになる)