跨域脚本攻击(XSS):存储性 XSS 攻击、反射型 XSS 攻击和基于 DOM 的 XSS 攻击

牧云@^-^@ 提交于 2020-03-12 23:44:49

跨域脚本攻击(XSS)是把恶意脚本注入 HTML 文件或 DOM 中,在用户浏览页面时实施攻击的一种手段。

一、恶意脚本能做什么?

  • 窃取 Cookie 信息
document.cookie; // 输出:Gnahz=Test-Cookie
  • 监听用户行为, addEventListener 接口监听键盘事件,比如获取输入的信用卡信息。

  • 修改 DOM 伪造假的登录窗口,欺骗用户输入用户名和密码等信息。

  • 在页面内生成浮窗广告。

二、如何攻击?常见的有三种注入方式:存储性 XSS 攻击、反射型 XSS 攻击和基于 DOM 的 XSS 攻击。

  • 存储型 XSS 攻击

1、黑客利用站点漏洞将一段恶意的 JavaScript 代码提交到数据库中。

2、如果用户向网站请求了包含恶意脚本的页面。

3、浏览这页面时,恶意脚本就会把用户的 Cookie 信息等数据窃取上传到黑客的服务器。

  • 反射型 XSS 攻击

1、用户将一段含有恶意代码的请求提交给 Web 服务器。

2、服务器受到请求后又将恶意代码反射给浏览器。

与存储型 XSS 攻击不同是:服务器不会存储反射 XSS 攻击的脚本。

现实场景:聊天群或邮箱诱导用户点击的恶意链接。

  • 基于 DOM 的 XSS 攻击

不牵涉到 Web 服务器的攻击,通过各种手段将恶意脚本注入用户的页面中,比如通过网络劫持在页面传输过程中或使用页面过程中修改 HTML 页面的内容(通过 WiFi 路由器劫持、通过本地恶意软件劫持)

  • 三者共同点:都需要往页面注入恶意脚本,获取用户数据。

  • 三者不同点:注入方法不一样,存储型 XSS 攻击和放射型 XSS 攻击是服务器端的安全漏洞;而基于 DOM 的攻击是客户端

三、如何防范?

1、服务器对输入脚本过滤或转码

  • 过滤
// strip_tags(str, allowable_tags):从字符串中去除 HTML 和 PHP 标记
$test = "<script>alert('xss攻击')</script>";
echo strip_tags($test); // alert('xss攻击')
  • 转码
// htmlspecialchars(string, flages):将特殊字符转换为 HTML 实体
// flages 默认是  ENT_COMPAT(只转双引号) | ENT_HTML401(HTML 4.01 处理代码)
$xss = '<script>alert("xss攻击")</script>';

// 输出:&lt;script&gt;alert(&quot;xss攻击&quot;)&lt;/script&gt;
echo htmlspecialchars($xss) ."\n"; 

// flages = ENT_QUOTES 是:既转换双引号也转换单引号
// 输出:&lt;script&gt;alert(&#039;xss攻击&#039;)&lt;/script&gt;
echo htmlspecialchars("<script>alert('xss攻击')</script>", ENT_QUOTES); 

2、实施严格的 CSP

  • 限制加载其它域下的资源文件,即使被注入恶意的 JavaScript 代码也无法被加载。

  • 禁止向第三方域提交数据,这样数据就不会被外泄。

  • 禁止执行内联脚本和未授权的脚本。

3、设置 HttpOnly 属性,让 Cookie 仅通过 HTTP 协议访问

// 设置 httponly,让 Cookie 仅通过 HTTP 协议访问
setcookie("Gnahz", "Test-Cookie", time()+3600, '', '', false, true); 

document.cookie; // 输出:""

4、添加验证码防止脚本冒充用户提交危险操作

5、限制不受信任的输入长度,增大 XSS 攻击难度

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!