应用安全系列之三十:任意重定向

重定向的方法有多种,在有META标签内跳转、javascript跳转以及header头跳转,这些跳转一般都比较难易用来攻击。另外一种常用的跳转方法是在URL中传递参数,通过参数指定重定向的目标,这就给攻击者有机可乘。

经常会出现这种当访问某一个页面,此时处于非登录状态或者登录的session超时了,就会有这种情况发生。同时,这也给了攻击者攻击的机会,当一个攻击者发现某个网站有类似的URL时,就可以通过篡改URL,然后发给该网站的用户,就可以发起攻击。

以Java为例,典型的重定向代码如下:

response.sendRedirect("http://www.example.com");

如果这么固定写好的URL,一般都是没有问题,但是,如果重定向的目标是从请求中获取的,如下:

response.sendRedirect(request.getParameter("returnurl"));

攻击者就可以通过控制returnurl指定调转目标发起攻击。

重定向的危害包括以下几点:

1)发起钓鱼攻击,盗取用户的敏感信息, 如果这个跳转的网站是事先伪造的网站,和原网站长的一模一样,而且又跳转到登录页面的话,就可能导致用户的登录信息发到恶意网站,导致信息泄露。例如,如下的例子:

https://www.example.com/info.php?returnurl=https://www.example1.com/login.php
http://www.example.com/list.jsp?forward=admin.jsp

虽然任意重定向,造成的直接危害没有像注入问题那么大,但是也需要在开发时注意预防。一般采用的预防措施都是在使用重定向的目的地之前,验证跳转的目标是否在事先允许的白名单范围之内,例如:限制跳转的域名白名单或者IP白名单。

虽然预防时,在实现过程中也需要注意白名单也有可能会被绕过的情况,例如,当重定向的目标是returnurl=http://www.example1.com时,会失败;当尝试将returnurl修改为http://www.example1.com@www.example.com,就可能绕过验证而实现跳转。

如果跳转的站点离开当前站点,需要清晰地提示用于将跳转导某个站点,并且用户点击确认之后,再跳转。 在站内跳转时,需要保证每一个URL都要做严格的认证与授权,不管是对内的URL还是对外的URL。

经验分享 程序员 微信小程序 职场和发展