やられアプリ BadTodo - 4.1.1 XSS 対策方法(HttpOnly属性の付与)

前回:やられアプリ BadTodo - 4.1 XSS(クロスサイト・スクリプティング) - demandosigno

前回XSSでCookieを盗みました。
Cookieの属性の1つにHttpOnlyというものがあります。XSSの緩和策として導入されました。この属性はJavaScriptからCookieの参照・更新を禁止するというものです。

PHPの場合、セッションIDにHttpOnly属性を付与するためには以下の設定を行います。
(現状はHttpOnly属性の部分にチェックマークが付いていない状態です)

/var/www/html/todo/.user.ini に1行追記

session.use_cookies=On
session.use_only_cookies=Off
session.use_trans_sid=On
session.cookie_httponly=On ← 追記

phpinfo.phpの確認(反映されるまでに少し時間がかかります)
     ↓

common.php の setcookie関数部分を修正します。

<?php
 98 function badsetcookie($key, $value, $expire = 0, $secure = false) {
 99   if (is_https() && $secure) {
100     //setcookie($key, $value, $expire, '/; samesite=none', null, true);
         ↓
        setcookie($key, $value, $expire, '/; samesite=none', '', true, true);
101   } else {
102     setcookie($key, $value, $expire, '/');
103   }
104 }

PHP: setcookie - Manual

これでHttpOnly属性が有効になります。

確認

BadTodo - 4.3 XSS(ID毎のTodo一覧画面)にて見つかったtodolist.phpidパラメータに対するXSSを試します。
https://todo.example.jp/todolist.php?id=%3Cscript%3Ealert(document.cookie)%3C/script%3E

結果、ポップアップの「内容」は空白でCookieを読み取ることができていません。

ログイン時のリクエストを確認するとSet-CookieにHttpOnly属性が付与されています。

CookieのHttpOnly属性によって「Cookieを盗み出す」という攻撃はできなくなりますが、他の攻撃(DOM操作、XMLHttpRequest)はできるためXSSによる影響を大幅に軽減することはできません。
一例:やられアプリ BadTodo - 10.7 XSSによるCSRF対策の突破 - demandosigno

元に戻す

練習に邪魔なので設定は一旦元に戻しておきましょう。

参考・補足資料

youtu.be

Cookie の HttpOnly 属性について勘違いしていたこと #JavaScript - Qiita

次回:やられアプリ BadTodo - 4.2 XSS(ログイン画面で) - demandosigno

/* -----codeの行番号----- */