はじめに
セキュリティ学習のサービスを探していたところ、一部無料になった「KENRO」を見つけました。
そこで、このサービスで脆弱性の基礎を学びたいと思います。
引用:KENRO https://flatt.tech/kenro/
KENROとは
「KENRO」はWebエンジニアのセキュアコーディング習得を支援するSaaS型eラーニングサービスです。
「資料に目を通して三択問題のテストを受けるだけ」という一般的なeラーニングとは異なり、攻撃者が用いる手法を体験する「ハッキング演習」や、脆弱なソースコードを修正する「堅牢化演習」を通じて、より実践的なトレーニングを一元的に受講できます。
https://flatt.tech/kenro
Web脆弱性基礎編コース(トライアル版)
Web アプリケーションにまつわる基礎的な脆弱性を一通り学ぶことができるコースです。
ハッキング演習
Q1)基礎的な OS Command Injection 攻撃
演習環境には OS Command Injection 脆弱性が含まれています。
その脆弱性を利用し ls . コマンドを実行すると、flatt{...} 形式の文字列が見つかるはずです。
A1)
ping コマンドを実行できるアプリっぽい。他のコマンドも実行できる可能性がある。
入力欄にexample.com
を指定すると、ping example.com
の結果が返ってきた。
&&
を使えば、他のコマンドとか使えそうだと予測。
入力欄にexample.com && ls .
と入力。
フラッグを発見。
flatt{you_found_a_secret_url_with_os_command_injection}
Q2)XML External Entity 脆弱性を経由したファイルの読み出し
演習環境には XML External Entity 脆弱性が含まれています。
その脆弱性を利用し、サーバ中のファイル /flag.txt を読み出し、
その中に書かれた flatt{...} 形式の文字列を解答してください。
A2)
XML ドキュメントの中の <name> タグの中身を表示します。
と記載されているので、
正常系のファイルをアップロードしてみます。
ソースコード-正常系
<?xml version="1.0" encoding="utf-8" ?>
<top>
<name>TEST</name>
</top>
<name>
タグの中身が表示されました。では、次にアップロードするファイルを以下の様に改変します。
ソースコード-異常系
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE top [
<!ENTITY trap SYSTEM "file:///flag.txt">
]>
<top><name>&trap;</name></top>
trap
が呼び出されました。(これはSYSTEM "file:///flag.txt
を呼び出す)
フラッグ発見。
flatt{arbitrary_file_read_by_xxe}
Q3)iframe の透明化
演習環境に書かれた指示に従って、透明化された iframe タグを探し、
flatt{演習環境中で透明化されている iframe タグの class 属性の値} を解答してください。
詳しい指示は演習環境を確認してください。
A3)
F12キーにより開発者ページを開きます。
<style>
タグで囲まれている中身を確認します。
opacity
プロパティを用いることで要素の透明度を指定できるので、次の箇所が怪しそうです。
.sample-dgsgr4og {
opacity: 0%;
}
これに該当する<iframe>
タグの箇所を確認します。
フラッグ発見
flatt{sample-dgsgr4og}
Q4)Insecure Deserialization 脆弱性によるロジックの破壊
演習環境は入力として文字列を与えると、Hello, (与えた文字列) を画面に表示してくれる Web アプリケーションです。
また、途中の入力値の検査により、admin という値は入力値として与えられないようになっています。
しかし、このアプリケーションには Insecure Deserialization 脆弱性があります。
そのため、直接 Cookie 中のキー instance の値を直接変更することで、本来禁止されている入力値も与えられるようになっています。
例えば、Cookie を直接以下の値に改ざんすることで、入力値 admin を検査を回避しつつアプリケーションに与えることができます。
O%3A6%3A%22Sample%22%3A1%3A%7Bs%3A12%3A%22%00Sample%00name%22%3Bs%3A5%3A%22admin%22%3B%7D
実際に上記の値に Cookie 中のキー instance の値を改ざんしてみてください。
うまくいくと画面に flatt{...} 形式の文字列が表示されますから、それを解答してください。
A4)
admin
を指定すると、エラーになる。
そこで、Cookie のキー instance の値を書き換える。
フラッグを発見。
flatt{insecure_deserialization_induces_unexpected_vulnerabilities}
問題は解けたが、あんまり理解できてない。。。
シリアライズ・デシリアライズに関して、別途勉強する必要がありそうだ
Q5)基礎的なディレクトリトラバーサル攻撃
演習環境のサーバには /secret/flag1 という名前の、flatt{...} 形式のデータが書かれたファイルが存在します。
このファイルを、演習環境中に存在するディレクトリトラバーサル脆弱性を利用することで読み出し、ファイルの中身を解答してください。
A5)
閲覧したいファイル
にはa.txt``b.txt``c.txt
が格納されています。
その時のURLはhttps://basic-dirtrav-attack.flatt.training/?filename=a.txt
です。
演習環境サーバには、/secret/flag1
というファイルがあるらしいので上記のURLに対してDirectory Traversal 攻撃を実施します。
アクセスするURL
https://basic-dirtrav-attack.flatt.training/?filename=../../../../../secret/flag1
フラッグを発見。
flatt{directory_traversal_is_so_dangerous}
Q6)ディレクトリトラバーサルによるサーバ設定ファイルのリーク
演習環境のサーバは nginx を利用しており、その設定ファイルは /etc/nginx/conf.d/default.conf に格納されています。
このファイルを演習環境中に存在するディレクトリトラバーサル脆弱性を利用することで読み出すと、
開発者しか知らないはずの URL 定義が見つかるはずです。
A6)
Directory Traversal 攻撃によりディレクトリの情報を読み出せないか確認します。
アクセスするURL
https://basic-dirtrav-attack.flatt.training/?filename=../../../../../../etc/nginx/conf.d/default.conf
コメントアウトされた箇所に次の文がありました。
# /secret_path_only_developer_can_know にアクセスすると答え(flatt{...} 形式のデータ)が得られます。
location = /secret_path_only_developer_can_know {
default_type text/html;
alias /secret/flag2_2a46993a50cbe5a6b14f76e5ac4d8514;
}
指示されたURLへアクセス。
https://basic-dirtrav-attack.flatt.training/secret_path_only_developer_can_know
フラッグを発見。
flatt{server_configurations_include_a_lot_of_useful_information}
Q7)Reflected XSS 脆弱性
この演習環境には Reflected XSS 脆弱性が存在しています。
そのReflected XSS脆弱性を利用して、このWebページ中に<script>alert(1)</script>を挿入してください。
A7)
<script>alert(1)</script>
を挿入する。
フラッグを発見。
flatt{this_is_reflected_xss}
Q8)DOM-based XSS 脆弱性
この演習環境には DOM-based XSS 脆弱性が存在しています。
そのDOM-based XSS脆弱性を利用して、このWebページ中に<img src=x onerror=alert(1)>を挿入してください。
A8)
<img src=x onerror=alert(1)>
を挿入する。
フラッグを発見。
flatt{dom_based_xss_is_different_from_other_types}
Q9) SQL Playground
演習環境には以下のようなテーブルが定義されています。このテーブルには flatt{...} という形式のデータが保存されています。
このデータを SELECT 文で取得し、flatt{...}という形式の文字列を解答してください。
CREATE TABLE `members` (`username` TEXT NOT NULL,`profile` TEXT NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
A9)
分かっているのはテーブル名(profile
)、カラム名(sername
、profile
)。
この情報からDBに保存されているレコードを取得できるか実行。
select * from members;
フラッグを発見。
flatt{just_a_select_query}
Q10)ログイン機能に存在する SQL Injection
演習環境はログイン機能を持った Web アプリケーションです。
SQL Injection 攻撃によりユーザー名 admin としてログインしてください。
A10)
問題文から、ユーザー名はadmin
である。パスワードは分からないのでSQLiができるか試してみる。
'
をパスワード欄に入れるとエラーが出てきた。ここから、SQLiの可能性が浮上。
実行結果
pass ' OR '1' = '1
フラッグを発見
flatt{login_bypass_by_sql_injection}
Good luck