以前、
blog.nikuniku.me というタイトルでヘッダーについて改めて調べてみた。
記事内に
その他のヘッダーについても調べておきたいし、ウェブセキュリティ周りも復習していく予定。
と書いた通り、良く耳にするウェブの脆弱性について調べてみた。
出力に起因する脆弱性
-
- 攻撃方法
- 攻撃スクリプトを脆弱性のあるサイトに登録し(DBに保存するなど)訪問した利用者のブラウザ上で悪意あるスクリプトが実行されてしまう(格納型)
- 入力した内容を登録できる形式のサイトがあった場合にスクリプトタグを登録するなどして攻撃をする。
- 悪意のあるURLをクリックさせ、脆弱性のあるサイト上でスクリプトを実行させ、クッキー情報などを取得する(反射型XSS)
- 例えば、
http://example.com/keyword=username
のようなURLがあった場合にkeyword=<script>document.cookie</script>
をURLに含んだ状態でサイトに遷移させ、サイト上でスクリプトを実行させるなど。
- 例えば、
- 攻撃スクリプトを脆弱性のあるサイトに登録し(DBに保存するなど)訪問した利用者のブラウザ上で悪意あるスクリプトが実行されてしまう(格納型)
- 対策
- 攻撃方法
コマンドインジェクション
処理に起因する脆弱性
- ディレクトリ・トラバーサル
- コード内にファイルを読み込む処理がある場合に外部から読み込むファイルを指定されると意図していないファイルが読み込まされる攻撃。
- 外部からファイル名を指定できない仕様にする。
- ファイル名として使える文字種類を限定し、
/
ディレクトリを表すような文字はエラーとする。
- クリックジャッキング
- 罠サイト上でサイトAをiframeで読みこみ重ね合わせて透過にしておく。罠サイトのコンテンツを操作しているように見せかけ、実際はサイトAの操作を行わせる攻撃。
X-Frame-Options
をレスポンスヘッダーに追加しiframeによる読み込みを制限し対策する。
- CSRF(Cross-site Request Forgery)
- 攻撃方法
- 対策
- XSSと似ている点
DVWAで脆弱性を試してみる
いろんな脆弱性をテストできるアプリを提供しているサイト
docker run --rm -it -p 80:80 vulnerables/web-dvwa
でdockerで動作させることも出来る。
CSRF
パスワードの変更リクエストがGETリクエストになっているため、クエリパラメーターに更新したいパスワードを含めるとパスワードの変更を行うことができる。
例えば、以下のリンクを踏ませることでパスワードの変更を意図せず実行されてしまう。
http://localhost/vulnerabilities/csrf/?password_new=hoge&password_conf=hoge&Change=Change#
パスワードが更新されたことがわかる
MariaDB [dvwa]> select * from users where user_id =1; +---------+------------+-----------+-------+----------------------------------+---------------------------+---------------------+--------------+ | user_id | first_name | last_name | user | password | avatar | last_login | failed_login | +---------+------------+-----------+-------+----------------------------------+---------------------------+---------------------+--------------+ | 1 | admin | admin | admin | c32ec965db3295bad074d2afa907b1c3 | /hackable/users/admin.jpg | 2021-09-12 02:51:06 | 0 | +---------+------------+-----------+-------+----------------------------------+---------------------------+---------------------+--------------+ 1 row in set (0.00 sec) MariaDB [dvwa]> select * from users where user_id =1; +---------+------------+-----------+-------+----------------------------------+---------------------------+---------------------+--------------+ | user_id | first_name | last_name | user | password | avatar | last_login | failed_login | +---------+------------+-----------+-------+----------------------------------+---------------------------+---------------------+--------------+ | 1 | admin | admin | admin | 098f6bcd4621d373cade4e832627b4f6 | /hackable/users/admin.jpg | 2021-09-12 02:56:42 | 0 | +---------+------------+-----------+-------+----------------------------------+---------------------------+---------------------+--------------+ 1 row in set (0.00 sec)
対策
- GETリクエストからPOSTに変える。
- トークンを利用して正規のページからリクエストされているかチェックする。
Access-Control-Allow-Origin
をレスポンスヘッダーに設定する。- クッキーのSame−Site属性に
Lax
、Secure
を有効にする。
OSコマンドインジェクション
インプットタグに;cat /etc/passwd
を入力した結果
/etc/passwd
の内容が画面に表示されてしまっている。
対策
コードを見るとshell_exec
を利用しているので、引数に渡すコマンドを事前にエスケープ処理してサニタイズする。
例) escapeshellcmd
// *nix $cmd = shell_exec( 'ping -c 4 ' . $target );
XSS(格納型)
Messageのインプットタグに<script>alert('a');</script>
を入力した結果
画面を表示した場合にcomment_id:2のcommentがそのままスクリプトとして実行されてしまう。
MariaDB [dvwa]> select * from guestbook; +------------+---------------------------------+------+ | comment_id | comment | name | +------------+---------------------------------+------+ | 1 | This is a test comment. | test | | 2 | <script>alert('aaaa');</script> | aaa | +------------+---------------------------------+------+ 2 rows in set (0.00 sec)
対策
画面に表示する際に取得したcommentに対してサニタイジングする。
例) htmlspecialchars
参考
- 安全なSQLの呼び出し方
- OS コマンドインジェクション その危険性と対策
- OWASPとは?Top 10, ZAPについてもまとめて紹介
- Webエンジニアだったら当然知っておきたい「 クリックジャッキング対策 」とは? | 株式会社ヌーラボ(Nulab inc.)
- 体系的に学ぶ 安全なWebアプリケーションの作り方[固定版] 脆弱性が生まれる原理と対策の実践
See you next time:)