referer检测&url跳转

一、检测referer的场景

》缓解CSRF攻击

若referer为空,或referer不属于自身域及子域,则拒绝后续操作​(更改密码、更改昵称)

》加固以jsonp方式获取信息

譬如​,链接https://passport.jd.com/loginservice.aspx?callback=jQuery8483115&method=UserInfo&_=1522914283457返回用户信息

攻击网页使用script标签,src设置为​https://passport.jd.com/loginservice.aspx?callback=attack&method=UserInfo&_=1522914283457,然后声明函数attack,网页就可钓鱼获取到用户信息了

​若referer为空,或referer不属于自身域及子域,则拒绝返回信息

》防止音视频盗链​

​在网页中使用video标签加载视频https://api.huoshan.com/hotsoon/item/video/_playback/?video_id=f0b9acc12f944e5294be13f906bbc86a&line=1&app_id=1112&vquality=normal,是会被服务器拒绝的,原因就是referer检测不通过

视频站检测可以避免为不法网站提供免费的视频存储

 

二、referer检测方法

referer检测本质就是从链接中获取host部分,判断host是否在允许域名列表中​

,通常使用正则表达式进行检测,但往往会出现绕过情况,如下

受保护域名:www.target.com​

验证方法:​

1、 referer.indexof("target.com") !=-1

​2、referer.match(/^http(s?):\/\/.+\.target\.com\//i)

3、referer.host.endwith("target.com")​

4、referer.host.indexof("target.com") != -1​

​(host为referer中的域名部分)

攻击者referer:

1、http://www.attack.com/?id=target.com​

2、​http://www.attack.com/?idtarget.com/aaa

3、http://www.attacktarget.com/xxx​

4、http://www.target.com.attack.com/xxx​

可以发现上面的验证方法均存在漏洞

安全的做法

1、referer.host.match(/^.*\.target\.com$/)​

2、referer.host.endwith(".target.com")

三、其他绕过方法

若检测规则为:若referer不为空,则referer必须来自允许的域名

则可以想办法​使referer为空

》​iframe src属性、embed src属性、object data属性的data URI  (text/html)模式,可以发出不带referer的请求

​iframe /embed src="data    :text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+"​

object data=​"data    :text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+"​

》​meta name="referrer" content="no-referrer" 页面中的video等标签不会出现referer

》​a标签的rel=noreferer

 

 四、url跳转

》url跳转中也会涉及到以上host的判断

》结合parse_url和浏览器的一些特性,会出现一些新的绕过方式:

》》比如, desturl = https://baidu.com​​​​#@target.com, php会将最后一个@之前的部分解析成user:pass部分,所以desturl可以通过检测,但是浏览器却会忽略#后的字符,最终跳转到evil.com

​(php parse_url bug:https://bugs.php.net/bug.php?id=73192)​

》》比如oauth中,大部分应用会严格判断client_id和desturl的一致性​,且会检测desturl是否在允许范围。但有些应用允许desturl为子域名

若desturl=http://evil.com\@target.com或http://evil.com\.target.com,php解析到的host为evil.com\.target.com,在子域名范围内,允许跳转。但在浏览器中正反斜杠代表一样内容,导致浏览器会跳转到evil.com

》python web.py库(问题类SimpleHTTPRequestHandler)解析问题造成的url跳转:http://zhuti.xxxx.com//baidu.com/..%2fhttp://zhuti.xxxx.com//baidu.com/%2f.. 都会导致跳转到百度(参考https://www.leavesongs.com/PENETRATION/python-http-server-open-redirect-vulnerability.html

 

五、SSRF中的url检测

SSRF(server-side request forge)攻击,是一种利用服务器代码缺陷,以服务器身份发送网络请求的攻击。可以通过此种攻击获取服务器上任意文件、识别并攻击服务器所在网络中的其他服务器、把服务器作为跳板对外发起攻击等等。

1、攻击原理

一段存在ssrf漏洞的php伪代码

if (isset($_GET[‘url’])){

$url = $_GET[‘url’];

$image = fopen($url, ‘rb’);

header(“Content-Type: image/png”);

fpassthru($image);

}​

2、​攻击示例

(1)获取服务器上任意文件:/?url=file:///etc/passwd

(2)探测服务器所在内网:/?url=http://192.168.11.1:8088/test.php

(3)攻击服务器内网中的服务器:/?url=http://192.168.11.1:8088/control.php?off=1

(4)攻击服务器上其他服务:/?url=dict://localhost:11211/stat

(5)把服务器作为跳板:/?url=http://www.baidu.com/info.php?id=’ or ‘a’=’a

3、防护措施

(黑名单)

(1)过滤10.0.0.0/8 、172.16.0.0/12、192.168.0.0/16、localhost私有地址​、IPv6地址

(2)过滤file:///、dict://、gopher://、ftp:// 危险schema

(3)​对返回的内容进行识别

(4)内网服务开启鉴权​(Memcached, Redis, Elasticsearch and MongoDB)

4、绕过防护

(1)http redirect跳转 绕过过滤(注意设置 :curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);

(2)ip其他编码形式:参考http://every@www.pc-help.org/obscure.htm

206.191.158.55

十进制

191 * 256 * 256 + 158 * 256 + 55 = 12557879

http://206.12557879/obscure.htm

http://206.191.40503/obscure.htm

十六进制

191=0xBF 158=0x9E

http://0xCE.0xBF9E37/obscure.htm

http://0xCE.0xBF.0x9E37/obscure.htm

八进制

206=0316 191=0277  (先转到10进制,再依次取余8,转到8进制)

http://0316.057717067/obscure.htm

http://0316.0277.0117067/obscure.htm

混合进制

http://0xCE.191.0236.0×37/obscure.htm

(3)通配符DNS服务:xip.io(1.11.111.111.xip.io => 1.11.111.111)

(4)DNS rebinding

5、最佳防护

(1)使用地址白名单

(2)对返回内容进行识别

(3)需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况:首先禁用 CURLOPT_FOLLOWLOCATION;然后通过域名获取目标ip,并过滤内部ip;最后识别返回的内容是否与假定内容一致 (dns rebinding 能否绕过?)

(只使用域名、不使用IP;获取域名指向的ip,排除10段、127段(或者0、0x0等)127.x.x.x、192.168段、172.16/12段指向内网的地址;并且获取url指向的内容时,禁止redirect,若开启redirect,攻击者可以间隔次转达到目的)

 

6、android jsbridge

android addjavascriptinterface用来提供web页面调用java代码接口,往往会通过域名白名单限制对接口的调用

但webview的settimeout机制会导致被绕过

<script>
function exp(){
    //ajax
}
setTimeout(exp, 500)
document.location.href = 'http://www.good.com'
</script>

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值