面试官:你了解哪些系统安全漏洞【含解析】

94 阅读8分钟

dan-nelson-ah-HeguOe9k-unsplash.jpg

前言

Web 应用中存在很多安全风险,这些风险可能会被黑客利用。轻则篡改网页内容,重则窃取网站内部数据。更为严重的,则是在网页中植入恶意代码,使用户受到侵害。

常见的安全漏洞:

XSS 攻击:

XSS(Cross-Site Scripting,跨站脚本攻击)攻击是最常见的 Web 攻击,其重点是跨域客户端执行,主要防范方式就是对 输入和输出的字符进行转义

XSS 攻击一般分为两类:

  • 反射型的 XSS 攻击 (Reflected XSS), 防范:转义处理
  • 存储型的 XSS 攻击 (Stored XSS)

Reflected XSS

反射型的 XSS 攻击,主要是由服务端接收到客户端的不安全输入,在客户端触发执行从而发起 Web 攻击。比如:

在某购物网站搜索物品,搜索结果会显示搜索的关键词。搜索关键词填入 <script>alert('handsome boy')</script>,点击搜索。页面没有对关键词进行过滤,这段代码就会直接在页面上执行,弹出 alert。

Stored XSS

基于存储的 XSS 攻击,是通过提交带有恶意脚本的内容存储在服务器上,当其他人查看这些内容时发起 Web 攻击。一般提交的内容都是通过一些富文本编辑器编辑的,很容易插入危险代码。

防范方式

  1. escapeunescape

    • escape 函数对字符串进行编码,将特殊字符转换为%后跟两位十六进制数的格式。
    • unescape 函数对使用 escape 函数编码的字符串进行解码。
    • 这两个函数已经被废弃,不推荐使用
  2. encodeURIComponentdecodeURIComponent

    • encodeURIComponent 用于对URL的组成部分进行编码,只对某些字符进行编码,保留字母数字字符和 - _ . ! ~ * ' ( )
    • decodeURIComponent 用于解码使用 encodeURIComponent 编码的字符串。
  3. encodeURIdecodeURI

    • encodeURI 对整个URI进行编码,只对某些字符进行编码,保留所有字母数字字符以及 # $ & + , / : ; = ? @
    • decodeURI 用于解码使用 encodeURI 编码的URI。

代码实例:

// `escape`、`unescape`
let a={b:1} 
escape(JSON.stringify(a))  //输出: '%7B%22b%22%3A1%7D'
unescape('%7B%22b%22%3A1%7D')  // 输出:'{"b":1}'

// `encodeURIComponent`、`decodeURIComponent`
encodeURIComponent("<script>alert(123)</script>")
// 输出:'%3Cscript%3Ealert(123)%3C%2Fscript%3E'
decodeURIComponent('%3Cscript%3Ealert(123)%3C%2Fscript%3E');
// 输出:'\x3Cscript>alert(123)\x3C/script>'

// 使用 encodeURI 编码整个URI
var encodedURI =encodeURI("http://example.com/#/Hello, World!");
console.log(encodedURI); // 输出:'http://example.com/#/Hello,%20World!'
// 注意:encodeURI 不会对 # 进行编码

JSONP XSS

JSONP 的 callback 参数非常危险,它有两种风险可能导致 XSS:

  • callback 参数意外截断 js 代码,特殊字符单引号、双引号、换行符均存在风险。
  • callback 参数恶意添加标签(如

http 头的设置

Content Security Policy(内容安全策略),简称 CSP,主要用来定义页面可以加载哪些资源,减少 XSS 的发生防范方式 nginx 中添加:

server{
  location / {
    add_header Content-Security-Policy "...."; // html 中只有被允许的内容才会被加载
    add_header X-Download-Options `noopen`; //禁用 IE 下载框的 Open 按钮
    add_header X-Content-Type-Options `nosniff`; //禁用 IE8 的自动嗅探 MIME 功能
    add_header X-XSS-Protection `"1; mode=block"`; // 提供 XSS 检测与防范机制
  }
}

CSRF 攻击:

CSRF(Cross-site request forgery 跨站请求伪造), 通常缩写为 CSRF 或者 XSRF,是一种对网站的恶意利用。CSRF 攻击会发起恶意伪造的请求

防范方式 通常来说,对 CSRF 攻击有一些通用的防范方案,简单介绍几种常用防范方案:

  • 验证Referer头部:检查HTTP请求的Referer头部,确保请求是从合法的页面发起的。

  • 自定义头部:信任带有特定的 header(比如 X-My-Name: java)的请求。

  • X-Frame-Options响应头:使用X-Frame-Options响应头,防止页面被其他网站通过iframe嵌入

  • X-XSS-Protection响应头:启用X-XSS-Protection响应头,提供额外的XSS防护,间接帮助防范CSRF。

  • CSRF令牌存储将CSRF令牌存储在HTTPOnly的Cookie中,这样JavaScript代码无法访问令牌。

钓鱼攻击:

利用网站的跳转链接或者图片制造钓鱼陷阱。

1. url 钓鱼 服务端未对传入的跳转 url 变量进行检查和控制,可能导致可恶意构造任意一个恶意地址,诱导用户跳转到恶意网站。通过转到恶意网站欺骗用户输入用户名和密码盗取用户信息,或欺骗用户进行金钱交易;

  • 第一种:若跳转的 url 事先是可以确定的,包括 url 和参数的值,则可以在后台先配置好,url 参数只需传对应 url 的索引即可,通过索引找到对应具体 url 再进行跳转;
  • 第二种:若跳转的 url 事先不确定但其输入是由后台生成的(不是用户通过参数传入),则可以先生成好跳转链接然后进行签名;

防范方式

  • 进行跳转的时候对 url 进行按规则校验:判断 url 是否在应用授权的白名单内

  • 跳转时弹窗给用户提示,告知这是第三方链接

2. 图片钓鱼 如果可以允许用户向网页里插入未经验证的外链图片,这可能出现钓鱼风险。

防范方式

  • 对外联URL进行转义处理,避免在连接中植入xss攻击

3. iframe 钓鱼

通过内嵌 iframe 到被攻击的网页中,攻击者可以引导用户去点击 iframe 指向的危险网站,甚至遮盖,影响网站的正常功能,劫持用户的点击操作。

防范方式

## 表示该页面可以在相同域名页面的 frame 中展示
add_header X-Frame-Options SAMEORIGIN;
## 表示该页面可以在指定来源的 frame 中展示
#add_header X-Frame-Options "ALLOW-FROM  http://domain.com";

HTTP 参数污染:

Http Parameter Pollution(HPP),即 HTTP 参数污染攻击。在 HTTP 协议中是允许同样名称的参数出现多次,而由于应用的实现不规范,攻击者通过传播参数的时候传输 key 相同而 value 不同的参数,从而达到绕过某些防护的后果。

HPP 可能导致的安全威胁有:

  • 绕过防护和参数校验。
  • 产生逻辑漏洞和报错,影响应用代码执行。

防范方式

对客户端传输 key 相同而 value 不同的参数时,强制使用第一个参数,因此不会导致 HPP 攻击。

其他漏洞攻防

DDOS 攻击

解决方案:

  • 流量监控:使用入侵检测系统(IDS)和流量监控工具来检测异常流量模式。
  • 分布式防御:利用内容分发网络(CDN)和分布式拒绝服务(DDoS)防护服务。
  • 黑洞路由:在攻击期间,将流量导向一个黑洞,即一个不存在的地址,从而保护目标系统。

SQL 注入攻击

解决方案:

  • 参数化查询:使用参数化命令执行 SQL 语句来防止恶意 SQL 代码的注入。
  • 输入验证:对所有输入数据进行严格的验证,确保它们符合预期格式。
  • 最小权限原则:确保数据库账户具有执行其功能所需的最小权限。

弱口令

解决方案:

  • 强密码策略:强制执行包含大小写字母、数字和特殊字符的复杂密码
  • 密码过期:定期更换密码,并禁止重复使用旧密码。
  • 多因素认证:增加一层额外的安全验证,如短信验证码、电子邮件确认或生物识别。

点击劫持攻击

解决方案:

  • X-Frame-Options:使用 HTTP 头部X-Frame-Options来防止页面被其他站点框架。
  • 内容安全策略:使用 CSP(Content Security Policy)来限制资源加载,防止点击劫持。

会话劫持攻击

解决方案:

  • HTTPS:使用安全的 HTTP 来加密会话 cookie,防止中间人攻击。
  • 安全的 cookie 属性:设置 cookie 的HttpOnlySecure属性,使它们不能被 JavaScript 访问,并且只能通过 HTTPS 传输。
  • 会话超时:实施会话超时机制,减少会话劫持的风险。

文件包含漏洞

解决方案:

  • 输入验证:确保所有文件包含操作都对输入进行了严格的验证。
  • 限制文件访问:限制可包含的文件类型和路径,避免访问系统文件。
  • 使用白名单:使用白名单来验证可包含的文件,而不是黑名单。

端口扫描

解决方案:

  • 防火墙规则配置防火墙规则,仅允许必要的端口开放
  • 入侵检测系统:使用 IDS 来监控和警报可疑的端口扫描行为。
  • 网络监控:定期进行网络监控,以便快速响应任何异常活动。

中间人攻击

解决方案:

  • HTTPS使用 HTTPS 来加密客户端和服务器之间的通信,防止数据被截获和篡改。
  • 证书验证:确保所有 SSL/TLS 证书都是由可信的证书颁发机构签发的,并启用证书验证。
  • 网络隔离:使用虚拟专用网络(VPN)或专用网络来隔离敏感通信。

结语:

Web应用安全性不容忽视,面对XSS、CSRF、SQL注入等攻击手段,必须采取一系列防御措施。文章全面介绍了前端和后端的防护策略:如使用转义函数、设置HTTP响应头、参数化查询、强密码策略等,以及对点击劫持、会话劫持、文件包含漏洞等的预防方法。通过这些策略,可以大幅降低Web应用的安全风险,保障用户数据安全和网站稳定运行。