原理
页面渲染的数据中蕴含可运行的脚本。
类型
攻打的根底类型包含:反射型(url 参数间接注入)和存储型(存储到 DB 后读取时注入)。
注入点
HTML 节点内容注入
el.innerHTML = "<script>alert(1);<\/script>";
下面的代码不会失效,如果你在浏览器控制台运行就会看见:
'\x3Cscript>alert(1);\x3C/script>'
应该是对 script 这种非凡的标签进行了本义。
诱惑用户触发
el.innerHTML = "<button onclick='alert(1)'> 点击我 </button>";
和很多办法相似,如果用户被动触发一次,就能够了(有些操作须要被动用户触发,不然没有权限)。
DOM 属性注入
比方,在加载图片失败的时候,会调用该元素上的 onerror 事件,那么咱们就能够利用图片加载失败的回调触发:
el.innerHTML = "<img src='/images-404.png'onerror='alert(\"图片加载失败,该我触发了~\");'>";
进攻
X-XSS-Protection
浏览器自带防御机制,当初支流浏览器都反对,并且默认都开启了 XSS 爱护,用这个 header 能够敞开它。它有几种配置:
- 0:禁用 XSS 爱护;
- 1:启用 XSS 爱护;
-
1:mode=block:启用 XSS 爱护,并在查看到 XSS 攻打时,进行渲染页面(例如 IE8 中,查看到攻打时,整个页面会被一个 #替换)。
对特定字符做本义
比方如果须要 innerHTML 的模板中蕴含 script 等敏感标签,就把标签本义。
内容安全策略
也就是 CSP(Content Security Policy),用于指定哪些内容可执行。
咱们能够在 http 响应头中设置 Content-Security-Policy,比方,咱们有如下的需要:
- 图片能够从任何中央加载 (留神 “*” 通配符)
- 多媒体文件仅容许从 media1.com 和 media2.com 加载 (不容许从这些站点的子域名)
-
可运行脚本仅容许来自于 userscripts.example.com
如此就能够这样设置:Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
同时 meta 中也反对设置 Content-Security-Policy:
<meta http-equiv="Content-Security-Policy" content="default-src'self'; img-src https://*; child-src'none';">