http://mdsec.net/shop/92/
应用程序常常使用预先设定的URL参数通过客户端传送数据。例如,用户浏览产品目录时,应用程序会向他们提供指向下列URL的超链接:
http://mdsec.net/shop/?prod=3&pricecode=32
如果包含参数的URL显示在浏览器的地址栏中,任何用户不需要使用工具就可任意修改其中的参数。但是,在许多情况下,应用程序并不希望普通用户查看或修改URL参数。例如:
使用包含参数的URL加载嵌入图像时;
使用包含参数的URL加载框架内容时;
表单使用POST方法并且其目标URL包含预先设定的参数时;
应用程序使用弹出窗口或其他方法隐藏浏览器地址栏时。
当然,如前所述,我们可以使用拦截代理服务器修改上面的任何URL参数。
浏览器在大多数HTTP请求中使用Referer消息头。浏览器使用这个消息头指示提出当前请 求的页面的URL——或者是因为用户单击了一个超链接或提交了一个表单,或者是因为该页面引用了其他资源(如图像)。因此,我们可以利用这个消息头通过客户端传送数据,这是因为应用程序处理的URL受其控制,开发者认为Referer消息头可用于准确判断某个特殊的请求由哪个URL生成。
以帮助忘记密码的用户重新设置密码的机制为例。应用程序要求用户按规定的顺序完成几个步骤,然后再通过以下请求重新设置密码值:
GET /auth/472/CreateUser.ashx HTTP/1.1
Host: mdsec.net
Referer: https://mdsec.net/auth/472/Admin.ashx
应用程序可以使用Referer消息头证实这个请求是在正确的阶段(Admin.ashx)提出的,然后才允许用户访问请求的功能。
但是,因为用户控制着每一个请求,包括HTTP消息头,他可以直接进入CreateUser.ashx,并使用拦截代理服务器将Referer消息头的值修改为应用程序需要的值,从而轻易避开这种控制。
实际上,根据w3.org标准,Referer消息头完全是可选的。因此,虽然大多数浏览器执行这个消息头,但是,使用它控制应用程序的功能应被视为是一种“陈腐”的做法。