白帽子讲web安全学习

Posted on By yuanfang

世界观安全

  1. 安全的本质是信任的问题;安全是一个持续的过程。
  2. 安全三要素:机密性(保护数据的内容不被泄露,加密是常见手段)、完整性(要求保证数据的内容是完整、没有被篡改的,常用的技术手段是数字签名)、可用性(要求保护资源是随需所得)
  3. 安全评估:资产等级划分、威胁分析、风险分析、确认解决方案
  4. Secure by Default: 白名单、黑名单思想 和 最小权限原则
  5. Defense in Depth(纵深防御): 要在各个不同层面、不同方面实施安全方案(木桶原理);同时要在正确的地方做正确的事情
  6. 数据和代码分离原则
  7. 不可预测性原则

客户端脚本安全

浏览器安全

  1. 同源策略:浏览器的同源策略,限制了来自不同源的“document”或脚本,对当前“document”读取或者设置某些属性。
  2. 需要注意的是,对于当前域名来说, 页面内存放的javascript文件的域并不重要,重要的是加载js页面所在的域是什么。
  3. 在浏览器中,script, img, iframe, link等标签都可以跨域加载资源,而不受同源策略的限制; 不同于XMLHttpRequest的是,通过src属性加载的资源,浏览器限制了js的权限,使其不能读、写返回的内容。
  4. coss跨域访问方案的安全信任标准:js无法控制该HTTP头。

跨站脚本攻击(cross site script)

  1. xss攻击,通常指黑客通过’HTML注入’篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种工具。
  2. 反射型xss: 反射型xss只是简单的把用户输入的数据’反射‘给浏览器,也就是说,黑客往往需要诱使用户’点击‘一个恶意链接,才能工具成功。
  3. 存储型xss: 会把用户输入的数据’存储‘在服务器端。比较常见的一个场景就是,黑客写下一篇包含恶意代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意的js代码。
  4. DOM Based XSS: 通过修改页面的DOM节点形成的xss。
    var str = "' onclick=alert(/xss/)  //"; // 用户输入
    document.getElementById('ceshi').innerHTML = "<a href='" + str + "' >testLink</a>";
    
  5. xss payload —cookie劫持攻击: 构造get(插入图片) 和 post请求(构造form表达或者是通过XMLHttpRequest)
  6. xss payload —xss钓鱼: 利用js在当前页面’画出‘一个伪造的登录框,当用户输入后,发至黑客服务器
  7. xss 构造技巧:
    1)利用字符编码
    2)绕过长度限制(location.hash的内容不会在HTTP包中发送)
    3)利用base标签: 劫持当前页面中所有使用相对路径的标签
    4)利用window.name: 无论是否同源,只要在同一个窗口,前一个网页设置了这个属性,后一个网页就可以读取它
    5)flash xss
  8. xss防御:
    1)HttpOnly –解决的是xss后的cookie劫持攻击
    2)输入检测 –白名单策略
    3)输出检测 –htmlEncode(要求至少转换一下字符: & -> &amp; < -> $lt; > -> &gt; " -> &quot; ' -> &#x27; / -> &#x2F; ) 与 javascriptEncode(要求使用’\‘对于特殊字符进行转义,同时要求输出的变量必须在引号内部)
    4) 正确地防御xss – 在Html标签 、属性中输出,采用htmlEncode,在script标签红或者事件中输出,使用javascriptEncode,在css中输出采用encodeCss()函数(除了字母、数字外的所有字符都被编码成十六进制形式的’\uHH‘),在地址中输出,先检查http头,再对变量进行URLEncode。
    5)处理富文本 –白名单策略
    6)防御DOM Based XSS –从js输出数据到html页面,所以需要注意,首先是js代码中的检查,其次是html中的代码检查,也就是说需要结合javascriptEncode和htmlEncode(上面的正确防御xss里面的结合)
     // xss函数
     function xss(str, type) {
         if (!str) {
             return str === 0 ? "0" : "";
         }
         switch (type) {
             case "none":
                 str = str + "";
                 break;
             case "html":
                 str =  str.replace(/['"<>\/\\\-\x00-\x09\x0b-\x0c\x1f\x80-\xff]/g, function (r) {
                         return "&#" + r.charCodeAt(0) + ";"
                     }).replace(/ /g, "&nbsp;").replace(/\r\n/g, "<br />").replace(/\n/g, "<br />").replace(/\r/g, "<br />");
                 break;
             case "htmlEp":
                 str =  str.replace(/['"<>\/\\\-\x00-\x1f\x80-\xff]/g, function (r) {
                     return "&#" + r.charCodeAt(0) + ";"
                 });
                 break;
             case "url":
                 str =  escape(str).replace(/\+/g, "%2B");
                 break;
             case "miniUrl":
                 return str.replace(/%/g, "%25");
                 break;
             case "script":
                 str = str.replace(/[\\"']/g, function (r) {
                     return "\\" + r;
                 }).replace(/%/g, "\\x25").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\x01/g, "\\x01");
                 break;
             case "reg":
                 str = str.replace(/[\\\^\$\*\+\?\{\}\.\(\)\[\]]/g, function (a) {
                     return "\\" + a;
                 });
                 break;
             default:
                 str = escape(str).replace(/[&'"<>\/\\\-\x00-\x09\x0b-\x0c\x1f\x80-\xff]/g, function (r) {
                     return "&#" + r.charCodeAt(0) + ";"
                 }).replace(/ /g, "&nbsp;").replace(/\r\n/g, "<br />").replace(/\n/g, "<br />").replace(/\r/g, "<br />");
                 break;
         }
         return str.replace(/&&&/g, '<br/>');
     }
    

跨站点请求伪造(cross site request forgery)

  1. 一个简单示例: 攻击者诱使用户访问一个页面,就以该用户身份在第三方站点里执行了一次操作,能成功的原因是因为浏览器成功发送了cookie的原因。
  2. 防御:
    1) 验证码(但由于用户体验考虑,只能是一种辅助手段)
    2)referer check(缺陷在于,服务器并非什么时候都能取得到referer,比如https跳转到http,出于安全考虑,浏览器不会发送referer)
    3)anti csrf token: csrf为什么能够攻击成功?其本质原因是重要操作的所有参数都是可以被攻击者猜测到的,所以可以增加一个随机的不可预测的token。注意csrf的token仅仅用于对抗csrf攻击,当网站还同时存在xss漏洞时,这个方案就会变得无效,因为攻击者完全可以请求页面后,读出页面内容或者cookie中的token值,构造合法请求。

点击劫持(clickJacking)

  1. 点击劫持是一种视觉上的欺骗手段,攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户再改网页上操作,此时用户在不知情的情况下点击透明的iframe页面。
  2. 图片覆盖攻击
  3. 拖拽劫持与数据窃取(拖拽不受同源策略限制??)
  4. 触屏劫持
  5. 防御 clickJacking:一般是通过禁用跨域的iframe来规范

HTML5安全

  1. 新标签的xss
  2. iframe的sandbox
  3. canvas的妙用(识别验证码)
  4. Access-Control-Allow-Origin
  5. postMessage

服务器端应用安全

  1. 注入攻击:两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。
  2. 文件上传漏洞: 防御 1)文件上传的目录设置为不可执行 2)判断文件类型 3)使用随机数改下文件名和文件路径 4)单独设置文件服务器的域名
  3. 认证与会话管理:1)多因素认证 2)sessionID凭证(最常用的做法是把sessionId加密后保存在cookie中,因为cookie会随着http请求头发送,且受到浏览器同源策略的保护) 3)session fixation –需要在登录完成后,重写sessionaId 4)session保持攻击 –需要设置一定时间强制销毁,重新要求登录。
  4. 访问控制:应当使用最小权限原则,并使用默认拒绝的策略,只对有需求的主体单独配置允许的策略
  5. 加密算法和随机数
  6. web框架安全
  7. 应用层拒绝服务攻击:其本质是对有限资源的无限制滥用所造成的。所以,解决这个问题的核心思路就是限制每个不可信任的资源使用者的配额(数据缓存cache,频率限制,负载分流)
  8. php安全
  9. Web Server配置安全:最小权限原则,应该以独立的低权限身份运行web进程。