前回:やられアプリ 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 }
これでHttpOnly属性が有効になります。
確認
BadTodo - 4.3 XSS(ID毎のTodo一覧画面)にて見つかったtodolist.php
のid
パラメータに対するXSSを試します。
https://todo.example.jp/todolist.php?id=%3Cscript%3Ealert(document.cookie)%3C/script%3E
結果、ポップアップの「内容」は空白でCookieを読み取ることができていません。
ログイン時のSet-Cookie部分。
CookieのHttpOnly属性によって「Cookieを盗み出す」という攻撃はできなくなりますが、他の攻撃(DoM操作、XMLHttpRequest)はできるためXSSによる影響を大幅に軽減することはできません。