Web开发的安全之旅(攻击篇) | 青训营笔记

216 阅读5分钟

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

安全问题非常常见,会造成严重的危害,主要危害对象有用户、公司、程序员(离职),因此重视Web开发的安全工作很有必要。接下来就从攻击者和防御者两个角度谈一下Web安全。

一、攻击篇

假如你是一个hacker攻击者

常见的攻击方式有

1.Cross-Site Scripting(XSS)

即在一个开发维护的页面中,攻击者通过一个方式将恶意脚本注入页面,当用户访问页面时就会被攻击,造成不好后果。

例如:

image.png

XSS攻击主要利用了

  1. 作为开发者,盲目信任用户提交的内容
  2. 作为前端工程师,直接把用户提交的字符串转化成了DOM

image.png

XSS的一些特点

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

例如:

image.png

两个服务端接口submit(用户提交内容,服务端从用户提交的内容中读取conten字段存取到数据库)和render(用来渲染页面,服务器从数据库db中读取content字段返回给浏览器用于生成html)。 无论是从第一个接口写数据,还是第二个接口读数据,都没有对用户提交的信息做过滤。当攻击者将提交一个script标签作为一个content字段提交到服务器端,当服务器渲染该段内容时,会导致html中插入了一个script标签,攻击者也就完成了一次XSS攻击。

image.png

XSS分类

1.存储型XSS攻击-Stored XSS(会被存储到数据库中)

特点:

  • 恶意脚本被存在数据中
  • 访问页面——>读数据===被攻击
  • 危害最大,对全部用户可见

即上述例子为存储型XSS攻击

2.反射性XSS攻击——Reflected XSS

特点:

  • 不涉及数据库
  • 从URL上攻击

例如:

image.png

上面是URL,param为参数,下面是服务器代码,服务器代码会从用户请求的param中读取字段并生成html片段,当攻击者将字段param构造成一个恶意的script标签,当用户访问页面时,就会受到攻击。

3.DOM-based XSS

特点

  • 不需要服务器的参与
  • 恶意攻击的发起+执行,全在浏览器完成

例如:

image.png

和刚才的URL一样,执行环境变为浏览器,依旧从从URL中读取参数,创建html标签,将参数对应的值写到html标签属性值中,再插入到具体的DOM中。

Reflected XSS和DOM-based XSS区别
  • 完成注入脚本的地方不同
    
  • Reflected XSS在服务端插入,DOM-based XSS在由浏览器端完成
    

image.png

4.Mutation-based XSS

特点

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

例如:

image.png

这里是一个noscript标签,紧跟着一个p标签,p标签的title属性是字符串,在很多XSS过滤器中都会把这段title属性当做正常的字符串属性,合理合法。但在实际中把这段属性拿到html中渲染,会得到不同的结果。 比如,在chorm中渲染会得到如下结果:

image.png

即浏览器将其渲染为一个noscript标签,p和title标签为noscript标签内容,而title的属性成为一个新的标签,因为src属性不符合规范,会触发onerror事件,完成一次XSS攻击。这种攻击方式很巧妙,很难避免。

2.Cross-site request forgery(CSRF)

特点:

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

例如:

1.image.png

2.image.png

3.image.png

4.image.png

3.注入攻击-Injection

常见有SQL Injection

image.png

例如:

image.png

攻击可按以下方式攻击

image.png

Injection其他形式
  • CLI

  • OS command

  • Server-Side Request Forgery(SSRF),服务端伪造请求 严格来说,SSRF不是Injection,但是原理类似

Denial of Service(DoS)

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

补充:正则表达式——贪婪模式 即重复匹配时,是否使用?,使用?,即满足一个即可,不使用的话,即贪婪模式,尽可能多的匹配 image.png

ReDoS:基于正则表达式的DoS

贪婪:n次不行? n-1次再试试?——回溯

image.png

写了一个重复ab的正则表达式去匹配,第一个和第二个能够很快匹配。第三个是若干个ab后又来一个a,先尝试匹配若干ab后发现最后一个a匹配不上,就减少一次ab试一试,发现还是不行,就一直减少尝试,直到最终放弃,这就是一个典型的回溯行为。攻击者正是利用这一点进行攻击。例如开发者写了一个贪婪正则表达式,攻击者传入一个容易发生回溯的字符串进行攻击,这就会导致电脑响应时间增加,接口吞吐量明显降低,响应用户次数减少。

Distributed DoS(DDoS)

短时间内,来自大量僵尸设备的请求流量,服务器不能及时完成全部请求,导致请求堆积,进而雪崩效益,无法响应新请求。即不搞复杂的,就搞量大的。

特点

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

例如:洪水攻击

image.png

基于传输层的一种攻击——中间人攻击

image.png

原理:

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