试图拦截并修改服务器响应时,攻击者可能发现代理服务器显示以下相关消息。
HTTP/1.1 304 Not Modified
Date: Wed, 6 Jul 2011 22:40:20 GMT
Etag: “6c7-5fcc0900”
Expires: Thu, 7 Jul 2011 00:40:20 GMT
Cache-Control: max-age=7200
产生这个响应是因为浏览器已经在缓存中保存了所请求资源的副本。当浏览器请求一个已存入缓存的资源时,它通常会在请求中添加另外两个消息头,分别为If-Modified-Since和If-None-Match消息头,如下所示:
GET /scripts/validate.js HTTP/1.1
Host: wahh-app.com
If-Modified-Since: Sat, 7 Jul 2011 19:48:20 GMT
If-None-Match: “6c7-5fcc0900”
这些消息头告诉服务器浏览器上次更新缓存副本的时间。Etag字符串(由服务器随资源副本一起提供)是一种序列号,服务器为每个可缓存的资源分配一个Etag,如果资源被修改,它也会随之更新。如果服务器拥有比If-Modified-Since消息头中指定日期更新的资源,或者如果当前版本的Etag与If-None-Match消息头中指定的Etag不匹配,那么服务器就会在响应中提供最新的资源。否则,它将返回和本例相同的304响应,通知浏览器资源没有被修改,浏览器应使用缓存中的副本。
如果是这样,必须拦截并修改浏览器保存在缓存中的资源,可以拦截相关请求并删除If-Modified-Since和If-None-Match消息头,让服务器在响应中提供所请求资源的完整版本。Burp Proxy中有一个从每个请求中删除这些消息头的选项,可覆盖由浏览器发送的所有缓存信息。