レガシーASPと”Cookie: = ”

超古い穴だらけのASPアプリケーションに某WAFを導入してAppScanかけてみた。まぁ、その某WAFの評価のためなんだが。

やってみた結果、ほぼパーフェクトな検知率。でも、ほんの一部漏れたものがある。つまり、AppScanは「攻撃リクエストだ」と称しているリクエストのほんの一部が通過した。どう見ても攻撃が成立するとは思えないが。

(まぁ、いちがいにAppScanのシグニチャがぜんぶ攻撃リクエストだとは思わないけど。つまり、単にテストパターンとして含めているシグニチャもあると思うので。)

で、その中のひとつのリクエストがこれ。

GET /AAAA/BBBB.asp HTTP/1.0
Accept: */*
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;.NET CLR
2.0.50727; .NET CLR 3.0.04506.30)
Host: 192.168.11.142
Connection: Keep-Alive
Cookie: =


Cookieに「=」のみを設定している。これがなんだっていうのか?これで攻撃が成立するんか?
確かに実装の仕方によってはASPCookieの値をHTTPパラメータとして扱ってしまうという話はあれど。

AppScanに言わせるとこのリクエストを投げた結果、応答としてDBのエラーを返したからダメだとのこと。

これがレスポンスの一部。

Microsoft OLE DB Provider for ODBC Drivers エラー'80004005'
[Microsoft][ODBC Microsoft Access Driver]一般エラーレジストリキー'Temporary
(volatile) Jet DSN for process 0xbe4 Thread 0xcd0 DBC 0x23e6864 Jet' を開くことができません。
/AAAA/BBBB.asp, 行 34


まぁ、確かにDBのエラーを出している(ここから分かるのはDBにAccessを使っていることぐらいか)。
エラーメッセージの内容については、調査してみるとどうやらDBが開けんということらしい。

試しにAppScanが投げたリクエストをこのアプリに投げてみた。今回はburpsuiteをクライアントに入れてリクエストをトラップ。
ヘッダのCookieを「=」にして送信した結果たしかに↑のエラーが出る。

このアプリケーションは超基本的な実装だけの超シンプルな掲示板(セキュリティ的にはザル)。
DBはMDBを使用していて、ユーザ認証も設定しておらず、.aspと同じフォルダに.mdbを配置している(つまり公開フォルダに配置している)。

DBのオープン処理は以下でODBC経由で接続している。

  :
31: strProvider="Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & FileName
32: Set Conn = Server.CreateObject("ADODB.Connection")
33: Conn.Open strProvider
34:
35: HOST = request("REMOTE_HOST")
  :
  :


Sessionオブジェクトなんか使ってないので、ASPSESSIONIDに影響を与えるような処理は一切していないし、別途Cookieの値を設定したり読んだりもしていない。MDBに認証機構を設定していなし.mdbファイルのACLはEveryone-フルコントロール

どうみてもCookieがDBのオープンに影響するとは思えないのだが。

以下のような一見不完全なCookieを設定してみても、例のエラーは出ず正常にページが表示される。
Cookie:ASPSESSIONID=
Cookie:
Cookieなし

Cookie: =」のときだけDBエラーが出る。

アプリケーションのDBオープン部分をコメントアウトして「Cookie: =」に設定してリクエストを投げてみた。

  :
  :
31: 'strProvider="Driver={Microsoft Access Driver (*.mdb)};DBQ=" & FileName
32: 'Set Conn = Server.CreateObject("ADODB.Connection")
33: 'Conn.Open strProvider
34:
35: HOST = request("REMOTE_HOST")
  :
  :


今度は次のようなエラーが発生した。

エラー '80004005'
/AAAA/BBBB.asp, 行 35 

エラー80004005。このエラーコードは情報の取得に失敗していることを示すらしい。
35行目は何かというと、

35: HOST = request("REMOTE_HOST")


リモートホストの取得に失敗だってさ。何のこっちゃ。Cookieの値がリモートホストの取得にどう関係するというのか。そもそもCookieの値がなくてもちゃんと動作しているのに。もちろんリモートホストの取得もできている。

要するにASPエンジンのCookieを含むHTTPヘッダ解析処理のバグなんじゃないのかしら?
Cookie: =」設定すると落ちるということは分かった。

AppScanのレポートはアプリ側を修正しろなんて書いてあるが、アプリ側ではどうしようもないと思われる。結果的に、もうレガシーASPなんて使うなってことだね。