zxdfe / FE-Interview

Every step counts
34 stars 1 forks source link

第66题:聊一聊XSS和CSRF呢?(网络安全) #67

Open zxdfe opened 1 year ago

zxdfe commented 1 year ago

XSS

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击.

XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。

对输入保持不可信。

XSS分类

CSRF

Cross-site request forgery 跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求. 利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

一个典型的CSRF攻击有着如下的流程:


cookie一般用于保存信息,你向同一个服务器发请求时会带上浏览器保存的对于那个服务器的cookie,而不管你从哪个网站发请求

ps. http请求都会带着请求目标域下的cookie的。只要你向A网站发了请求,就会带上A网站的cookie。所以重要操作的请求,认证信息都是不能存放在cookie中的。

Cookie 是紧跟域名的。同一个域名下的所有请求,都会携带 Cookie

攻击者借助受害者的 Cookie 骗取服务器的信任,但并不能拿到 Cookie,也看不到 Cookie 的内容

https://github.com/dwqs/blog/issues/68

常见的CSRF攻击类型

  1. GET类型的CSRF

GET类型的CSRF利用非常简单,只需要一个HTTP请求

<img src="http://bank.example/withdraw?amount=10000&for=hacker" > 

在受害者访问含有这个img的页面后,浏览器会自动向http://bank.example/withdraw?account=xiaoming&amount=10000&for=hacker发出一次HTTP请求。bank.example就会收到包含受害者登录信息的一次跨域请求。

  1. POST类型的CSRF

这种类型的CSRF利用起来通常使用的是一个自动提交的表单

 <form action="http://bank.example/withdraw" method=POST>
    <input type="hidden" name="account" value="xiaoming" />
    <input type="hidden" name="amount" value="10000" />
    <input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script> 
  1. 链接类型的CSRF

链接类型的CSRF并不常见,比起其他两种用户打开页面就中招的情况,这种需要用户点击链接才会触发

CSRF防护

  1. 验证Header中的Referer 确定来源域名
    1. 在CSP设置
    2. 页面头部增加meta标签
    3. a标签增加referrerpolicy属性
  2. 加入验证码
  3. CSRF Token
  4. 加自定义Header (和token类似)
  5. Chrome Cookie的Samesite属性设置 strict
Set-Cookie: foo=1; Samesite=Strict
Set-Cookie: bar=2; Samesite=Lax
Set-Cookie: baz=3