》缓解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检测本质就是从链接中获取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跳转中也会涉及到以上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,php解析到的host为evil.com\.target.com,在子域名范围内,允许跳转。但在浏览器中正反斜杠代表一样内容,导致浏览器会跳转到evil.com
》python web.py库(问题类SimpleHTTPRequestHandler)解析问题造成的url跳转:http://zhuti.xxxx.com//baidu.com/..%2f和http://zhuti.xxxx.com//baidu.com/%2f.. 都会导致跳转到百度(参考https://www.leavesongs.com/PENETRATION/python-http-server-open-redirect-vulnerability.html)
SSRF(server-side request forge)攻击,是一种利用服务器代码缺陷,以服务器身份发送网络请求的攻击。可以通过此种攻击获取服务器上任意文件、识别并攻击服务器所在网络中的其他服务器、把服务器作为跳板对外发起攻击等等。
一段存在ssrf漏洞的php伪代码
if (isset($_GET[‘url’])){
$url = $_GET[‘url’];
$image = fopen($url, ‘rb’);
header(“Content-Type: image/png”);
fpassthru($image);
}
(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
(黑名单)
(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)
(1)http redirect跳转 绕过过滤(注意设置 :curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
(2)ip其他编码形式:参考http://[email protected]/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
(1)使用地址白名单
(2)对返回内容进行识别
(3)需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况:首先禁用 CURLOPT_FOLLOWLOCATION;然后通过域名获取目标ip,并过滤内部ip;最后识别返回的内容是否与假定内容一致
(只使用域名、不使用IP;获取域名指向的ip,排除10段、127段(或者0、0x0等)127.x.x.x、192.168段、172.16/12段指向内网的地址;并且获取url指向的内容时,禁止redirect,若开启redirect,攻击者可以间隔次转达到目的)