这是我参与「第四届青训营 」笔记创作活动的第3天
前言
这次记录的是有关在web开发中会遇到的一些安全问题。
跨站脚本攻击(XSS)
这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览该页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如 cookie窃取等。
XSS主要原因:过于信任客户端提交的数据
主要特点有:
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)
- 绘制UI(例如弹窗),诱骗用户点击/填写表单
举例
在这两个接口里,都没有对content进行过滤,这样的话,攻击者就可以写入恶意代码提交到服务器端,当服务器渲染文件时,就会导致HTML中插入了这段带有恶意代码的片段
XSS攻击主要有三种:存储型XSS,反射型XSS,DOM型XSS
存储型XSS
存储型XSS(Stored XSS),也是持久型XSS,比反射型XSS更具有威胁性。攻击脚本将被永久的存放在目标服务器的数据库或文件中。这是利用起来最方便的跨站类型,跨站代码存储于服务端(比如数据库中)
常见注入点:论坛、博客、留言板、评论等
攻击流程
攻击者在发帖或留言的过程中,将恶意脚本连同正常信息一起注入到发布内容中。随着发布内容被服务器存储下来,恶意脚本也将永久的存放到服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在用户的浏览器中得到执行。
如上图所示,恶意脚本被存储在数据库中,当用户访问页面时,就会涉及到读数据的操作,从而恶意脚本就被植入了用户的电脑中。至此,攻击者就可以窃取到用户的登录信息。
反射型XSS
反射型XSS(Reflected XSS)又称非持久型XSS,这种攻击方式往往具有一次性,只在用户单击时触发。跨站代码一般存在链接中,当受害者请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码通常不存储服务端
常见注入点: 网站的搜索栏、用户登录入口、输入表单等地方,常用来窃取客户端cookies或钓鱼欺骗。
攻击流程
攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接受该目标用户的请求并进行处理,然后服务器把带有XSS的代码发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
举例
如上图所示,攻击者向用户发送了一个恶意链接,当用户点击之后,接口没有对其进行过滤,服务器就接受了该请求,然后将带有XSS代码片段发送给了用户,XSS便植入进了用户电脑中
DOM型XSS
DOM型XSS是一种基于文档对象模型DOM的Web前端漏洞,简单来说就是JavaScript代码缺陷造成的漏洞。与普通XSS不同的是,DOM XSS是在浏览器的解析中改变页面DOM树,且恶意代码并不在返回页面源码中回显,DOM与前两种XSS跨站攻击(反射型、存储型)不同之处在于:不与后台服务器有数据
Dom型XSS常见函数:
- document.write():写入网页内容(可以接受native编码)
- innerHTML:修改节点内容
- eval:将字符串当作代码执行
举例
如上图所示,攻击者发送了带有恶意代码的链接给了用户(比如包含了参数a=10),用户根据链接访问了微博的网站,然后服务器返回了用户静态的html/js(例如包含语句document.write(a)),浏览器则根据其改变了页面的DOM结构,从而使最开始的恶意代码被执行(网页显示a的值为10)
MXSS
一串看似没有任何危害的HTML代码,将逃过XSS过滤器的检测,最终进入某个DOM节点的innerHTML中,浏览器的渲染引擎会将本来没有任何危害的HTML代码渲染成具有潜在危险的XSS攻击代码。
MXSS(mutation-based XSS 突变型XSS)
- 利用了浏览器渲染DOM的特性(独特优化)
- 不同浏览器,会有区别(按浏览器进行攻击)
攻击过程
举例
如上图所示,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。
还有一些现成的工具:
跨站请求伪造(CSRF)
可理解为攻击者盗用某用户的身份,以此用户的名义发送恶意请求,比如:发送邮件、发消息、购买商品,虚拟货币转账等。跟跨站脚本攻击(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
CSRF的特点
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定的HTTP请求,窃取或修改用户敏感信息
攻击流程
举例
![]()
如上图所示,用户并没有访问银行页面,但用户访问了攻击者存放着伪造的转账请求的恶意页面,而用户的浏览器存放着用户登录银行的cookie信息,攻击者便可凭此通过恶意页面向银行发起转账请求,银行验证cookie通过,则请求执行成功,攻击者成功以用户名义转账成功。
CSRF防御方法
1、验证 HTTP Referer 字段
2、在 HTTP 头中自定义属性并验证
3、在请求地址中添加 token 并验证
4、使用SameSite属性,用来防止 CSRF 攻击 和用户追踪(第三方恶意获取cookie)
注入(Injection)
SQL注入
SQL 注入攻击是通过将恶意的 SQL 查询或添加语句插入到应用的输入参数中,再在后台 SQL 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一
攻击流程
举例
![]()
其他类型的注入
- Cli
- OS command
- Server-Side Request Forgery(SSRF),服务端伪造请求--严格而言,SSRF不是injection,但是原理类似.
举例
注入terminal命令
![]()
防御注入的方法
- 使用prepare statement
- 使用正则表达式过滤传入的参数
具体的正则表达式有: 检测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页面判断代码
DoS攻击(Denial of Service)
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及响应更多请求,导致请求挤压,进而雪崩效应.
正则表达式的贪婪模式
一般趋向于最大长度匹配,总是尝试匹配尽可能多的字符,也就是所谓的贪婪匹配。而ReDoS就是基于正则表达式的DoS
ReDoS
正如上图所示,正则表达式匹配ab字段,前两个字符串是可以匹配出来的,但是当最后一个字母是a时,而正则表达式是处于贪婪模式,则会想方法匹配尽可能多的ab,而进行回溯,从而大大增加了响应时间,接口吞吐量下降.
Distributed DoS DDoS 分布式DoS
短时间内,来⾃⼤量僵⼫设备的请求流量,服务器不能及时完成 全部请求,导致请求堆积,进⽽雪崩效应,⽆法响应新请求
总之就一句话:不搞复杂的,量大就完事了
攻击特点
- 直接访问IP
- 任意API
- 消耗大量带宽(耗尽)
举例
就如上图所示,我们都知道在TCP链接的三次握手,攻击者发很多次的SYN包,服务器返回了ACK和SYN的包,而攻击者不完成第三次的握手,导致大量连接未得到释放,当达到最大连接数的时候,新请求就无法进来了,从而导致服务器崩溃.
DoS防御方法
- 定期扫描
- 在骨干节点配置防火墙
- 用足够的机器承受黑客攻击
- 充分利用网络设备保护网络资源
- 过滤不必要的服务和端口
面对ReDoS,我们可以使用代码扫描和正则性能测试,以及不要使用用户提供给我们的正则表达式.
而面对DDoS,我们可以:
前面两种是将面对大量用户涌入时进行过滤,过滤掉僵尸用户,后三种则是面对突增的情况可以使用的方法,比如停止非核心服务来使更多资源可以用到核心的地方.
中间人攻击
当双方在进行通信的时候,可能以为是直接连接到了对方,但是如果有一个中间人进行的拦截,中间加了一层,双方可能无法意识到中间人的存在,从而导致中间人可以获得并篡改双方的通信信息.
导致中间人攻击的原因有:
- 使用明文传输
- 信息篡改不可知
- 对方身份未验证
中间人防御方式
HTTP3内置的新的TLS1.3比TLS1.2的加密系统更加的完善,填补了许多此类的漏洞,从而使通信中的数据包得到了保护。
总结
这篇文章记录了web开发中会遇到的一些安全问题以及解决方案,如果有哪里错误的话麻烦评论提出,后续学习到更多的话也会进行更新,谢谢各位.