为公司做的安全讲座PPT,结果没人喜欢听,大家都等着看秀魔术……

呃,但依然总结了就不想浪费,备份于此吧。

主要包含 黑客渗透课题,安全防护课题,基本安全方案 介绍。

黑客课题

软件质量管理

  • 功能性 (程序员)
  • 可靠性 (安全工程师)
  • 易用性 (UX, 产品)
  • 效率 (高阶程序员)
  • 可维护性 (程序BOSS)
  • 可移植性 (产品)

不同的职位的思考是不同的

黑客态度

  • 充满好奇心,亲自动手
  • 不相信权威,怀疑一切
  • 分享,信息全部免费
  • 不进行无聊乏味的工作
  • 崇尚自由
  • 技术能力决定一切

黑客技术点

  • 基本能力
    • 会编程
    • 知识面宽泛
    • 超强的学习力
    • 一定的英语水平
    • 耐心和毅力
  • 通用技术
    • 社会工程学
    • 密码学
    • 一定的网络编程知识
    • 基本的系统安全知识
  • 两大类方向
    • 网络攻防方向
      • 服务器配置/网络配置/数据库配置
      • 内网渗透
      • Web服务漏洞挖掘
      • 封包分析
    • 软件方面方向
      • 操作系统,驱动 – 病毒,木马,蠕虫
      • PE/ELF文件逆向 – 免杀,破解,脱壳,杀毒
      • 漏洞挖掘
      • 代码审计

黑客级别

  • 脚本小子
    • 会使用基本工具
  • 初级黑客
    • 能通过现成CVE制作自定义payload,批量扫描工具等
    • 了解基本漏洞原理
  • 漏洞达人/社工达人
    • 有自己的CVE或0days
    • 对常见问题有嗅觉本能
    • 顶半个侦探或者间谍用
  • 神出鬼没
    • ……不可描述

典型黑客渗透流程

  • 侦查(Nmap, Hping, Ettercap, WhoIs站)
  • 扫描/嗅探/指纹(Nmap, Nessus, SuperScan, Wireshark, Tcpdump, EtterCAP)
  • 发现漏洞(Metasploit, SQLmap, BurpSuits, Nexpose, OpenVAS, CVE站, ExploitDB站)
  • 投放攻击载荷获取访问权限(Metasploit, ShellCode, )
  • 内网跳板渗透 –中间人,ARP/DNS投毒,TCP劫持(EtterCAP, Shijack, Hunt)
  • 提权 – 字典/彩虹表攻击 (HotPotato, Hydra, RainbowCrack, LC4, Cain&Abel)
  • 维持权限 – 服务,注册表(MSFPersistence, osk, Narrator, gflags, Magnify)
  • 隐匿/清除痕迹 – 进程注入, 日志清除,VPN,肉鸡 (MSFMeterpreter, psInject)
  • 记录报告

其他手段和其他平台

  • 其他手段

    • 无线攻击
    • DDOS攻击
    • 电子邮件/IM攻击
    • 社工攻击
    • USB/Arduino等特种设备攻击
    • 驱动/BIOS/数字签名伪造
    • 硬件植入
  • 其他平台

    • VOIP
    • SCADA
    • 摄像头
    • 打印机

开发人员防范核心

  • 业务漏洞
  • SQL注入
    • 常规:字符过滤,类型格式检查,控制错误提示,DB账号权限管理
    • 根本方案:使用预编译语句参数绑定(PHP-mysqli),用ORM,PDO等预设框架
  • XSS跨站点脚本
    • Cookie设置HttpOnly,禁止JS访问;XSS filter;用户输入的编码转义
  • CRSF跨站请求伪造
    • 验证HTTP Referer; 增加自定义HTTP头属性;Token机制;验证码
  • 文件上传漏洞
    • 上传目录不可执行;文件处理和检查

Hacker’s Creed

  • You MUST try harder.
  • The quiter you become, the more you are able to hear.

安全课题

安全工程师职能分类

  • 应急安全响应工程师
    • 主要负责应急响应,和内部业务团队沟通处理安全事件
  • 安全整合团队
    • 将安全策略功能整合到产品中
  • 应用安全团队
    • 对内做渗透测试和代码安全审计
  • 安全平台工程师
    • 写安全相关工具和管理平台
  • 威胁渗透工程师
    • 研究Botnet, Malware, 挖0days, 做渗透攻击用

WEB安全工程师需求

  • 网站基础层级知识
    • 静态层:JS, HTML, CSS
    • 脚本层:PHP, ASPX, ASP, JSP
    • 数据层:MySQL, Oracle, SQLServer, MangoDB, PostgreSQL, Access
    • 服务层:Nginx, Apache, IIS, Tomcat, WebSphere, httpd
    • 系统层:Windows, Linux
  • 基本编程能力
    • Python, PHP, Java, C/C++, JS/NodeJS, Shell (Go, Ruby)
  • 常见工具使用
    • Nessus, Nmap, SQLMap, Metaspolit, AWVS, BurpSuite,W3af, Appscan, OpenVAS, WireSharkl, Nikto, Kismet等
  • 常见端口通信协议
    • 物理层:Bit 。确定媒介传输比特,确定机械和电气规范
      • RJ45、CLOCK、IEEE802.3    (中继器,集线器,网关)
    • 数据链路层:Frame。将比特组装成帧,做点到点的传递
      • PPP、FR、HDLC、VLAN、MAC  (网桥,交换机)
    • 网络层:Packet。负责将数据包从源到目标的传递,以及互连网络连通。
      • IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
    • 传输层:Segment。负责端到端的可靠报文传递和错误恢复。
      • TCP、UDP、SPX
    • 会话层:SPDU。会话协议数据单元。建立,管理和终止会话
      • NFS、SQL、NETBIOS、RPC
    • 表示层:PPDU。协议数据单元。对数据进行翻译加密和压缩
      • JPEG、MPEG、ASII
    • 应用层:APDU。应用协议数据单元。
      • FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
  • 常见安全圈动态
  • 熟悉Windows/Kali Linux
  • 了解服务器环境配置,IIS, LAMP,DB配置等
  • 了解主流网络和安全设备部署
  • 熟悉主流Web安全技术,包括SQL注入, XSS, CSRF, 文件上传绕过,任意代码执行, 文件漏洞包含,一句话木马等

安全工程师工作内容 – IT运维篇

  • 内外网安全部署,维护
  • 用户账号和权限管理,信任域隔离
  • 数据和权限管理,加密,隔离和容灾
  • IT系统的缺陷补丁和攻击测试
  • 接入管理,鉴权,VPN部署
  • E-mail防护和过滤,防钓鱼
  • 代理访问权限设置和异常记录分析
  • 专职渗透测试
  • 安全宣传和答疑

安全工程师工作内容 – 开发团队篇

  • 安全架构
  • 安全威胁和风险分析
  • 安全设计和安全组件的使用
  • 加密协议,算法,数据库安全检查
  • 安全日志和告警设计
  • 权限,资源,操作的设计
  • 防注入设计
  • 防协议攻击设计
  • 防DDOS、DOS设计
  • 防破解和防木马
  • 可信计算和沙箱
  • 指纹混淆

安全工程师工作内容 – 安全测试篇

  • 安全架构分析,威胁和风险测试
  • 安全组件和开源组件的缺陷分析和测试
  • 各种协议缺陷分析,各种系统调用和I/O缺陷分析
  • 各种攻击测试和渗透测试
  • 时刻关注安全缺陷库
  • 源码的白盒审计
  • 测试工具和用例构建

开发安全防范处理

  • 针对公司当前业务情况和技术方向制定敏感信息业务安全标准和编码规范
  • 持续性安全讲座,加强安全意识,普及攻防技巧
  • 建立自动化的静态代码安全扫描分析机制
  • 进行安全方面的单元测试
  • 定期进行代码安全审计
  • 积极参与业务方案的安全评审
  • 配合开发人员建立请求数据分析系统,响应数据分析系统,日志告警系统
  • 定期进行内部渗透测试
  • 设置蜜罐,保护正常业务并追踪黑客侵入
  • 建立应急安全响应中心,配合产品及时处理安全问题

开发安全库课题

PHP安全库

  • 十分强烈推荐
    • Firewall 保护Laravel应用免受攻击的库 (https://github.com/akaunting/firewall)
      • 支持XSS防范
      • 支持SQL注入防范
      • 支持RFI(远程文件攻击)防范
      • 支持LFI(本地文件攻击)防范
      • 支持UA注入防范
      • 支持多重攻击防范
      • 支持session防刷
      • 支持黑/白名单访问
  • 很推荐
    • PHPIDS (PHP-Instrusion Detection System 侵入检测系统,它不负责过滤,仅负责检查识别危险行为并进行评级报告,并记录攻击流程以便分析)
    • SecureHeaders(https://github.com/aidantwoods/SecureHeaders 提供自动安全标头)
  • 可以考虑
    • HTML Purifier (HTML过滤器,可以解除XSS威胁,去除危险HTML特性)
    • XMLSecLibs (用来处理XML加密和签名库)
    • SensioLabs Security Check(命令行工具,用来检查PHP程序是否有已知安全漏洞)
    • OWASP Zed Attack Proxy Project(免费WEB应用程序漏洞检测工具)
  • 根据需求自行决定
    • PHPSecLib (兼容性很高的加密解密库)
    • PHP-Password Lib (加密库,包含多种HASH方案)
    • TCrypto (基于K-Value的加密存储库)
  • 防御参考

JAVA安全库

  • 十分强烈推荐
    • Spring Security安全服务框架 (https://github.com/spring-projects/spring-security)
      • 提供OAuth2.0用户认证授权控制
      • 支持基于OpenID的验证,X509认证
      • 端口安全重定向
      • CORS支持,CSRF支持
      • 支持通道安全性检查
      • 大量的过滤器:包括资源请求过滤器,AOP方法调用过滤等
      • 错误请求拦截,防XSS跨站请求,安全HTTP响应header
      • 支持和SpringBoot配合使用
      • 支持放刷机制的 RequestLimitIntercept 的请求次数检查拦截器
  • 根据需求自行决定
    • Apache Santuario (XML安全检查以及加密语法处理)
    • Apache Shiro (一个java安全框架,主要做身份验证,授权,加密和回话管理)

RASP机制

RASP概述

  • 定义
    • RASP (Runtime Application self-protection)是 运行时程序自我保护
  • 特点
    • 它的方式是将自身,注入到应用程序中,实时监测并阻断攻击,使程序有自我保护能力,无需程序做编码修改,只要做配置即可
    • 运行在程序内部
    • 关注函数参数和返回这种底层
    • 监测点在程序的 I/O输入输出位置
      • 输入位置包括:用户请求,文件输入
      • 输出位置包括:数据库输出,网络输出,文件系统输出
  • 功能
    • 安全防护
    • 可进行远程补丁修补
    • 可进行应用监控:如性能检测,日志采集

RASP和WAF比较

原理

RASP:主要进行函数级的检测,是根据行为的检测。注入到JAVA虚拟机/PHP的Zend内核,通过HOOK修改.class字节码和PHP的zend引擎指向C/C++的函数指针opcode,可以对代码进行污染分析,对关键点做检查

WAF:主要进行流量消息的检测,是根据规则的检测。额外一个应用程序做网络消息的正则筛查和消息转发。

部署

RASP:

  • 【部署】每个服务器内单个部署,比较麻烦
  • 【部署】版本更新有弊病,难度高
  • 【部署】开发语言强相关性,仅支持JAVA,PHP,C#
  • 【性能】只做关键点检测,不处理全部请求
  • 【性能】延迟增加10%,CPU消耗增加3%
  • 【功能】不受协议限制(HTTP/S, AJAX, SQL, SOAP)
  • 【功能】关注函数级,可追踪整个攻击路径和攻击信息
  • 【功能】可检测XSS,命令注入,Shell输入,未经处理的异常,标头异常,不受支持的方法调用,漏洞扫描,方法调用失败,敏感数据泄露
  • 【功能】只有成功到底层危险的行为才会报警
  • 【开发】代码侵入性强,底层知识较多,对开发有很高的额外要求

WAF:

  • 【部署】外部入口统一部署,省事
  • 【部署】版本更新相对容易
  • 【部署】开发语言无关
  • 【性能】正则匹配规则越多,性能越低
  • 【性能】报文多一次socket转发,延迟很大
  • 【功能】仅可处理能解析的协议
  • 【功能】无法提供详细信息
  • 【功能】包含大部分检测。但不检测未经处理的异常,不检测方法调用失败,不检测敏感数据泄露
  • 【功能】在外层入口的特征匹配就会误警
  • 【开发】简单的匹配规则,只需多次测试完善即可

RASP优缺点

优点:

  • 能定点防御,所以误报和漏报比WAF少
  • 维护成本较低,无需频繁的测试更新策略
  • 覆盖面更多(包括多种消息协议,无视编码和加密)
  • 能深入代码和上下文,可做更全面的防护(包括未处理的异常,会话劫持,权限提升和敏感数据泄露)
  • 更快速的漏洞响应(包括给服务器打补丁)

缺点:

  • 不同语言的RASP解决方案不同,技术栈复杂的时候使用不便
  • 前期开发代价大,技术要求较高
  • 使用时侵入性过大,对服务器CPU性能有影响
  • 部署难度较高
  • RASP规则的自更新困难
  • RASP自身代码漏洞无法防范

一句话总结

  • RASP更底层,安全性更好,但开发和部署代价很大。
  • WAF更简单易用, 但防护性差。

JAVA RASP

概述
  • 方式
    • JVM重构:植入JVM内部,需要对JVM很熟悉,难度很大
    • Java Instrument:最常见的方式
  • JAVA程序执行流程
    .java源文件 -> Java编译器 -> .class字节码 -> (JVMTI修改字节码) -> JVM
  • Java Instrument实现原理
    • 即是利用JVM的一个原生编程接口叫JVMTI(JVM Tool interface)。
    • 它支持用于Debug, Profiler, Monitoring监听, Thread Analysis线程分析, Coverage Analysis覆盖率分析接口
    • 不同的JVM实现不同,但Sun和IBM的常见JVM中有统一标准的JVMTI实现
    • JVMTI是一套本地代码接口,使用JVMTI需要我们和C/C++以及JNI打交道
    • 通常开发时会建立一个Agent来使用JVMTI的函数并设置回调,然后JVMTI会在字节码中插入自己的调试代码,我们即可获得当前运行态的信息
    • JVMTI是基于事件驱动的,即JVM每执行到一定的逻辑就会调用JVMTI的一些回调接口
    • 我们通过JVMTI的事件回调扩展自己的业务逻辑,这些自己开发的检查代码,就是RASP开发
细节
  • Agent的启动方式
    • 一种是在Java虚拟机启动时加载的。JVM启动时,会加载Agent的包/动态库。并执行其中的Agent_onLoad()函数
      • 这样的缺点是,每次更新RASP业务扩展检查时,需要重启服务
    • 一种是在Java虚拟机执行过程中执行Agent_OnAttach()进行加载部署的。
      • 这样的缺点是:每次更新RASP业务扩展检查时,会产生重复HOOK代码添加问题。(JVM本身即止不允许动态添删代理)
  • Agent实际作用
    • 当Agent被加载成功后,JVMTI就可以保证JVM在加载Java类的时候,可以调用Agent的Transformer函数,我们即可对这个Java类以及其中的函数进行修改以达到进行监视的效果
  • 常用的开发Java Agent的框架有:
    • Javassist ( Java编写,比较简单,推荐)
    • ASM (Java编写,但需要了解JNI和一定C/C++,性能高,功能丰富)
总结

RASP本质其实就是:不直接修改源代码,但使用JVMTI修改.class文件,以达到实现修改源代码的效果。

例如,想实现将下面代码

    public class C{
        public void fun()throws exception{
            Thread.sleep(10);
        }
    }

自动通过RASP生成下面的字节码(即,在函数前后嵌入预处理和后处理功能)

    public class C{
        public static long timer;
        public void fun()throws exception{
            timer -= System.currentTimeMills();
            Thread.sleep(10);
            timer += System.currentTimeMills();
        }
    }

则需要编写如下的RASP代码

    // 获取类数据
    public static void main(String[] args){
        try{
            ClassReader cr = new ClassReader("com/asm/C")
            ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
            ClassAdapter ca = new ClassAdapter(cw);
            cr.accept(ca, ClassReader.SKIP_DEBUG);
        }
    }
    
    // 添加timer变量到init函数中
    public class AddTimeClassAdpter extends ClassAdapter{
        @Override
        public MethodVisitor visitMethod(){
            MethodVisitor mv = cv.visitMethod( methodName );
            if(!name.equals("<init>") && mv != null){
                // 为非init函数添加 前后处理功能,即 计时功能
                mv = new AddTimeMethodAdapter(mv);
            }
            return mv;
        }
        
        @Override
        public void visitEnd(){
            // 添加timer字段
            FieldVisitor fv = cv.visitEnd("timer", "J", null);
            if(fv != null)
                fv.visitEnd();
        }
    }
    
    // 函数前后添加预处理和后处理代码
    public class AddTimeMethodAdapter extends MethodAdapter{
        @Override
        public void visitCode(){
            mv.visitCode();
            // 典型的类JNI调用方式,在进入函数前 添加前处理的计时代码
            mv.visitFieldInsn(Opcodes.GETSTATIC, owner, "timer", "J");
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "currentTimeMills", "()J");
            mv.visitInsn(Opcodes.LSUB);
            mv.visitFieldInsn(Opcodes.PUTSTATIC, owner, "timer", "J");
        }
    }

PHP RASP

  • 原理
    • PHP RASP和JAVA RASP类似。
      • JAVA是底层使用JVM,在JVM解析.class时,Agent做手脚修改.class文件
      • PHP则是在底层Zend引擎(Zend引擎负责编译和执行PHP代码,生成抽象语法树,编译成Zend字节码)做手脚。(因为Zend字节码中,全部PHP的函数调用都一定是由 ZEND_DO_FCALL, ZEND_DO_ICALL, ZEND_DO_FCALL_BY_NAME 三个指令码之一进行的。)只要对这三个指令码进行HOOK,我们就实现了和JAVA RASP一样的效果。
  • 过程
    • 在Apache启动时,也就是PHP代码模块初始化(MINIT)阶段,替换全局的function table中的特定函数指针,为其增加前置和后置处理(去看看Java RASP的那个例子)
    • 然后类似Java那样,对指定类指定函数,覆盖增加前置和后置检查处理代码即可。

Open RASP

概述
  • OpenRASP是百度开源的RASP库
    • 它当前支持JAVA,PHP
      • 其中JAVA RASP探针实现即我们前文提到的Java Instrumentation方式,使用的是ASM库
      • 其中PHP RASP探针实现
    • 支持JS来编写检测防护逻辑规则插件,内置V8引擎进行JS解析执行
      • 这样的话,可以跨语言编写检测逻辑,大大提高了RASP的复用度
    • 它抽象了各种HOOK类,方便使用
    • 它提供了默认官方插件,可支持大部分攻击类型的检查,进一步方便使用
    • 它提供管理后台,支持ES+Kibana日志收集和展示,支持邮件告警
    • 部署支持
      • JAVA方向:Tomcat 5~9, SprintBoot 1~2, Oracle JDK 6~11, Open JDK 6~11, MySQL 5.1~6.0 JDBC, Oracle 9.0~12.2 JDBC
      • PHP方向:PHP5.3~5.6 和 7.0~7.3, PDO, MySQL, MySQLi
默认插件防护状况
    常见漏洞分类      攻击类型        危害性 是否防护
    注入攻击            SQL注入       高   有
                    命令注入        高   有
                    LDAP注入      高   无
                    NOSQL注入 高   无
                    XPATH注入 高   无
                    慢查询     低   无
    敏感数据泄露      敏感文件下载  高   有
                    任意文件读取  高   有
                    数据库慢查询  高   有
                    文件目录查询  低   有
                    NTLM脱库  高   有
    无效的访问控制 任意文件上传  高   有
                    CSRF    中   无
                    CRLF    低   无
                    SSRF    高   有
                    文件许可异常  高   有
    安全配置错误      打印敏感信息  中   无
                    执行StrutsOGNL代码  高   有
                    执行远程命令  高   有
    跨站脚本XSS     反射型XSS  低   有
                    存储型XSS  高   无
    不安全的反序列化    fastJson,Transformer,xStream等   高   有
                    用户输入反序列化    高   有
    使用有漏洞的组件    组件弱点识别  低   无
    日志监控记录不足    WebShell攻击  高   有
    扫描探测行为      SQLMap, WVS 中   有,额外插件
    无效的身份认证 Cookie篡改    低   无
                    后台爆破    中   无
    XML外部实体漏洞   XXE 中   有

RASP 总结

  • RASP的使用对开发和运维均有较高要求,需要投入一定人力。
  • OpenRASP框架已经比较完善,强烈推荐使用。
  • RASP和WAF的功能侧重不一,建议使用RASP和WAF联合防护,可使安全效果更佳明显。