01/浏览器自动填充功能
昨天看到了一篇关于Chrome自动填充安全相关的文章。
文中提到:“自动填充是个非常方便的浏览器特性,不过该特性在 Chrome 上会存在一定的信息泄露的风险。Chrome 最近才修复了某个久负盛名漏洞。简单而言,黑客能够利用自动填充窃取你并不想提交给该网站的信息”。
效果如下图:
并提供了一段js来演示漏洞:
仅测试这段js,发现并不能复现此漏洞,但是这个思路引起了我的思考。
02/ 浏览器新特性--autocomplete
再次研究发现,html中要实现浏览器中的表单自动填充主要依靠于autocomplete属性。
起初autocomplete属性只支持on或off。比如下面代码:
上面代码开启了整个表单的autocomplete却对email关闭了autocomplete,我们在点击非email的其他字段即可打开自动填充功能:
但在email中不能展开自动填充功能:
后来HTML5标准加入了对autocomplete的支持,并且给autocomplete加入了更多的标示符,以保证让浏览器准确的知道哪些信息对应着表单里的哪些字段。
比如如下代码:
在autocomplete属性中写入了语义化的字符,比如name、street-address等。
通过这些标识,浏览器即可准确的把相应的信息填入到相应的表单中。
03/钓鱼网站可能会这么用
通过如上demo我们可以发现,当我们选择自动填充以后,chrome不仅会把当前表单字段填充到input中,也会把其他表单字段填充到input中。
那么如果写一些type为hidden的input标签,并且加上autocomplete属性,chrome是否会自动补上带有hidden属性的input标签的信息呢。
我们使用如下代码:
将第一个姓名字段设置为hidden,然后使用自动填充,并且提交表单,查看请求包:
发现type属性为hidden的表单并没有获取到,但其他非hidden的信息都拿到了。
既然type设置成hidden浏览器不会发送数据,隐藏浏览器元素还有很多方法,比如:
在表单外层放一个div,让整个div,display:none。
然而也是不行的:
看来chrome已经在这里做了足够防护。
其实在文章最初提供的js代码也是使用这样的方式来进行攻击的。
现在已经被修复了。那么还有别的办法吗?
04/可利用的方式
让浏览器认识且没有做防护,并且让用户看不见这个表单的方法有很多,比如如下方法:
效果如下:
bingo!!
这种方式浏览器并没有防护,其实让用户看不到表单的方式还有很多,还比如设置成透明等等……
由此想到,如果钓鱼网站利用了这个功能,在用户不知情的情况下,拿到用户浏览器存储的其他信息,会造成很可怕的后果。
在线测试地址:http://www.hackersb.cn/poc/autofill/
05/如何防护
既然这个功能是浏览器的功能,在浏览器还未完全将不可见的表单字段设置为不可填充之前,我们只好通过设置,来避免使用这个功能。
通过打开chrome浏览器的设置--高级设置,然后点掉下图中的复选框,关闭自动填充功能。
06/参考资料
HTML标准 - 表单自动填充
SegmentFault
注:本文原创,转载请通过本公众号联系作者。