XSS和CSRF

XSS:跨站脚本攻击(Cross Site Scripting) 攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。 反射型: XSS

目录
  1. XSS
    1. 攻击原理
    2. 攻击方式
    3. 危害
    4. 防范措施
  2. CSRF
    1. 攻击原理
    2. 攻击方式
    3. 危害
    4. 防范措施

XSS#

XSS:跨站脚本攻击(Cross Site Scripting)

攻击原理#

攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。

攻击方式#

  • 反射型: XSS 代码出现在 URL 中,作为输入提交到服务器端,服务器端解析后响应,XSS 代码会响应内容一起传回给浏览器,最后浏览器解析执行代码。一般是攻击者骗取用户去点击不明链接发出攻击。

image.png

https://www.bank.com/xxx/?name=<script>x=document.cookie;alert(x);</script>

  • 存储型: XSS 代码存储在服务端(数据库,内存,文件系统)。比如攻击者在填写个人信息或者发表文章时,加入 XSS 代码,如果服务器没有过滤或者过滤不严的话,那么这些代码将会存储到服务器中,其他的用户访问这个页面的时候就会触发代码执行,从而盗取用户信息。

危害#

  • 盗取各类用户账户, 比如用户网银账户,各类管理员账户
  • 盗取企业重要的具有商业价值的资料
  • 非法转账
  • 控制受害者机器向其他网站发起攻击、注入木马等

防范措施#

  • 输入过滤。永远不要相信用户的输入,对用户输入的数据做一定的过滤。如输入的数据是否符合预期的格式,比如日期格式,Email 格式,电话号码格式等等。这样可以初步对 XSS 漏洞进行防御。上面的措施只在 Web 端做了限制,攻击者通抓包工具如 Fiddler 还是可以绕过前端输入的限制,修改请求注入攻击脚本。因此,后台服务器需要在接收到用户输入的数据后,对特殊危险字符进行过滤或者转义处理,然后再存储到数据库中。

  • 输出编码。服务器端输出到浏览器的数据,可以使用系统的安全函数来进行编码或转义来防范 XSS 攻击。

  • 安全编码。开发需尽量避免 Web 客户端文档重写、重定向或其他敏感操作,同时要避免使用客户端数据,这些操作需尽量在服务器端使用动态页面来实现。

  • HttpOnly Cookie。预防 XSS 攻击窃取用户 cookie 最有效的防御手段。Web 应用程序在设置 cookie 时,将其属性设为 HttpOnly,就可以避免该网页的 cookie 被客户端恶意 JavaScript 窃取,保护用户 cookie 信息。

CSRF#

CSRF: 跨站请求伪造(Cross Site Request Forgery)

攻击原理#

攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一系列操作。

攻击方式#

用户通过账户和密码登录网站 A,网站 A 验证用户账户和密码成功,生成一个 sessionID,并返回给客户端存储在浏览器中,用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B(危险网站),网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求(通过网站 B 上的链接),让用户访问网站 A,

此时,是用户带着 sessionID 去访问网站 A 的,从而来进行一些列的操作。

image.png

危害#

  • 以你的名义发送邮件
  • 盗取你的账号
  • 购买商品
  • 虚拟货币转账等

防范措施#

  • 验证码。应用程序和用户进行交互过程中,特别是账户交易这种核心步骤,强制用户输入验证码,才能完成最终请求。在通常情况下,验证码够很好地遏制 CSRF 攻击。但增加验证码降低了用户的体验,网站不能给所有的操作都加上验证码。所以只能将验证码作为一种辅助手段,在关键业务点设置验证码。

  • referer 验证。HTTP referer 是 header 的一部分,当浏览器向 Web 服务器发送请求时,一般会带上 referer 信息告诉服务器是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

  • Token 验证。目前比较完善的解决方案是加入 Token 信息,即发送请求时在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。