原理

页面渲染的数据中蕴含可运行的脚本。

类型

攻打的根底类型包含:反射型(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';">