K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2148] Modoki/0.2のリダイレクトの処理について
返信


投稿者:Radec
2019/02/11 11:45:33

Link:
はじめまして。
「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」にて実装したModoki/0.2の挙動について質問となります。

Modoki/0.2では、'/'なしでディレクトリを指定するとリダイレクトさせる仕様となっております。
そのため、「C:\Apache24\htdocs\」の配下にテストディレクトリ「test」と「日本語」を作成し、それぞれのディレクトリ配下にindex.htmlを配置して動かしてみました。

実行結果は以下の通りです。(入力URLはhttp://〜8001までは省略)

入力URL 結果
/test    OK(test配下のindex.htmlが表示)
/test/  OK(test配下のindex.htmlが表示)
/日本語  NG(404.htmlも表示されずブラウザのエラー画面が表示)
/日本語/ OK(日本語配下のindex.htmlが表示)

ブラウザはIEでもFireFoxでも同じ結果でした。
デバッグモードで戻り値を確認してみましたが、MyURLDecoderは「/日本語」を返してくれていますし、realPathの取得時もNoSuchFileExceptionは発生していません。
このような差異が発生してしまう要因として考えられることはどのようなものでしょうか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2149] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:(ぱ)こと管理人
2019/02/11 19:53:57

Link:
はじめまして。ご質問いただきありがとうございます。

>入力URL 結果
>/test    OK(test配下のindex.htmlが表示)
>/test/  OK(test配下のindex.htmlが表示)
>/日本語  NG(404.htmlも表示されずブラウザのエラー画面が表示)
>/日本語/ OK(日本語配下のindex.htmlが表示)

私も試してみましたが、正直、わけがわからない結果となっています。

Firefox, Edgeでは、

/日本語

の場合だけ、リクエストラインが以下のようになっています。

GET /%E5,%9E/ HTTP/1.1

これをデコードしても該当のフォルダは存在しないので、私が試した範囲では、
404が返りました。
IEでは、1回だけ

GET /%E6%97%A5%E6%9C%AC%E8%AA%9E HTTP/1.1

つまり正しくエンコードされた形でリクエストが投げられましたが、
以後何度試しても、そもそもリクエストが投げられず、ブラウザ側で
「このページを表示できません 
 Web アドレス http://localhost:8001  ;が正しいか確かめてください」
のエラーになっています。

奇妙なのは、Edge, Firefox, IEのどれにおいても、

http://localhost:8001/日本語/
http://localhost:8001/日本語.html
http://localhost:8001/あいうえお
http://localhost:8001/中国語

等はうまくいくのに、

http://localhost:8001/日本語

の場合だけ、

GET /%E5,%9E/ HTTP/1.1

になったり、リクエストが投げられなかったりしていることです。

SenderThread.javaの24行目に、以下のようにSystem.out.println()を挟んで確認しました。

  while ((line = Util.readLine(input)) != null) {
      if (line.equals(""))
          break;
      System.out.println("line.." + line);
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2150] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:Radec
2019/02/11 23:20:50

Link:
こんばんは。

早々にご確認・ご回答頂きまして、まことにありがとうございます。
当方でも様々な文字で確認してみましたが、やはり上手くいくときといかないときがあり、よくわからない結果となってしまいました。
ブラウザ等の仕様に起因するところもあるかと思うので厳密には分からないかとは思いますが、もともとの目的である動き・仕様は理解できたので先に進もうかと思います。

ちなみに、また別の質問となってしまい恐縮ですが、
Modoki/0.2で、ディレクトリトラバーサル攻撃を検知 → 404.htmlをリターンする、
即ち (!realPath.startsWith(DOCUMENT_ROOT)) を true にするには、
どのようなGETリクエストを飛ばすと実現できるものでしょうか?

過去の例にあったような「http://localhost:8001/../conf/httpd.conf
をブラウザで入力してデバッグすると、NoSuchFileExceptionが先に発生するような動きをしてしまいました。

TcpServerを動かして、ブラウザに「http://localhost:8001/../conf/httpd.conf
を入力して、GETリクエストを取得してみると、
「GET /conf/httpd.conf HTTP/1.1」となっていましたので、
サーバがGETリクエストを受け取った時には、pathが/conf/httpd.confとなっているようです。
そうすると、realPathは「C:\Apache24\htdocs\conf\httpd.conf」になるので、
確かに、NoSuchFileExceptionが発生することが自然な動きのようにも思えます。

以上、よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2151] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:mano
2019/02/12 20:11:03

Link:
本を持っていないため、推測となってしまいますし、外しているかもしれませんが。。。
日本語のそれぞれの文字のUnicode符合位置は、[日]=U+65E5、[本]=U+672C、[語]=U+8A9Eです。
また、「,」は、Unicode符合位置がU+002Cです。
なので、問題となった%E5,%9Eは、日本語をUnicode符合位置で求めた場合の下位1バイト分に相当します。
この辺を手がかりに、パケットキャプチャすればどのタイミングまでは文字コードが意図通りとなっているかがのあたりがつくかもです。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2152] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:(ぱ)こと管理人
2019/02/13 02:26:13

Link:
>過去の例にあったような「http://localhost:8001/../conf/httpd.conf
>をブラウザで入力してデバッグすると、NoSuchFileExceptionが先に発生するような
>動きをしてしまいました。

ブラウザは、こんなあからさまにディレクトリトラバーサルを起こしそうなURLを
素直にサーバに送らなければいけない義理もないでしょうから、

>「GET /conf/httpd.conf HTTP/1.1」となっていましたので、

というように(勝手に)変換しているのでしょう。

ただ、攻撃者はブラウザを使うとは限らないわけで、TcpClient.javaを使って
client_send.txtに

GET /../conf/httpd.conf HTTP/1.1

と書くと、

if (!realPath.startsWith(DOCUMENT_ROOT)) {

側の処理に流れ込むことが確認できます。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2153] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:(ぱ)こと管理人
2019/02/13 02:39:34

Link:
ごぶさたしてます。

>なので、問題となった%E5,%9Eは、日本語をUnicode符合位置で求めた場合の
>下位1バイト分に相当します。

あ、気付いていませんでしたが確かにそうですね。
だとしても、なぜ「日本語」の場合だけそうなるのは謎ですが……

本件、Modoki/0.2はただソケットでデータを受け取るだけなので、
さすがにどっかで化けているとしたらブラウザだと思うのですが、
パケットフィルタリングもちょっと考えてみます。(今でもWiresharkで
よかったんだっけ…?)
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2154] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:mano
2019/02/13 20:17:34

Link:
最初からガッツリ調べなくても最初はfiddlerでいいんじゃない?appgoatの学習でも使っているツールだし。。。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2155] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:Radec
2019/02/14 23:47:50

Link:
なるほど。。。
確かに自分で実装したTcpClientなら余計な補正は働きませんね。
動作確認できました。ありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2156] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:mano
2019/02/22 23:30:27

Link:
レスが付かないまま1週間以上たってしまったため、自己レスします。 
> さすがにどっかで化けているとしたらブラウザだと思うのですが 
思い込みの罠にはまっています。というか傍から見ると自分でフラグ立てていますよ。 

fidderをプロキシとしてブラウザとサーバの間に挟むと若干動きが変わりますが、パケット解析には問題ないです。 
で、パケット解析をするとすぐわかりますが、ブラウザから[ http://localhost:8001/日本語 ]でアクセスすると、サーバからレスポンスコード301が返ってきており、そこで指定されている移動先URLが文字化けしています。 ;

で、(サポートページから勝手にソースをダウンロードして)問題箇所を見ると、ServerThread.javaのpathの扱いが不注意なところがありました。 
まず、25行目で、urldecodeプラスアルファ的なことをしていて、url文字列からPCで扱う文字列にしています。 
その後、54行目で、移動先ページの組み立てで、PCで扱う文字列となっているpathを(url文字列形式にせずに)そのまま使っています。 
urlデコードしてもしなくても変わらない文字列であれば問題が起きなかったのですが、今回はそのケースではないためエラーが見つかっちゃったんだと思います。 
仮に56行目 [ + path + "/"; ]の部分を[ + "/%E6%97%A5%E6%9C%AC%E8%AA%9E/"; ]に書き換えれば意図通りにいっているように見えるんじゃないかな? 
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2157] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:mano
2019/02/22 23:53:22

Link:
削除パスワードを設定していなかったため修正も削除もできないため返信します。
前回の発言、一部間違っていました。ダウンロードしたのは再現テストの前、一番最初です。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2158] Re:Modoki/0.2のリダイレクトの処理について
返信


投稿者:(ぱ)こと管理人
2019/02/24 20:00:11

Link:
>レスが付かないまま1週間以上たってしまったため、自己レスします。 

すみません、最近どたばたしておりまして、ちょっと気力がたまりませんでした。

>で、パケット解析をするとすぐわかりますが、ブラウザから
http://localhost:8001/日本語 ] ;でアクセスすると、
>サーバからレスポンスコード301が返ってきており、
>そこで指定されている移動先URLが文字化けしています。 

なるほど…… これはさすがに気付いてしかるべきでしたね。
パケットキャプチャやFiddlerどころか、F12開発者ツールでわかるレベルの話です。

言い訳しますと、

>SenderThread.javaの24行目に、以下のようにSystem.out.println()を挟んで確認しました。

…という確認をしていたのにリクエストは1回ずつしか来なかったので、
リダイレクトは想定しませんでした。最初の1回はちゃんと飛んでたはずですが
(過去投稿を見るとIEではそうだったとの記載もある)、今F12を入れて見てみると、
2回目以後はキャッシュされてますね。
「F12開発者ツール」とか、「変な動きがあればキャッシュを消せ」あたりは
Webアプリ開発の基本ですが、どうもぼけてたようです。
[ この投稿を含むスレッドを表示] [ この投稿を削除]