- 这是我参与「第四届青训营」笔记创作活动的第2天。
前言
生活中我们经常遇到信息诈骗与信息安全问题,网页作为用户们最经常点击、浏览的地方更是网路安全问题的高发地区。这会损害到用户、公司还有自己的利益(会被炒鱿鱼的 😭)关乎众多。今天我们就跟着青训营的刘老师开启web开发的安全之旅。 ✊
知己知彼,百战不殆。我们先来了解关于web安全的攻击篇。
攻击篇
xss攻击
Cross Site Scripting跨站点脚本攻击又称为xss。 这种攻击是攻击者通过一个方式将恶意脚本注入页面,当用户访问页面时就会被攻击,造成不好后果。
而攻击者是利用
- 开发人员盲目信用用户提交的内容。
- 开发者将字符串直接转化生成Dom tree。
即将string 👉Dom,然后通过类似于以下的恶意代码向站点植入xss。
document.writeelement.innerHTML = anyStringSSR(user_data) // 伪码
xss的几个特点:
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户的敏感信息(cookie/token)
- 绘制UI(比如弹窗),诱骗用户点击/填写表单
举个例子:
服务端有两个接口:
submit用户提交内容,服务端从用户提交的内容中读取conten字段存取到数据库render用来渲染页面,服务器从数据库db中读取content字段返回生成HTML,并返回给用户 在这里,开发员的程序没有对用户所提交的数据进行任何的过滤。这样的话,攻击者可以通过提交一个script标签作为一个content字段提交到服务器端,当服务器渲染该段内容时,会导致html中插入了一个script标签,攻击者也就完成了一次XSS攻击。
xss的常见攻击方式:
1. 存储型XSS攻击-Stored XSS(会被存储到数据库中)
特点有:
- 恶意脚本被存在数据库中。
- 访问页面 -> 读数据 === 被攻击。
- 危害最大,对全部用户可见。
2. 反射性XSS攻击——Reflected XSS
特点有:
- 不涉及数据库。
- 从URL上攻击。
攻击者通过param为参数构造了一个带有恶意参数的URL在构造的URL 地址被打开后,其中包含的恶意代码参数被浏览器解析和执行,从而完成了Reflected xss
3.Dom型——DOM-based XSS
特点有:
- 不需要服务器的参与
- 恶意攻击的发起 + 执行,都是在浏览器完成的
DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,通过从URL中读取参数,创建html标签,将参数对应的值写到html标签属性值中,再插入到具体的DOM中。
要注意Reflected xss 与Dom型 xss的区别:
- 插入脚本的地方不同。
- reflected xss 通过网页向服务器发送请求,在从服务器中带回有恶意脚本的网页发起带有用户cookie的请求。
- Dom是直接通过浏览器仅仅是通过网页本身的JavaScript进行渲染触发。
4.Mutation-based XSS
特点有:
- 利用了浏览器渲染DOM的特性(独特性化)
- 不同浏览器,会有区别(按浏览器进行攻击)
这是由浏览器解释HTML标准的方式不同造成的。这段看似合理合法的字符串属性的title,在chorm中渲染就会出现第二张图的情况。浏览器将其渲染为一个noscript标签,p和title标签为noscript标签内容,而title的属性成为一个新的标签,因为src属性不符合规范,会触发onerror事件,完成一次XSS攻击。这种攻击很巧妙,由于浏览器的不同,很难对服务器上的用户输入进行清理。
CSRF 跨站请求伪造
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
特点有:在用户不知情的前提下 利用用户权限(cookie) 构造指定HTTP请求,窃取或修改用户敏感信息
例如:
在这里,用户点击收到邮件中的恶意链接,访问了恶意页面,在这个恶意页面中有攻击者构造的HTTP请求——向银行发起一笔转账(在另外一个域名),serve A 接收到了请求,发现请求上有用户的cookie就验证通过,执行成功后返回结果。
可以发一个GET请求:
攻击者通过建立<a>标签或者<img>标签a标签需要用户主动点击触发,而img标签进入页面自动就会触发。
注入 Injection
Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。
举个例子:
- 服务端读取一些请求字段
- 直接将这些字段以字符串的形式拼接 SQL 语句
- 再通过SQL语句恶意的删除数据库中的信息。
还有其他的注入:
- CLI
- OS command
- Server-Side Request Forgery(SSRF),服务端伪造请求 严格来说,SSRF不是Injection,但是原理类似
Denial of Service(DoS)
DoS又被称为拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务,最常见的DoS攻击有计算机网络宽带攻击和连通性攻击。通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及想赢更多请求,导致请求挤压,进而雪崩效应。
这里涉及到一些正则表达式——贪婪模式(是否使用?,使用?,即满足一个即可,不使用的话,即贪婪模式,尽可能多的匹配)
举个例子:
写了一个重复ab的正则表达式去匹配,第一个和第二个能够很快匹配。第三个是若干个ab后又来一个a,先尝试匹配若干ab后发现最后一个a匹配不上,就减少一次ab试一试,发现还是不行,就一直减少尝试,直到最终放弃,这就是一个典型的回溯行为。攻击者利用这一点,在服务器段写入一个贪婪的正则表达式,再传入一个容易发生回溯行为的字符串,来对服务器进行攻击,会导致服务器端相应的时间大大的延长、接口吞吐量明显降低、响应用户的请求大大的下降。
Distributed DoS(DDoS)
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效益,无法响应新请求。
即不搞复杂的,量大就完事儿了。
特点有:
- 直接访问IP
- 任意API
- 消耗大量带宽
举个例子:
攻击者利用了三次握手,发送大量的TCP请求给服务器,服务器按照规范,返回了ACK+SYN,但攻击者不会返回ACK,会导致三次握手无法完成,连接数无法被释放,很快服务器就达到了最大连接数,所以的新请求无法被响应,从而完成了攻击。
基于传输层的一种攻击——中间人攻击
当双方在进行通信的时候,都以为对方是方,但是如果有一个中间人进行的拦截,中间加了一层,双方可能无法意识到中间人的存在,他可能会进行一些攻击。
中间人插在服务器与浏览器直接,窃取信息、修改返回结果。而中间人可以是一个恶意的浏览器,可以是一个便宜的路由器,甚至是一些不法运营商。
中间人主要利用了:
- 明文传输。
- 信息篡改不可知。
- 对方身份未验证
总结
在这一篇中,我们站在攻击者的角度了解了web安全中各种攻击利用的原来,在后面的防御篇中我们将根据攻击的方式进行一系列的防御!