レガシー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に「=」のみを設定している。これがなんだっていうのか?これで攻撃が成立するんか?
確かに実装の仕方によってはASPはCookieの値を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なんて使うなってことだね。