浅谈link标签import造成的XSS

Posted by Lnyas on

最开始在twitter上看到的方法, 需要一个可控的文件上传

会bypass chrome auditor

想了一下, 既然有可控文件, 那么为什么不直接用script引入:

同样可以触发xss

于是开始考虑用link import的方法能否可以挖掘出更多的攻击面

有CSP的情况

首先考虑的是用link能否bypass限制了script-src为none的csp, 如果CSP限制script-src 'unsafe-inline'

那么明显用script src的方法不行, 那么用import是否能幸免?

答案是不行, 用link import的资源仍被 CSP 的 script-src 拦截

那将CSP设置为script-src 'self' 'unsafe-inline'的时候, 用script标签引入和link引入没有任何差别, 而更过分的是, 如果CSP设置为script-src 'self', 用script引入可以正常执行, 但是用link引入则会被拦截, 所以可以猜测用link标签引入经历了两次CSP的过滤, 首先判断href指向的连接是否符合script-src, 接着在import时相当于在html文档中直接插入script标签, 因此需要经过unsafe-inline的判断

如果是nonce呢? 将CSP设置为:script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa', 用script-src的方法引入只需要传入nonce即可, 但是如果用link引入, 即使我在1.sh内设置了nonce, 仍然会被拦截, 需要设置为script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa' 'self'才能正确执行, 这里稍微想一下就可以知道原因和上面的一样, link引入js需要经过csp的两次判断

利用点?

用script src引入的文件需要保证JS的完整性, 有任何的语法错误都不会解析执行, 因此基本上需要用户对上传的文件内容有完全的控制权限, 而用link标签引入的则不一样, script标签自我闭合可以保证JS语法的正确, 因此即使上传的文件被添加文件头或是什么其他的动作也可以保证执行