重定向漏洞(open redirect vulnerabilities)
重定向(redirect)是什么?
当从一个页面(url)自动跳到另一个页面(url)的时候,就发生了重定向。
重定向的发起,可能是从服务端(后端),也可能是客户端(浏览器)。
后端发起重定向,会向客户端发送一个状态码(301、302等),并告诉浏览器要跳转到哪个url。
例如我在这里引用了一个地址:
https://http.dev/status
如果有一天这个地址(指向该内容的url)变了,但我这里引用的还是老地址,当有人点击的时候,可能找不到(not found),也可能直接跳转到对应的新的地址(所谓的重定向)。
客户端发起的重定向,是由运行在浏览器的代码触发。
两种方法:meta refresh 和 JavaScript redirect(which changes the window’s URL after that code has been run)
上面两图分别来自
https://www.w3.org/TR/WCAG20-TECHS/H76.html
https://www.w3schools.com/howto/howto_js_redirect_webpage.asp
可能还要插句嘴,上面的两图,是代码内部的大概样子,具体的URL可能不会直接贴在代码里,而是通过参数传递,比如下面真实的报告例子,是通过参数redirect传递的。(最后一个图是URL 解码结果)
重定向能被用来做什么?
phishing (fishing 钓鱼),如果一个重定向的url,竟然可以被控制、改写!那任何一个没有警觉的无辜的人,都有可能被定向到一个恶意的网站,用户看到的内容,可能不是他/她以为的合法的内容!
例子(Example)
如下连接,SAMPRIT DAS 这个人报告的重定向漏洞:
https://huntr.dev/bounties/c13258a2-30e3-4261-9a3b-2f39c49a8bd6/
英文的冒号:,第一次编码 => %3A 在此基础上再次编码 => %253A 第三次编码 => %25253A
(% 编码为%25,解码时,从左到右,前头的%25 解码成%,第二次解码时,前面还有一个%25,还是解码成%,第三次解码时,剩下%3A 解码成 : )
英文的问号 ?,一次编码 %3F
等号 = ,一次编码 %3D