这是我参与「第四届青训营」笔记创作活动的第5天
安全问题非常常见,会造成严重的危害,主要危害对象有用户、公司、程序员(离职),因此重视Web开发的安全工作很有必要。接下来就从攻击者和防御者两个角度谈一下Web安全。
一、攻击篇
假如你是一个hacker攻击者
常见的攻击方式有
1.Cross-Site Scripting(XSS)
即在一个开发维护的页面中,攻击者通过一个方式将恶意脚本注入页面,当用户访问页面时就会被攻击,造成不好后果。
例如:
XSS攻击主要利用了
- 作为开发者,盲目信任用户提交的内容
- 作为前端工程师,直接把用户提交的字符串转化成了DOM
即
XSS的一些特点
- 通常难以从UI上感知(暗地执行脚本)
- 窃取用户信息(cookie/token)、
- 回执UI(例如弹窗),诱骗用户点击/填写表单
例如:
两个服务端接口submit(用户提交内容,服务端从用户提交的内容中读取conten字段存取到数据库)和render(用来渲染页面,服务器从数据库db中读取content字段返回给浏览器用于生成html)。 无论是从第一个接口写数据,还是第二个接口读数据,都没有对用户提交的信息做过滤。当攻击者将提交一个script标签作为一个content字段提交到服务器端,当服务器渲染该段内容时,会导致html中插入了一个script标签,攻击者也就完成了一次XSS攻击。
XSS分类
1.存储型XSS攻击-Stored XSS(会被存储到数据库中)
特点:
- 恶意脚本被存在数据中
- 访问页面——>读数据===被攻击
- 危害最大,对全部用户可见
即上述例子为存储型XSS攻击
2.反射性XSS攻击——Reflected XSS
特点:
- 不涉及数据库
- 从URL上攻击
例如:
上面是URL,param为参数,下面是服务器代码,服务器代码会从用户请求的param中读取字段并生成html片段,当攻击者将字段param构造成一个恶意的script标签,当用户访问页面时,就会受到攻击。
3.DOM-based XSS
特点
- 不需要服务器的参与
- 恶意攻击的发起+执行,全在浏览器完成
例如:
和刚才的URL一样,执行环境变为浏览器,依旧从从URL中读取参数,创建html标签,将参数对应的值写到html标签属性值中,再插入到具体的DOM中。
Reflected XSS和DOM-based XSS区别
-
完成注入脚本的地方不同 -
Reflected XSS在服务端插入,DOM-based XSS在由浏览器端完成
4.Mutation-based XSS
特点
- 利用了浏览器渲染DOM的特性(独特性化)
- 不同浏览器,会有区别(按浏览器进行攻击)
例如:
这里是一个noscript标签,紧跟着一个p标签,p标签的title属性是字符串,在很多XSS过滤器中都会把这段title属性当做正常的字符串属性,合理合法。但在实际中把这段属性拿到html中渲染,会得到不同的结果。 比如,在chorm中渲染会得到如下结果:
即浏览器将其渲染为一个noscript标签,p和title标签为noscript标签内容,而title的属性成为一个新的标签,因为src属性不符合规范,会触发onerror事件,完成一次XSS攻击。这种攻击方式很巧妙,很难避免。
2.Cross-site request forgery(CSRF)
特点:
- 在用户不知情的前提下
- 利用用户权限(cookie)
- 构造指定HTTP请求,窃取或修改用户敏感信息
例如:
1.
2.
3.
4.
3.注入攻击-Injection
常见有SQL Injection
例如:
攻击可按以下方式攻击
Injection其他形式
-
CLI
-
OS command
-
Server-Side Request Forgery(SSRF),服务端伪造请求 严格来说,SSRF不是Injection,但是原理类似
Denial of Service(DoS)
通过某种方式(构造特定请求),导致服务器资源被显著消耗,来不及想赢更多请求,导致请求挤压,进而雪崩效应。
补充:正则表达式——贪婪模式
即重复匹配时,是否使用?,使用?,即满足一个即可,不使用的话,即贪婪模式,尽可能多的匹配
ReDoS:基于正则表达式的DoS
贪婪:n次不行? n-1次再试试?——回溯
写了一个重复ab的正则表达式去匹配,第一个和第二个能够很快匹配。第三个是若干个ab后又来一个a,先尝试匹配若干ab后发现最后一个a匹配不上,就减少一次ab试一试,发现还是不行,就一直减少尝试,直到最终放弃,这就是一个典型的回溯行为。攻击者正是利用这一点进行攻击。例如开发者写了一个贪婪正则表达式,攻击者传入一个容易发生回溯的字符串进行攻击,这就会导致电脑响应时间增加,接口吞吐量明显降低,响应用户次数减少。
Distributed DoS(DDoS)
短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效益,无法响应新请求。即不搞复杂的,就搞量大的。
特点
- 直接访问IP
- 任意API
- 消耗大量带宽
例如:洪水攻击
基于传输层的一种攻击——中间人攻击
原理:
- 明文传输
- 信息篡改不可知
- 对身份未验证