转.搞定百度图片防盗链
Posted on | 十二月 20, 2009 | 2 Comments
我之前曾写过一篇文章:
提到可以采用新出的 Data URL Schema ,以不发送referer的形式,绕过百度的referer检验。但这种方式只有FF支持,IE还不支持,所以尚未采用。这些天来SECINN深受百度图 片防盗链之苦,用户体验有折扣,所以我决定一劳永逸的解决这个问题。
实际上浏览器是根据schema 来决定是否发送 referer的。
典型的就是从 https 跳到 http 会被浏览器拒绝发送 referer,因为可能会导致敏感信息泄露。
比较通用绕过referer检查的方式还有通过一些网页代理访问,原理也是代理访问时不发送referer,或者伪造referer。
但是出于法律风险,我不想提供我的网页代理(也不希望用验证域名的方式让代理变得复杂),也不想使用第三方的代理。
前些天,harry给我提供了一种非常猥琐但极其通用的方式绕过浏览器检查。
参考如下例子:
<script> window.sc="<img src='http://www.businessinfo.co.uk/labs/hackvertor/images/logo.gif?"+Math.random()+"'>"; </script> <iframe src="javascript:parent.sc"></iframe>
我也没想明白为啥iframe会直接把那段img标签给插入其内容中,但是浏览器确实这样做了!
由于src的schema是 ”javascript“,所以后面的这个image请求是不发送referer的!
出于这个原理,我们就可以绕过一切基于Referer 的防盗链检测了。
secinn中新的代码如下:
<script>var im_2971a6649dfbd861bd7d04df14543c06 = "<img style='max-height:500px;width:auto;' src=http://hiphotos.baidu.com/54nop/pic/item/939407fb49f406266c22eb5e.jpg >";</script> <iframe id=im_2971a6649dfbd861bd7d04df14543c06 style="border:0px;overflow:hidden;" scrolling="no" frameborder="0" src="javascript:parent.im_2971a6649dfbd861bd7d04df14543c06;" onload="javascript:var x=document.getElementById('im_2971a6649dfbd861bd7d04df14543c06').contentWindow.document.images[0]; this.width=x.width+10;this.height=x.height+10;"></iframe>
其中出于用户体验的因素在iframe onload的过程中,根据加载图片的大小修改了iframe本身的长宽。
so,向可怜的百度 hiphotos的防盗链图片说bye bybe吧!
下面是上一篇文章
在 Firefox 中有实现,IE不支持。Opera , Safari 参考的 Firefox 的实现
利用 Data:xxxxxxx 可以写各种不同的内容,甚至能够通过base64嵌入二进制的图片到URL里。
比如,要构造XSS,可以这样:
<a href=”data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=” rel=”nofollow”>test</a>
会弹出个小框。
我经过测试,构造了以下方式可以成功实现不发送Referer的需求
<iframe src=”data:text/html;base64,PGltZyBzcmM9aHR0cDovL2hpcGhvdG9zLmJhaWR1LmNvbS9hdWxsaWs1L3BpYy9pdGVtL2IyY2RiNDQ0YTVlYTQ0MDJjZmZjYTMxNy5qcGVnIC8+” ></iframe>
base64 加密的部分实际上就是
<img src=http://hiphotos.baidu.com/aullik5/pic/item/b2cdb444a5ea4402cffca317.jpeg />
可以查看一下新开iframe的域,使用以下的测试方式
<iframe src=”data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pO2FsZXJ0KHdpbmRvdy5sb2NhdGlvbik7PC9zY3JpcHQ+”></iframe>
<code>在iframe中弹出document.domain,可以看到当前的域还是在 www.a.com
说到这里,就要插两句关于 Firefox 的同源判断和Referer 发送规则了。
一般来说, Firefox 会根据当前的JSContext来寻找当前页面的源,doc->GetPrincipal();
发送的 Referer 头的内容,就是获取的页面源。
在 Firefox 中,点击一个link,或者 <img >, <iframe>等标签获取内容时,都会发送相应的 Referer 出去。甚至右键点击一个link,在新的tab中打开,也会发送referer(在新tab中打开页面本来是不发送referer的,有人提交这个bug 后,就fix了)。
这样看来,利用 Data URL Schema 构造一个新的语境,再执行一个访问的请求,就不会发送 Referer, 应该属于一个浏览器的缺陷。要说是 Feature 也可以,又是有争议的地方啊。</code>
相关文章:
评论|Comments
2 Responses to “转.搞定百度图片防盗链”
留言|Leave a Reply
![如果您自认为是一位忠实的Silverlight-Fans,那么请将此标志放到您的博客中成为一名真正的[银光使者]](http://images.cnblogs.com/cnblogs_com/alamiye010/Silverlighter1.jpg)
十二月 20th, 2009 @ 19:23
在 Firefox 中有实现,IE不支持。Opera , Safari 参考的 Firefox 的实现
利用 Data:xxxxxxx 可以写各种不同的内容,甚至能够通过base64嵌入二进制的图片到URL里。
比如,要构造XSS,可以这样:
test
会弹出个小框。
我经过测试,构造了以下方式可以成功实现不发送Referer的需求
base64 加密的部分实际上就是
可以查看一下新开iframe的域,使用以下的测试方式
十二月 20th, 2009 @ 19:27
在iframe中弹出document.domain,可以看到当前的域还是在 http://www.a.com说到这里,就要插两句关于 Firefox 的同源判断和Referer 发送规则了。
一般来说, Firefox 会根据当前的JSContext来寻找当前页面的源,doc->GetPrincipal();
发送的 Referer 头的内容,就是获取的页面源。
在 Firefox 中,点击一个link,或者
,
这样看来,利用 Data URL Schema 构造一个新的语境,再执行一个访问的请求,就不会发送 Referer, 应该属于一个浏览器的缺陷。要说是 Feature 也可以,又是有争议的地方啊。