关于XSS和CSRF

747 阅读6分钟

常见的web安全的涉及内容

  • XSS攻击

  • CSRF攻击

  • SQL注入

  • HTTP中间人

  • 密码安全

  • 传输安全


XSS攻击

Cross Site SCripting 因为要和CSS区分,所以简称XSS

什么是XSS

XSS跨站脚本攻击,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户浏览器上运行来窃取用户敏感信息或者利用这些信息冒充用户向网站发起攻击

根据攻击来源XSS攻击可分为三种类型

  1. 反射型
  2. 存储型
  3. DOM型
反射型

反射型XSS是把用户输入的数据(不可信数据)从服务器反射给用户浏览器,当用户的输入或者一些用户可控参数未经处理地输出到页面上,就容易产生xss漏洞。

攻击流程

漏洞常见于通过url传递参数的功能,如搜索等。攻击者构造一个带有恶意代码的url,当用户打开带有恶意代码的url,网站服务端将恶意代码从url中取出,拼接在HTML中返回给浏览器,用户浏览器解析后恶意代码也会执行,恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行操作

先来看一个简单的搜索:例如百度,发现我们的搜索词,会挂在链接上,而且会在搜索框中展示

假设有一个没有做过XSS防范的网站,我们将链接写为:

https://www.baidu.com/s?wd=<script>alert(1)</script>

这时发现因为网站没有做XSS过滤,我们写过的一些东西都会被执行到页面之中

存储型

存储型(或HTML注入型/持久型)XSS攻击不需要用户点击特制链接,攻击者仅需要提交攻击代码到一个网站上其他用户可能访问的地方,比如用户评论、留言板等,当用户访问时攻击代码自动执行

攻击流程

假设有一个没有防范的网站,有一个评论的功能,如果输入一段可执行的js代码存在数据库,用户查看时,内将容插入到dom中执行这段代码

存储型与反射型漏洞的区别是:存储型XSS恶意代码存在数据库中,反射型XSS的恶意代码存在url中

DOM型

DOM型XSS是通过修改页面的DOM节点形成的。攻击者构造一个含有恶意代码的url,当用户打开时前端取出url中的恶意代码并执行,攻击者就可以窃取用户信息或者冒充用户行为

假如我们页面中有一个img元素,他的图片链接是取的我们的页面参数id拼合而成,正常链接

http://localhost:9527/index?id=1

此时假如页面没有做过防范,我们将链接替换为

http://localhost:9527/index?id=1" onerror="alert(document.cookie)

此时查看页面元素

当图片加载失败时就会执行onError方法


如何防范XSS攻击

通常来说,对于XSS攻击有一些通用的防范方案,简单的介绍几种常见的防范方案

  1. 输入检查。对于用户的输入进行检查、转义、过滤等。建立可信任的字符和html标签白名单,对于不在白名单吧内的字符或者标签进行过滤或编码
  2. 输入长度控制。对于不可信的输入应该限定一个合理的长度,虽然不能完全防止但可以增加攻击的难度
  3. 设置HttpOnly,浏览器将禁止页面的JavaScript访问带有HttpOnly属性的cookie,来防止恶意脚本通过document.cookie访问到用户隐私数据
  4. 现在主流浏览器内置了防范XSS的措施,如内容安全策略(CSPdeveloper.mozilla.org/zh-CN/docs/…

CSRF攻击

Cross-site request forgert 跨站请求伪造,指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起跨站请求

img

攻击步骤:

  1. 首先用户C浏览并登录了受信任站点A

  2. 登录信息验证通过以后,站点A会在返回给浏览器的信息中带上已登录的cookie,cookie信息会在浏览器端保存一定时间(根据服务端设置而定)

  3. 完成这一步以后,用户在没有登出(清除站点A的cookie)站点A的情况下,访问恶意站点B

  4. 这时恶意站点 B的某个页面向站点A发起请求,而这个请求会带上浏览器端所保存的站点A的cookie

  5. 站点A根据请求所带的cookie,判断此请求为用户C所发送的返回数据

特点:

1.攻击一般发起在第三方网站,而不是被攻击的网站。

2.攻击是利用受害者在被攻击网站的登录凭证,冒充受害者的操作,预测出被攻击网站的接口参数进行请求伪造


CSRF防御方法

通常来说对于CSRF攻击有一些通用的防范方案,简单介绍几种常用的方式

SameSite属性

Cookie的SameSite属性用来限制第三方Coookie,该属性设置 Cookie 不随着跨域请求发送,可以设置三个值: Strict\Lax\None

Strict

完全禁止第三方Cookie,跨站点时,任何情况下都不会发送Cookie,也就是说只有当前网页的Url与请求目标一致才会携带Cookie

Set-Cookie: CookieName=CookieValue; SameSite=Strict;

Lax

大多数情况也是不发送第三方Cookie,但是导航到目标网址的Get请求除外

Set-Cookie: CookieName=CookieValue; SameSite=Lax; 导航到目标网址的 GET 请求,只包括三种情况:链接,预加载请求,GET 表单。 SameSite属性: www.ruanyifeng.com/blog/2019/0…

同源检测

在http协议中,异步请求会携带两个Header,用于标记来源域名。

  • Origin Header
  • Referer Header

这两个Header在浏览器发起请求时大多数情况会自动带上,并且不能由前端自定义,服务器可以通过解析这两个人Header中的域名,确定来源域名。通过校验来源域名,可以知道请求是否从本站发出,我们可以通过拒绝非本站发出的请求来避免CSRF攻击

服务端验证 Token 是否正确

服务器下发一个随机 Token,每次发起请求时将 Token 携带上,服务器验证 Token 是否有效。

验证码

CSRF攻击往往是在用户不知情的情况下伪造请求,而验证码会强制用户必须与应用进行交互才能完成最终请求,而因为CSRF攻击无法获取到验证码,就可以有效的防范攻击,但是出于用户体验考虑不能给网站所有操作都加上验证码,所以验证码只能作为防御CSRF的辅助手段