Skip to content

XSS攻击与 CSRF攻击

作者:guo-zi-xin
更新于:9 个月前
字数统计:1.3k 字
阅读时长:4 分钟

XSS攻击

Cross-site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使其在用户的浏览器上运行,利用这些恶意脚本,攻击者可获取用户的敏感信息 如 CookieSessionID等,进而危害数据安全

常见注入方法
  • 在 HTML 中内嵌的文本中,恶意内容以 Script 标签形成注入
  • 在内联的 JavaScript 中, 拼接的数据突破了原本的限制(字符串、变量、方法名等)
  • 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其它属性或者标签
  • 在标签的 href、src 等属性中,包含 JavaScript(伪协议)等可执行代码
  • 在 style 属性和标签中, 包含类似 background-image:url("javascript...")的代码 (新版浏览器已经可以防范)
  • 在 style 属性和标签中,包含类似 expression(...)的CSS表达式代码(新版浏览器已经可以防范)
XSS 攻击分类

根据攻击的来源, XSS攻击可以分为存储行,反射型和DOM型三种

  1. 存储型: 即攻击被存储到服务到,常见的是在评论区插入攻击脚本,如果脚本被储存到服务端, 那么所有看见对应评论的用户都会受到攻击
  2. 反射型: 攻击者将脚本混在URL里, 服务端接收到URL将恶意代码当作参数取出并拼接在HTML里返回,浏览器解析此HTML后执行恶意代码
  3. DOM型: 将攻击脚本写在URL中, 诱导用户点击该URL,如果URL被解析,那么攻击脚本就会被运行

反射型XSS根存储型XSS的区别: 存储型XSS的恶意代码存放在数据库里,反射型XSS的恶意代码存在URL里

DOM型XSS跟前两种XSS攻击的区别: DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的安全漏洞,其它两种XSS都属于服务端的安全漏洞

防范方法
  • HttpOnly: 在cookie中设置httponly属性之后,js脚本将无法获取到cookie信息
  • 输入过滤: 一般是用于对于输入格式的检查, 例如: 邮箱、电话号码、用户名、密码等等,按照规定的格式输入,后端也需要做相同的过滤检查,因为攻击者完全可以绕过正常输入流程,直接利用借口向服务器发送设置
  • 转义HTML: 如果拼接 HTML 是必要的,就需要对引号、尖括号,斜杠进行转移,但这还不是很完善。想对HTML模版各处插入点进行充分的转移,就需要采用合适的转义库
javascript
function escape(str) {
  str = str.replace(/&/g, '&')
  str = str.replace(/</g, '&lt;')
  str = str.replace(/>/g, '&gt;')
  str = str.replace(/"/g, '&quto;')
  str = str.replace(/'/g, '&#39;')
  str = str.replace(/`/g, '&#96;')
  str = str.replace(/\//g, '&#x2F;')
  return str
}
  • 白名单过滤: 对于现实富文本来说,不能通过上面的办法来转义所有字符,因为这样也会把需要的格式也转义掉。这种情况推荐使用白名单过滤的方法

CSRF攻击

Cross-site request forgery (跨站请求伪造),也被称为one-click attack 或者 session riding, 通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已经登陆的web应用程序上执行非本意 的操作的攻击方法。例如: 攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击者发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击网站执行 某种操作的目的。

防御方法
  • 验证码: 强制用户必须与应用进行交互,才能最终完成请求。此种方式能很好的遏制CSRF,但用户体验较差
  • Refer Check: 请求来源限制,此方法成本最低,但是并不能保证100%有效。因为服务器并不是什么时候都能取到 Referer,而且低版本浏览器存在伪造 Referer的风险
  • Token: Token验证CSRF防御机制是公认的最适合的方案,若网站同时存在XSS漏洞时候, Token也是空谈

XSS 和 CSRF 的区别

  • 通常来讲CSRF是由XSS实现的,CSRF时常也被成为XSRF(CSRF实现的方式还可以是直接通过命令行发起请求等)
  • 本质上讲,XSS是代码注入问题,CSRF是HTTP问题,XSS是内容没有过滤导致浏览器将攻击者的输入当代码执行
  • CSRF则是因为浏览器在发送HTTP请求时候自动带上 cookie,而一般网站的 session 都保存在 cookie里 (token验证可以避免)

来源

XSS攻击和CSRF攻击
https://juejin.cn/post/6945716641464320008

人生没有捷径,就像到二仙桥必须要走成华大道。