web开发安全小笔记|青训营笔记

103 阅读10分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

前言

这次记录的是有关在web开发中会遇到的一些安全问题。

跨站脚本攻击(XSS)

这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览该页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如 cookie窃取等。

XSS主要原因:过于信任客户端提交的数据

主要特点有:

  • 通常难以从UI上感知(暗地执行脚本)
  • 窃取用户信息(cookie/token)
  • 绘制UI(例如弹窗),诱骗用户点击/填写表单

举例

image.png

在这两个接口里,都没有对content进行过滤,这样的话,攻击者就可以写入恶意代码提交到服务器端,当服务器渲染文件时,就会导致HTML中插入了这段带有恶意代码的片段

image.png

XSS攻击主要有三种:存储型XSS,反射型XSS,DOM型XSS

存储型XSS

存储型XSS(Stored XSS),也是持久型XSS比反射型XSS更具有威胁性。攻击脚本将被永久的存放在目标服务器的数据库或文件中。这是利用起来最方便的跨站类型,跨站代码存储于服务端(比如数据库中)

常见注入点:论坛、博客、留言板、评论等

攻击流程

攻击者在发帖或留言的过程中,将恶意脚本连同正常信息一起注入到发布内容中。随着发布内容被服务器存储下来,恶意脚本也将永久的存放到服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在用户的浏览器中得到执行。

image.png

如上图所示,恶意脚本被存储在数据库中,当用户访问页面时,就会涉及到读数据的操作,从而恶意脚本就被植入了用户的电脑中。至此,攻击者就可以窃取到用户的登录信息。

反射型XSS

反射型XSS(Reflected XSS)又称非持久型XSS,这种攻击方式往往具有一次性,只在用户单击时触发。跨站代码一般存在链接中,当受害者请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码通常不存储服务端

常见注入点: 网站的搜索栏、用户登录入口、输入表单等地方,常用来窃取客户端cookies或钓鱼欺骗。

攻击流程

攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接受该目标用户的请求并进行处理,然后服务器把带有XSS的代码发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。

举例

image.png

如上图所示,攻击者向用户发送了一个恶意链接,当用户点击之后,接口没有对其进行过滤,服务器就接受了该请求,然后将带有XSS代码片段发送给了用户,XSS便植入进了用户电脑中

DOM型XSS

DOM型XSS是一种基于文档对象模型DOM的Web前端漏洞,简单来说就是JavaScript代码缺陷造成的漏洞。与普通XSS不同的是,DOM XSS是在浏览器的解析中改变页面DOM树,且恶意代码并不在返回页面源码中回显,DOM与前两种XSS跨站攻击(反射型、存储型)不同之处在于:不与后台服务器有数据

Dom型XSS常见函数:

  • document.write():写入网页内容(可以接受native编码)
  • innerHTML:修改节点内容
  • eval:将字符串当作代码执行

举例 50f35a32a581f1d6f9a408d4ec9d135d.png

如上图所示,攻击者发送了带有恶意代码的链接给了用户(比如包含了参数a=10),用户根据链接访问了微博的网站,然后服务器返回了用户静态的html/js(例如包含语句document.write(a)),浏览器则根据其改变了页面的DOM结构,从而使最开始的恶意代码被执行(网页显示a的值为10)

MXSS

一串看似没有任何危害的HTML代码,将逃过XSS过滤器的检测,最终进入某个DOM节点的innerHTML中,浏览器的渲染引擎会将本来没有任何危害的HTML代码渲染成具有潜在危险的XSS攻击代码。

MXSS(mutation-based XSS 突变型XSS)

  • 利用了浏览器渲染DOM的特性(独特优化)
  • 不同浏览器,会有区别(按浏览器进行攻击)

攻击过程 image.png

举例

image.png

如上图所示,p标签下的title属性值是含有恶意代码的,但却绕过了XSS过滤器的检测,成功被浏览器所渲染,而img的src是错误的,从而触发onerror,执行了恶意代码。

XSS防御方法

1.对从数据库或其它后端数据存储获取不可信赖的数据进行合理验证(如年龄只能是数字),对特殊字符(如<、>、以及<script>、javascript等进行过滤)。

2.设置HttpOnly属性,避免攻击者利用跨站脚本漏洞进行Cookie劫持攻击。在java EE中,给Cookie添加HttpOnly代码:

response.setHeader(“Set-Cookie”,“cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly”);

如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性,即便是这样,也不要将重要信息存入cookie。

还有一些现成的工具: image.png

跨站请求伪造(CSRF)

可理解为攻击者盗用某用户的身份,以此用户的名义发送恶意请求,比如:发送邮件、发消息、购买商品,虚拟货币转账等。跟跨站脚本攻击(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

CSRF的特点

  • 在用户不知情的前提下
  • 利用用户权限(cookie)
  • 构造指定的HTTP请求,窃取或修改用户敏感信息

攻击流程

举例 image.png image.png

如上图所示,用户并没有访问银行页面,但用户访问了攻击者存放着伪造的转账请求的恶意页面,而用户的浏览器存放着用户登录银行的cookie信息,攻击者便可凭此通过恶意页面向银行发起转账请求,银行验证cookie通过,则请求执行成功,攻击者成功以用户名义转账成功。

CSRF防御方法

1、验证 HTTP Referer 字段

2、在 HTTP 头中自定义属性并验证

image.png

3、在请求地址中添加 token 并验证 image.png

image.png

4、使用SameSite属性,用来防止 CSRF 攻击 和用户追踪(第三方恶意获取cookie)

image.png

image.png

注入(Injection)

SQL注入

SQL 注入攻击是通过将恶意的 SQL 查询或添加语句插入到应用的输入参数中,再在后台 SQL 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一

攻击流程

image.png

举例 image.png image.png

其他类型的注入

  • Cli
  • OS command
  • Server-Side Request Forgery(SSRF),服务端伪造请求--严格而言,SSRF不是injection,但是原理类似.

举例

image.png 注入terminal命令 image.png

image.png image.png

防御注入的方法

  • 使用prepare statement

image.png

  • 使用正则表达式过滤传入的参数

具体的正则表达式有: 检测SQL meta-characters的正则表达式 :

/(%27)|(\’)|(--)|(%23)|(#)/ix

修正检测SQL meta-characters的正则表达式:

/((%3D)|(=))[^\n]*((%27)|(\’)|(--)|(%3B)|(:))/i

典型的SQL 注入攻击的正则表达式:

/\w*((%27)|(\’))((%6F)|o|(%4F))((%72)|r|(%52))/ix

检测SQL注入,UNION查询关键字的正则表达式:

/((%27)|(\’))union/ix(%27)|(\’)

检测MS SQL Server SQL注入攻击的正则表达式:

/exec(\s|+)+(s|x)p\w+/ix

等等…

  • 字符串过滤
  • jsp中调用该函数检查是否包函非法字符
  • JSP页面判断代码

image.png

DoS攻击(Denial of Service)

通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应.

正则表达式的贪婪模式

image.png

一般趋向于最大长度匹配,总是尝试匹配尽可能多的字符,也就是所谓的贪婪匹配。而ReDoS就是基于正则表达式的DoS

ReDoS

image.png

正如上图所示,正则表达式匹配ab字段,前两个字符串是可以匹配出来的,但是当最后一个字母是a时,而正则表达式是处于贪婪模式,则会想方法匹配尽可能多的ab,而进行回溯,从而大大增加了响应时间,接口吞吐量下降.

Distributed DoS DDoS 分布式DoS

短时间内,来⾃⼤量僵⼫设备的请求流量,服务器不能及时完成 全部请求,导致请求堆积,进⽽雪崩效应,⽆法响应新请求

总之就一句话:不搞复杂的,量大就完事了

攻击特点

  • 直接访问IP
  • 任意API
  • 消耗大量带宽(耗尽)

举例

image.png

就如上图所示,我们都知道在TCP链接的三次握手,攻击者发很多次的SYN包,服务器返回了ACK和SYN的包,而攻击者不完成第三次的握手,导致大量连接未得到释放,当达到最大连接数的时候,新请求就无法进来了,从而导致服务器崩溃.

DoS防御方法

  • 定期扫描
  • 在骨干节点配置防火墙
  • 用足够的机器承受黑客攻击
  • 充分利用网络设备保护网络资源
  • 过滤不必要的服务和端口

面对ReDoS,我们可以使用代码扫描和正则性能测试,以及不要使用用户提供给我们的正则表达式.

image.png

而面对DDoS,我们可以:

image.png

前面两种是将面对大量用户涌入时进行过滤,过滤掉僵尸用户,后三种则是面对突增的情况可以使用的方法,比如停止非核心服务来使更多资源可以用到核心的地方.

中间人攻击

当双方在进行通信的时候,可能以为是直接连接到了对方,但是如果有一个中间人进行的拦截,中间加了一层,双方可能无法意识到中间人的存在,从而导致中间人可以获得并篡改双方的通信信息.

image.png

导致中间人攻击的原因有:

  • 使用明文传输
  • 信息篡改不可知
  • 对方身份未验证

中间人防御方式

image.png

HTTP3内置的新的TLS1.3比TLS1.2的加密系统更加的完善,填补了许多此类的漏洞,从而使通信中的数据包得到了保护。

总结

这篇文章记录了web开发中会遇到的一些安全问题以及解决方案,如果有哪里错误的话麻烦评论提出,后续学习到更多的话也会进行更新,谢谢各位.