白帽子讲web安全

阿里巴巴高级安全专家吴翰清(道哥)写的入门书

第一章

  • 安全三要素
    • 机密性、完整性、可用性

第二章 浏览器安全

  • 限制了来自不同源的document或者脚本对当前document读取或者设置某些属性
  • 恶意网址拦截主要靠黑名单

第三章 跨站脚本攻击(XSS)

  • 全称是cross site script,为了和css区分开
  • 根据效果不同可以分为三类

    • 反射型XSS
      把用户输入数据反射到浏览器,比如输入文本中有如下内容

      1
      "<script>alert()</script>

      这样的内容到达浏览器后脚本就会被执行

    • 存储型XSS
      输入数据存储在服务器端,效果持久,比如一篇博客,博客内容中有攻击脚本,那每个访问这篇博客的用户都将被攻击
    • DOM Based XSS
      通过修改页面DOM来实现执行攻击脚本
  • 常见的攻击有劫持cookie
  • 防御方法主要有:
    • 对输出到html中的变量进行htmlEncode,就是对特殊符号比如‘<、&、>’等进行转义。
    • JavaScript代码则进行JavaScriptEncode,变量包括在引号内,防御哪些攻击代码被直接执行。

第四章 跨站请求伪造

  • 浏览器的session cookie在浏览器生命周期内都是有效的,所以新开一个页面,也是可以发送cookie的。所以常见的攻击模式就是伪造一个页面,诱使用户在点开想要攻击的页面后再点击该页面,该页面中伪造一个攻击请求,因为还在同一个浏览器进程中,所以session cookie会被发送,如果被攻击站点的cookie是被用来认证的话,那攻击就成功了。但是目前主流浏览器会拦截第三方cookie,即那些会保持在本地的cookie。
  • 防御手段主要有:
    • 验证码。这样伪造的请求就不能自动发送了,必须通过交互的方式填验证码才能发送
    • Referer check。因为页面和页面之间的跳转是有一定的逻辑关系的,所以每次处理请求时检测Referer可以过滤掉很多异常请求。但是由于隐私或者其他情况,很多时候没法取得Referer,所以这个方法可用性不是很强。
    • Token。攻击之所以可以成功,是因为攻击者很容易从URL中猜测出如何去构造一个请求。如果我把请求参数进行加密,那攻击者就没法准确的构造出正确的请求了,就没法攻击了。常用的做法是把token当作一个字段或者放在请求头中一起发送,因为攻击则没法构造出准确的token值,就没法发起有效的攻击了。token要注意保密性和随机性。

第五章 点击劫持

这是一种视觉欺骗,攻击者使用个透明的、不可见的iframe覆盖在网页上,然后诱使用户在网页上进行点击操作,从而从而在用户不知情的情况下触发iframe上的一些操作。通过调整iframe的位置,可以让iframe上的某些按钮或者链接覆盖在用户会点击的位置,从而实现攻击。

第六章 HTML5安全

  • 由于HTML5有很多新标签,以前的防护规则可能会没有考虑到这些新标签,所以有可能会发生新的xss攻击
  • canvas可以绘制图片,通过这一功能,可以在canvas上通过算法自动破解验证码
  • 跨域Access-Control-Allow-Origin:*存在危险
  • 本地存储将给攻击者带来便利,实现跨越页面攻击
  • postMessage可以实现页面间通信,也给攻击者带来便利

第七章 注入攻击

注入攻击的本质是把用户输入的数据当作代码来执行,违背“数据和代码相隔离原则”。这种攻击必须满足连个条件
1:用户能够控制输入。2:原本程序要执行的代码拼接了用户输入的数据。

  • SQL注入
    就是针对一些查询请求,构造恶意数据,比如添加一个引号,结束原来的sql查询语句,并在后面添加攻击查询语句
    • 预防这种简单的SQL注入就是使用预编译语句,避免直接拼接用户输入为sql语句。
    • 进行数据过滤,比如检查数据类型
    • 最小权限原则,避免web应用直接使用root,dbowner等高权限账户直接连接数据库
  • CRLF注入
    由于CRLF常用作不同语义之间的分隔符,因此注入CRLF字符,就会改变原有的语义,比如日志注入,HTTP头注入

第八章 文件上传漏洞

  • 常见的安全问题:
    • 上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。
    • 上传文件是钓鱼图片或者包含了脚本的图片,在某些低版本的浏览器会被作为脚本执行。
  • 预防:
    • 文件上传的目录设置为不可执行
    • 判断文件类型,使用白名单的方式
    • 使用随机的方式改写文件名和路径
    • 文件服务器在不同的域名,由于同源策略,使得很多xss攻击失效

第九章 认证与会话管理

  • session在服务端要设置过期时间,到期强制销毁,防止被攻击者获取了之后就永久有效了。
  • 单点登录,讲风险点集中于一点

第十章 访问控制

  • OAuth是用来解决跨应用授权的问题,比如微博登录等等授权问题。无需提供用户名和密码。

第十一章 加密算法与随机数

  • 不使用ECB模式
  • 不使用流密码
  • 使用HMAC-SHA1代替MD5
  • salts和IV要随机产生
  • 不要自己实现加密算法,尽量使用安全专家已经实现好的库

第十二章 Web框架安全

  1. 框架是处于基础和底层的位置,所以在这个地方处理安全问题有很大的便利性,可以避免在业务代码中去重复处理很多问题,在业务代码中处理效率低并且可靠性低。
  2. MVC框架安全,现在流行MVC架构,所以可以在框架层面解决很多安全问题。用户提交的数据都会经过View层,所以可以在View层统一处理很多安全问题,View层一般都会有模板引擎,可以在这个地方解决XSS攻击。在Model层就可以解决SQL注入等问题。
  3. 框架自身的代码也需注意安全问题。

第十三章 应用层拒绝服务攻击

  1. DDOS攻击又称分布式拒绝服务,利用合理请求造成服务过载,导致服务不可用。
  2. CC攻击,指的是通过对一些消耗资源较大的页面不断发起请求,造成服务器资源耗尽。因为这是一种消耗资源的攻击,所以防御方法就是优化应用,减少资源的消耗。防御方法主要有对使用很频繁的资源放到memcache中,命中了memcache后消耗服务器资源就很很少了、上CDN分流、对每一个客户端做访问频次限制。
  3. 验证码防御,但是目前自动识别验证码的技术已经非常成熟了,所以防御效果并不好。
  4. 资源耗尽攻击:发送畸形的HTTP请求,造成服务器以为请求还没结束,故一直占用资源。
  5. 正则表达式写的不好,也会造成正则表达式引擎资源耗尽,造成服务器性能下降,服务不可用。
  6. 总之就是得清洗流量,准确识别出攻击对象,拒绝攻击对象的访问。

第十四章 PHP安全

  1. 文件包含漏洞,php的include函数不会在意被包含的文件是什么类型,都将作为php代码执行,所以如果文件路径是动态变量的方式传入的,那就很容易被攻击,或者被攻击者读取到敏感文件从而获取敏感信息。
  2. 变量覆盖,php4.2.0之前版本,默认变量可以来自不同地方,比如页面表达和cookie,就非常容易被攻击者覆盖原来程序内的全局变量,实现攻击。
  3. 建议配置
    1
    2
    3
    4
    5
    6
    register_globals = off;
    open_basedir = /home/web/html/ 限定只能操作指定目录下的文件
    allow_url_include = off
    display_errors = off
    log_errors = off
    session.cookie_httponly = 1

第十五章 Web Server 配置安全

  1. Apache安全。最小权限原则,尽可能减少不必要的Module,对于要使用的Module,要检查其对应版本是否存在已知的安全漏洞。为Apache单独创建一个用户来运行,不能用root/admin身份。保护好log。
  2. 及时更新补丁
  3. Tomcat 删掉后台,防止密码被盗取从而控制了整个server

第十六章 互联网业务安全

  1. 注重业务逻辑安全,不能在业务逻辑上发生安全问题
  2. 优秀的安全方案,必须还要有良好的用户体验和优良的性能
  3. 及时拦截、清除产品运行中产生的各种垃圾信息、账号等隐患

第十七章 安全开发流程

  1. 开发要进行安全培训、开发前确认安全要求、开发中的质量/bug控制、安全和隐私风险评估、设计时就要考虑安全和隐私问题、减少攻击面、威胁建模、使用指定的安全工具、启用不安全的函数、静态动态分析、事件响应机制、最终安全评估、发布存档
  2. 使用相应工具进行代码安全审计和安全测试

第十八章 安全运营

  1. 建立漏洞修补流程、安全监控、入侵检测、紧急响应流程

总结

5月11号到8月4号,历时85天终于把这本书看完了,收获不少。