软件编程的24宗罪总结

一、Web应用程序漏洞

(一)sql注入漏洞

   1、发生方式:字符串拼接查询sql,攻击者伪造数据操作查询数据库从而带来危险。存储过程也可能出现这个问题。

   2、查找模式:

        1)、接收用户输入

        2)、没有检查用户输入有效性

        3)、使用用户输入查询数据库

        4)、使用字符串拼接或字符串替换构造sql语句,或者使用类似于SQL exec方法执行sql查询。

3、测试技巧

    1)、使用sql保留字作为输入,如果得到了不正常的返回信息,则可能存在sql漏洞。

    2)、工具扫描

4、解决方案

    1)、校验所有输入

    2)、使用prepare语句(参数化查询,占位符或者绑定)构造sql语句

    3)、不允许访问表,只允许访问存储过程和视图

(二)、XSSXSRF和响应拆分(服务器端)

     1、类型分类

        1)、基于DOMXSS漏洞

        2)、反射型XSS漏洞:输入回显

        3)、持续XSS漏洞:恶意代码存储在应用程序中

        4)、HTTP响应拆分,RS漏洞:将恶意代码插入到http标题中

        5)、跨站点请求:

     2、查找模式

        1)、web应用程序从HTTP实体中获取输入

        2)、没对输入检查

        3)、HTML或者HTTP标题中数据回显给浏览器

     3、测试技巧

        1)、恶意构造数据看浏览器是否回显

     4XSS弥补措施

        1)、确保输入有效:正则校验

        2)、对输出编码

        3)、对于标题的输入,必须删除CRLF组合

     5XSRF弥补措施

        1)、给web客户端和服务器会话添加密钥值,这个值不包含在cookie

        2)、超时机制的设置

        3)、使用POST代替GET

(三)、客户端XSS漏洞

     1、类型分类

        1)、gadgetwidget

        2)、静态HTML页面

     2、测试技巧

        1)、随机XSS片段注入输入流  

3、弥补措施

    1)、不要相信输入

    2)、用安全结果代替不安全结构

(四)、Magic URL、可预计的cookie以及隐藏表单字段

1、类型分类

    1)、Magic URL:在utl中暴露id等信息且加密不好

    2)、可预计的cookie:比如cookie自动递增,有规律可循

    3)、隐藏的表单字段:view source是可以看到的,用户就可以创建恶意信息

2、查找模式

        1)、应用程序从cookieHTTP标题、表单或者URL中读取敏感信息

        2)、数据用于对安全、信任或者认证进行决策

        3)、数据是通过不安全或者不可信的通道进行传递的

3、 测试技巧

        1)、fiddler抓包

        2)、其它软件抓包

4、对于MagicURL以及隐藏表单的弥补措施

        1)、数据加密

        2)、信道加密

        3)、随机数(防预测)

        4)、MAC(消息验证码)对比,放置改数据

二、实现漏洞

(五)、缓冲区溢出

      1、分类

         1)、堆溢出

         2)、栈溢出

         3)、数组溢出(变体)

      2、查找漏洞模式

         1)、输入

         2)、向程序内部结构传递数据

         3)、不安全的字符串处理调用

         4)、使用算数运算计算空间分配大小或者剩余缓冲区大小

      3、测试技巧

         1)、Fuzz测试

         2)、在输入中查找长度为用户指定数值的内容,然后改变长度

      4、弥补措施

         1)、替换危险的字符串处理函数

         2)、审计分配操作

         3)、检查循环和数组访问

       4)、分析工具使用

       5)、其它

(六)、格式化字符串(c/c++常见)

      1、查找模式

        1)、应用程序接受了一个格式化的函数

      2、测试技巧

        1)、向应用程序床底格式化说明符,看是否返回16进制数值

      3、弥补措施

        1)、不要向格式化函数直接传递用户输入

(七)、整数溢出

      1、查找模式

1)、提供算数运算都可能出现

      2、测试技巧

        1)、加减导致数值符号变化的临界点

      3、弥补措施

        1)、尽可能使用无符号数

        2)、检查整数

        3)、明确的类型转换

        4)、使用安全类

(八)、命令注入:命令和数据放一起容易发生命令注入

       1、查找漏洞模式

         1)、命令和数据内连放在一起

         2)、数据有可能被当做命令来处理,通常某些字符具有特殊含义,比如分号和逗号

         3)、运行命令的进程在另一个系统上,或者通过命令获取的控制权限大于用户应该拥有的权限

       2、测试技巧

         1)、检查输入,确定它会传给哪种命令外壳,然后使用每种元字符检查是否有问题

         2)、程序构造包含元字符的输入依次检验

       3、弥补措施

         1)、检查数据是否合法

         2)、数据不合法采取适当的措施

         3)、使用最小权限运行应用程序

(九)、未能正确的处理错误

       1、错误类型

         1)、产生太多的信息:在告知用户的时候透露了系统信息

         2)、忽略了错误:产生了错误但是没有处理

         3)、曲解了错误:对于返回值没有正确理解,比如返回值含义搞错了

         4)、使用了无用的返回值

         5)、使用了无错误的返回值

       2、查找漏洞模式

          1)、代码审查

       3、测试技巧

          1)、代码审查

(十)、信息泄露

       1、分类

          1)、定时通道:通过测量操作运行的时间,获取系统的内部状态

          2)、存储通道:比如存储文件名、消息长度等

          3)、详细的版本信息:比如通过了解服务器信息更有针对性的攻击

          4)、主机网络信息:比如MAC、机器名、IP地址等信息

          5)、路径信息

          6)、栈布局信息

      2、查找漏洞模式

          1)、某个进程向来自OS或者运行时环境的用户输出结果

          2)、在敏感或者隐私数据上进行的操作未在固定时间内完成,时间取决于该机密数据自身的特性

          3)、意外使用敏感或隐私信息

          4)、敏感或者高权限数据未受保护或者保护机制很弱

          5)、敏感数据从一个进程向低权限用户发送

          6)、未受保护的敏感数据通过不安全的通道传送

      3、弥补措施

          1)、权限控制

          2)、数据保护

          3)、防护机制

(十一)、 竞态条件:资源竞争

       1、查找漏洞模式

          1)、多线程或者进程必须写入同一个资源

          2)、在公共区域建立文件或者目录

          3)、信号处理程序

          4)、多线程应用程序或者信号处理程序中的不可重入函数

       2、测试技巧

          1)、多处理器系统运行测试

          2)、向可疑程序密集发送信号

          3)、打开文件系统日志功能,检测系统调用,留意文件创建活动

       3、弥补措施

          1)、正确编写可重入代码

          2)、正确处理锁,对象处理,按照同样的顺序请求多个锁,按照与请求相反的顺序释放它们。

          3)、持有锁的时候做最少的事情,即注意锁的范围

          4)、不要假设系统调用能够按时完成

          5)、在用户私有存储区创建临时文件

(十二)、不良可用性

       1、查找漏洞模式

          1)、未能仔细研究典型用户与安全特性交互的方式导致的一系列问题

       2、测试技巧

          2)、二人对话技术观察用户使用系统时的情况

     3、弥补措施

         1)、简化UI以便用户参与

         2)、为用户做出安全决策

         3)、易于有选择地放宽安全策略

         4)、明确指出后果

         5)、提供可操作性

         6)、提供集中管理

(十三)、不易更新

      1、分类

         1)、有漏洞的附件软件安装

         2)、有漏洞的访问控制

         3)、有漏洞的提示疲劳:过多提示不太好

         4)、有漏洞的无知:该提示还是要提示

         5)、有漏洞的无通知更新:别自己就更新应用了

         6)、有漏洞的一次更新一个系统

         7)、有漏洞的强制重启动

         8)、有漏洞的难以打补丁:打补丁步骤要简单

         9)、有漏洞的缺乏恢复计划:

         10)、有漏洞的信任DNS:更新用的软件要放在可信任的服务器上

         11)、有漏洞的信任补丁服务器

         12)、有漏洞的更新签名

         13)、有漏洞的打开更新包

         14)、有漏洞的用户应用程序的更新

     2、查找漏洞

         1)、威胁模型

     3、测试技巧:见分类

     4、弥补措施

         1)、安转附带软件的弥补措施:把附带软件捆绑在补丁中

         2)、访问控制弥补措施:锁定文件,不允许写入,或者把权限改为检查签名之前,仅允许授权访问

         3)、提示疲劳弥补措施:尽可能少通知用户,让应用程序做正确的事

         4)、用户无知的弥补措施:存储最近的时间,启动程序时检查,看更新包是否在合理的时间内应用

         5)、无通知更新弥补措施:通知一下

         6)、一次更新一个系统的弥补措施:考虑关闭系统打补丁会更快,考虑分批次更新系统防止意外发生

         7)、强制重启动的弥补措施:系统运行期间打补丁或者使应用程序关闭

         8)、难以打补丁的弥补措施:做成可执行程序或者一系列连接好的脚本

         9)、缺乏恢复计划的弥补措施:做一个恢复计划

         10)、轻信DNS和轻信补丁服务器:给补丁签名

         11)、更新签名的弥补措施:MD5签名不可靠,采用SHA-1甚至SHA-2更好

         12)、打开更新包的弥补措施:把文件提取到一个只有授权用户可以访问的目录下

        

(十四)、执行代码权限过大

      1、查找漏洞模式

         1)、确定应用程序是否可以在非管理账号或非根账户下正确的运行

      2、测试技巧 

         1)、不断降低权限运行

      3、弥补措施

         1)、降低权限,以最小权限运行代码

(十五)、未能安全的存储数据

      1、查找漏洞模式

         1)、设定访问控制

         2)、为低权限用户授予写操作权限

         3)、在共享区写配置信息

      2、测试技巧

         1)、利用find命令查找全局可写文件和目录( find / -type d -perm +002

         2)、加密数据最好代码审查做

      3、弥补措施

         1)、正确处理权限问题

         2)、合理正确加密数据

(十六)、移动代码的漏洞

       移动代码:已经下载并且在用户计算机上执行的代码

      1、查找漏洞模式

         1)、代码运行任意形式的脚本

         2)、容器在执行移动代码前不提示用户

         3)、容器不限制移动代码的功能、许可或者权限

         4)、移动代码没有签名

         5)、移动代码执行任意形式的敏感货危险操作

      2、测试技巧

         1)、没有统一方法,最好代码审查

      3、弥补措施

         1)、windows沙箱

         2)、chroot限制

三、加密漏洞

(十七)、使用基于弱密码的系统

      1、查找漏洞模式

         1)、密码泄露

         2)、允许使用弱密码:复杂性要求

         3)、迭代密码:保存以前的密码历史,需要使用一个强密码验证器来检查,其次检查密码历史时,应该测试常见的迭代密码

         4)、从不改变密码:服务器端可以要求用户更改密码

         5)、默认密码:不安全

         6)、重放攻击:要保证传输通道安全,比如SSL

         7)、对密码验证器进行暴力攻击:检查密码验证器是否使用了优秀的键派生函数

         8)、存储密码而不是密码验证器

         9)、在线攻击:代码审查查找最快

         10)、返回遗忘的密码:这没有任何必要,重置最佳

     2、测试技巧

       1)、密码泄露:临时文件、崩溃存储

         2)、重放攻击:捕获验证数据流并发送相同的数据流进行登录;检查证书和服务器是否匹配

         3)、暴力攻击:性能测试 

     3、弥补措施

         1)、密码泄露的弥补:确保密码不存储在内存中;登录页面只能SSL/TLS访问

         2)、弱密码的弥补:确认密码的复杂性和长度要求;密码最好不包含用户名

         3)、迭代密码的弥补措施:检查密码中字符变体

         4)、密码改变弥补措施:定期要求用户更改密码

         5)、默认密码弥补措施:不使用默认密码

         6)、重放攻击弥补:验证封装在受保护通道中

         7)、密码验证器弥补:使用好的键派生函数

         8)、在线暴力破击弥补:不把用户名泄露给攻击者;锁定招呼;设置超时时间

         9)、登录信息泄露的密码措施:给不正确的用户名和不正确的密码返回不同的出错信息

         10)、忘记密码的弥补措施:允许重置

(十八)、弱随机数

      1、查找漏洞模式:当需要保护数据的机密性或者防范被人猜测的时候漏洞就会出现

      2、测试技巧: FIPS测试

      3、弥补措施 :保证真的能随机

(十九)、使用错误的密码技术

      1、漏洞分类介绍

         1)、使用自制的加密算法:

         2)、在高级协议可用时,从低级算法中创建一个协议:别太自信

         3)、使用脆弱的密码基元:DES加密无意义,MD4已被完全破解等

         4)、不正确的使用密码基元:比如流密码滥用,散列连续密码,加密已知的普通文本

         5)、使用错误的密码基元:加码不能保证数据不被篡改,可以使用编码,比如64进制

         6)、使用错误通信协议:

         7)、未使用salt

         8)、未使用随机IV

         9)、使用脆弱的秘钥派生函数

         10)、未提供完整性检查

         11)、不使用敏捷加密:敏捷加密解释起来就是前瞻性加密

      2、查找漏洞模式

         1)、代码审查

      3、测试技巧:

         1)、代码审查

      4、弥补措施

         1)、使用自制加密算法:删除相关代码

         2)、从低级算法中创建一个新的协议:使用已有能满足的现有算法

         3)、使用脆弱的密码基元、不正确的使用密码基元:使用更安全的加密措施

         4)、未使用salt的加密措施:加salt,保证加的salt是强随机容器生成并且长度足够

         5)、其它漏洞弥补参考漏洞类型

四、联网漏洞

(二十)、未能保护好的网络通信

      1、查找漏洞模式

         1)、应用程序使用网络

         2)、设计者轻视或者低估网络层的威胁

      2、测试技巧

         1)、捕获数据包分析:没有加密的消息,每条消息结尾都有固定长度的奇怪数据

         2)、对数据包做一些小改动,看程序能否识别出来

      3、弥补措施

         1)、使用安全的协议,比如SSL/TLS建立网络连接

         2)、创建本地代理来实施安全措施

(二十一)、未能正确的使用PKI,尤其是SSL

    1、查找漏洞描述

         1)、使用了PKI,例如SSL或者TLS

         2)、未使用HTTPS

         3)、库或者应用程序代码未能检查通信通道另一端的进程所使用的证书

      2、测试技巧

         1)、工具攻击,比如dsniffettercap

         2)、用不可信的CA签名,可以使用microsoft Certificate Manager

         3)、自签名的证书

         4)、证书不在有效期内(notBefore字段)

         5)、证书过期(notAfter字段)

         6)、主题名(subjectName)是伪造的

         7)、密钥使用不正确

         8)、失效的签名算法

      3、弥补措施

         使用PKI比较合理,但是要确保

         1)、证书连接了一个有效的根CA

         2)、证书处于有效期内

         3)、将主机名和至少一个DN字段或者X.509 v3 subjectAltName扩展中的对应子字段进行比较

         4)、证书密钥的使用时正确的:服务器认证或者客户端认证

         5)、证书未撤销

         6)、程序对于上述监测中出现的问题当做证书失效来处理,并禁止建立连接

(二十二)、轻信网络域名解析

        1、查找漏洞模式

          1)、连接已被认证的网络上扮演客户端或者服务器角色的任何应用程序

        2、测试技巧

          1)、搭建一个恶意客户端和一个可以服务器,同时实现这两个目标的好办法是创建一种代理客户端和服务器之间信息的方式。检查流动的信息是否使用base64编码或者ASN.1编码(两者都不安全)

          2)、如果客户端指向某个被攻击者控制的服务器,看会发生的情况。

          3)、如果服务器对客户端有些假定,而不是只对用户进行验证,那么要质疑应用程序的设计。

       3、弥补措施

          1)、确保连接都在SSL上运行并且所有代码进行适当的PKI检查

          2)、使用IPSec

          3)、使用Kerberos或者Windows进行了认证,且客户端和服务器都是最新版本

          4)、使用公共密钥密码系统,并双向签发数据

猜你喜欢

转载自blog.csdn.net/u012322855/article/details/79630517