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

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

ログインページでのXSS(Docker版 Ver 1.1.0)

実習用仮想マシン(Docker版 Ver 1.1.0) *1ではログイン時のパラメータurlに次のようにスクリプトを仕込むことでXSSが発動しました。
https://example.jp/todo/login.php?url=todolist.php?%22%3E%3Cscript%3Ealert(1)%3C/script%3E%0aからログイン。

logindo.phpのレスポンス。

<body>
ログイン成功しました<br>
自動的に遷移しない場合は以下のリンクをクリックして下さい。
<a href="todolist.php?"><script>alert(1)</script>
?rnd=64e713e5d224c">todo一覧に遷移</a>        
</body>

この画面は通常はステータスコード 302 でリダイレクトします。このため上記で示された HTML は通常は表示されず、仮に JavaScript が書かれていても実行されません。検証例ではこれを回避するため遷移先 URL に改行コード(%0A)を含めることにより、リダイレクト処理をわざとエラーにしてリダイレクトされないようにしています。

ログインページでのXSS(Docker版 Ver 2.0.0)

しかし(Docker版 Ver 2.0.0)では発動しませんでした。
logindo.phpのレスポンスが500 Internal Server Errorとなり、レスポンス中にscriptが出現しないためです。

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at webmaster@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.
Additionally, a 302 Found error was encountered while trying to use an ErrorDocument to handle the request.

PHPのエラーは出ていませんでした。改行コード(%0A)を除くと問題なく遷移するためこれが原因だとは思います(ただ上でも書きましたが(%0A)なしだと302のためレスポンスボディ部分は表示されずXSSは発動しません)。解決できていませんので後日に回します。

はせがわようすけさんの記事もそれぞれ試してみたのですが、
30xリダイレクトのレスポンスボディでもXSS - 葉っぱ日記
30xリダイレクトのレスポンスボディでもXSS(その2) - 葉っぱ日記

1つ目の「21/tcpなどのブラウザではアクセスが禁止されているポートへリダイレクトさせる方法」についてはlogindo.phpからtodolist.phpへのリダイレクトはされなかったようですが、ブラウザにlogindo.phpが表示されることもありませんでした。(2016年の記事ですので、ブラウザの仕様が変わっているのかもしれません)

(その2)についても、今回の場合はリダイレクト元とリダイレクト先が同一ドメインだったため試していません。

ログインページでのXSS(Docker版 Ver 2.0.0)続き

別パラメータでは、ユーザID(userid)に'"<script>alert(1);</script>でXSSありでした。

レスポンス(改行してあります)

<div id="contents">
接続に失敗しました: SQLSTATE[42000]: Syntax error or access violation:
 1064 You have an error in your SQL syntax; check the manual
 that corresponds to your MariaDB server version for the right syntax
 to use near '"<script>alert(1);</script>'' at line 1<br>
<button type="button" onclick="window.history.back();">戻る</button>
</div>

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

タグが注入可能ということはログインフォームを書き換えて偽のログインフォームにするなどできそうだと思ったのですが、エラーメッセージのコード引用部分の上限が76文字のようで長いデータは入力できなかったので諦めました。

次回:やられアプリ BadTodo - 4.3 XSS(ID毎のTodo一覧画面) - demandosigno

*1:ダウンロードから(要認証)パスワードは「安全なWebアプリケーションの作り方 第2版 p.667に記載」

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