《白帽子讲web安全》读书笔记

安全世界观

  • 安全的本质是信任问题。
  • 安全是一个持续的过程,不可能一劳永逸。
  • 安全三要素:机密性,完整性,可用性
  • 实施安全评估:资产等级划分,威胁分析(微软STRIDE模型),风险分析(DREAD),确认解决方案。
  • 互联网安全的核心问题是数据安全问题

设计安全方案

Secure By Default原则

  • 黑白名单
  • 最小权限原则
  • 纵深防御原则
  • 数据与代码分离原则(适用于由于注入引发的安全场景)
  • 不可预测性原则

浏览器安全

  • 同源策略
    • 浏览器的同源策略限制了来自不同源的Document或脚本对当前Document读取或设置某些属性。当js被浏览器认为来自不同源时,请求被拒绝。
  • 浏览器沙箱
  • 恶意网址拦截

XSS跨站脚本攻击

XSS攻击通常是指黑客通过“HTML注入”篡改页面,插入恶意脚本,从而在用户浏览网页时,控制浏览器的一种攻击

xss类型

  • 反射型
    • 简单把用户数据反射给浏览器。黑客往往需要诱导用户点击一个恶意链接,才能攻击成功。
  • 存储型
    • 把用户输入的数据存储到服务器端
  • DOM型
    • 并非按照数据是否保存在服务器端来划分。DOM型从效果来说也是属于反射型XSS。

利用

  • 常见XSSpayload是发起cookie劫持,可以在set-Cookie时植入http-only,或者客户端与cookie绑定。
  • 构造post与get请求,知道文章id删除对应文章。
  • XSS钓鱼
  • 利用XSS识别用户浏览器版本与安装软件。
  • 借助第三方软件来获取用户真实ip,例如客户端安装了java环境,js可以通过调用api获取客户端本地ip地址。

注入攻击

注入攻击的本质是把用户输入的数据当做代码执行。这里有两个关键条件,

  • 第一个是用户能够控制输入。
  • 原本程序要执行的代码,拼接了用户输入的数据。

SQL注入

盲注:在服务器没有错误回显时完成的注入攻击。与回显注入相比少了调试的信息,因此需要找到一个方法验证注入的sql语句是否得到执行。

数据库攻击技巧

  1. sql注入可以猜解出数据库对应版本new.php?id=5 and substring(@@version,1,1)=4如果MySQL版本是4则会返回true。
  2. 利用union select分别确认标明和列名是否存在
  3. 在注入攻击中常常会用到读写文件的技巧,MySQL中可以通过LOAD_FILE()读取系统文件,并通过INTO DUMPFILE写入本地文件。写入文件常用于导出一个webshell
  4. Mysql(其他数据库中也有类似功能)中可以利用“用户自定义函数”的技巧——UDF(User-Defind Functions)来执行命令。在MS SQL Server中可以直接使用“xp_cmdshell"执行系统命令。Oracle中如果服务器有java环境,也可能造成命令执行。
  5. 攻击存储过程
  6. 基于字符集注入——宽字符注入
  7. SQL Column Truncation,MySQL中的strict关闭时,通过插入同名admin用户,可以修改管理员密码

防御

  1. 找到所有SQL漏洞
  2. 修补这些漏洞。

仅仅进行转义是不够的,可能会被绕过。

  • 使用预编译语句,绑定变量。
  • 使用存储过程,但需要注意存储过程中也可能存在注入,因此尽量避免使用动态SQL。
  • 输入过滤和编码
  • 检查输入数据的数据类型
  • 使用安全函数
  • 最后,从数据库自身角度来看,应该使用最小权限原则,避免Web应用直接使用root等高权限用户直接连接数据库,web应用使用的数据库账户不应有创建自定义函数,操作本地文件的权限。

其他注入攻击

除了SQL注入外,还有其他注入攻击,这些注入攻击都有共同的特点,就是应用违背了“数据与代码分离的原则”。

  • XML注入:XML是一直常用的标记语言,通过标签对数据进行结构化表示。
  • 代码注入:往往是由一些不安全的函数或方法引起的。在存在代码注入的地方与后门没什么区别。对抗代码注入需要禁用可以执行命令的函数,如果一定要使用,则需要对用户输入数据进行处理。此外在php/jsp中避免include远程文件,或者安全地处理它。开发规范应明确指出哪些函数是禁用的。
  • CRLF注入:凡是使用CRLF做分隔符的地方都有肯存在,比如“注入HTTP头”。
    • CR:Carriage Return,对应ASCII中转义字符\r,表示回车
    • LF:Linefeed,对应ASCII中转义字符\n,表示换行
    • CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行

文件上传漏洞

指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。

设计安全的文件上传功能

  1. 文件上传目录设置为不可执行
  2. 判断文件类型(推荐白名单)
  3. 使用随机数改写文件名和文件路径
  4. 单独设置文件服务器域名:由于同源策略,一系列客户端攻击将失效。

认证与会话管理

认证与授权

认证实际上就是一个验证凭证的过程。如果只有一个凭证被用于认证,则称为单因素认证,两个或多个凭证被用于认证则称为“双因素认证”或“多因素认证

认证的目的是为了认出用户是谁,而授权的目的是为了决定用户能够做什么。

密码相关

  • 一般来说密码必须以不可逆的加密算法,或者是单向散列函数算法,加密后存储在数据库中。这样做的目的是尽可能保证密码的私密性。
  • 目前黑客们广泛使用的一种破解MD5值。彩虹表的思路是收集尽可能多的密码明文和明文对应的MD5值,这样只需要查询MD5值,就能找到该MD5对应的明文。
  • 为了避免密码哈希值泄露后黑客能直接通过彩虹表查询出密码明文,在计算密码明文时增加一个“salt”(盐),它的作用是为了增加明文的复杂度,并使得彩虹表一类的攻击失效。

Session与认证

密码与证书等认证手段,一般仅仅用于登陆过程。登陆完成后用户访问网站的页面,不可能每次浏览器请求页面时都再使用密码认证一次。因此,当认证成功后,就需要替换一个对用户透明的凭证。这个凭证就是SessionID

当用户登陆完成后,,在服务器端会创建一个新的会话(Session),会话中保存用户的状态和相关信息。服务器端维护所有在线用户的Session,此时的认证,只需要知道是哪个用户在浏览当前的页面即可。为了告诉服务器应该使用哪一个Session,浏览器需要把当前用户持有的SessionID告知服务器。

最常见的做法就是把SessionID加密后保存在Cookie中,因为Cookie会随着请求头发送,且受到浏览器同源策略的保护。

Session Fixation攻击

假设A有辆车,卖给了B,但自己偷留了把钥匙,,而B也没有换锁。这个没有换锁导致的安全问题就是Session Fixation问题。

解决的做法是:在登陆完成后,重写SessionID。

Session保持攻击

一般来说Session是有生命周期的,当用户长时间未进行获得后,或者用户点击退出后,服务器将销毁Session,但如果攻击者能够一直持有一个Session(比如间隔性刷新页面,以告诉服务器这个用户仍然在活动)

常见的对抗方法是:在一定时间后,强制销毁Session。还可以选客户端发生变化时要求用户重新登陆,比如用户ip、UserAgent等信息发生了变化。

最后还需要考虑同一用户可以同时拥有几个有效Session。

单点登录(SSO)

单点登录英文全称是Single Sign On,简称SSO。它希望用户只登陆一次,就可以访问所有的系统。从用户体验来说它使用户的使用更加方便。从安全的角度来看,SSO把风险集中在单点上,这样做有利有弊。

优点:风险集中化,只需要保护好这一个点
缺点:因为风险集中了,所以单点一旦被攻破,影响范围涉及到所有使用单点登录的系统。降低这种 风险的办法是在一些敏感的系统里,再单独实现一些额外的认证机制。比如网上支付平台付款前要求用户再输入一次密码。

应用层拒绝服务攻击

DDOS又称拒绝服务攻击,利用合理的请求造成资源过载,导致服务不可用。

应用层DDOS

不同于网络层DDOS,由于TCP三次握手已经完成,连接已经建立,所以发起攻击的ip也都是真实的。

cc攻击

对于一些消耗资源较大的应用页面不断发起正常请求,以达到消耗服务端资源的目的。在WEB应用中,查询数据库、读写硬盘文件等操作,相对都会消耗比较多的资源。

应用层DDOS攻击是针对服务器性能的一种攻击,那么许多优化服务器性能的方法都或多或少地能环节此种攻击。比如将使用频率高的数据放在memcache中。

最常见的针对应用层DDOS攻击的防御措施是在应用中针对每个客户端做一个请求频率的限制

一般通过IP地址与cookie定位一个客户端。不过这种防御方法不玩吗。用户的ip地址可能会发生改变,而Cookie又可能会被清空,如果同时发生了变化,就无法定位同一个客户端了。

如何让ip地址发生变化?使用代理服务器是常见的做法。

攻击者使用的这些混淆信息的手段,我们该如何解决呢?一般从以下几个方面入手。

  1. 应用代码做好性能优化。
  2. 在网络架构上做好优化。
  3. 实现一些对抗手段,比如限制每个ip地址的请求频率。
资源耗尽攻击

Slowloris攻击,原理是以极低的速度往服务器发送HTTP请求。由于Web Server对于并发连接数有一定的上限,因此如果恶意占用不释放,从而无法接受新的请求,导致拒绝服务。

  • 此类拒绝服务攻击的本质,实际上是对有限资源的无限制滥用。
HTTP POST DOS

原理是在发送一个HTTP POST包时,制定一个非常大的Content-Length值,然后以很低的速度法宝,保持住这个连接不断开。成功攻击后会留下错误日志(Apache)。

由此可知这种攻击本质是针对Apache的MaxClients限制的。

解决此类问题,可以使用web应用防火墙,或者定制一个Web Server安全模块。

Server Limit DOS

Cookie造成的拒绝服务,写入超长的cookie

ReDOS

正则表达式写不好时,可能会被恶意输入利用,消耗大量资源,从而造成Dos。

互联网业务安全

安全是产品的一个特性。

好的安全方案

  • 良好的用户体验
  • 优秀的性能

如果我们的产品能够潜移默化地培养用户的安全习惯,将用户往更安全的行为上引导,那么这样的安全就是最理想的产品安全。

账号是如何被盗的

  • 网站登录过程中无https,密码在网络中被嗅探。
  • 用户电脑中了木马,密码被键盘记录软件获取。
  • 用户对钓鱼网站所迷惑,密码被钓鱼网站所获取。
  • 网站某登陆入口可以被暴力破解。
  • 网站密码取回流程存在逻辑漏洞。
  • 网站存在XSS等客户端脚本漏洞
  • 用户账户被间接窃取。
  • 网站存在SQL注入等服务器端漏洞,网站被黑客入侵导致用户账户信息泄露。
分析账户被盗原因
  • 首先客服是最重要的联系渠道。
  • 从日志中寻找证据。
  • 打入敌人内部,探听最新动态。

你可能感兴趣的:(笔记,安全)