想了解更多格式串漏洞的原理和利用,可以参考warning3在很早之前写的文档: *printf()格式化串安全漏洞分
析 http://www.nsfocus.net/index.php?act=magazine&do=view&mid=533 http://www.nsfocus.net/index.php?act=magazine&do=view&mid=534
2.3.1.5 越界内存访问
程序盲目信任来自通信对方传递的数据,并以此作为内存访问的索引,畸形的数值导致越界的内存访问,造成内存破坏或信息泄露。 实例:
- OpenSSL TLS心跳扩展协议包远程信息泄露漏洞 (CVE-2014-0160)
漏洞是由于进程不加检查地使用通信对端提供的数据区长度值,按指定的长度读取内存返回,导致越界访问到大块的预期以外的内存数据并返回,泄露包括用户名、口令、SessionID甚至是私钥等在内的敏感信息。
漏洞概念及分类\
style=\
2.3.1.6 释放后重用
这是目前最主流最具威胁的客户端(特别是浏览器)漏洞类型,大多数被发现的利用0day漏洞进行的水坑攻击也几乎都是这种类型,每个月各大浏览器厂商都在修复大量的此类漏洞。技术上说,此类漏洞大多来源于对象的引用计数操作不平衡,导致对象被非预期地释放后重用,进程在后续操作那些已经被污染的对象时执行攻击者的指令。与上述几类内存破坏类漏洞的不同之处在于,此类漏洞的触发基于对象的操作异常,而非基于数据的畸形异常(通常是不是符合协议要求的超长或畸形字段值),一般基于协议合规性的异常检测不再能起作用,检测上构成极大的挑战。 实例:
- Microsoft IE非法事件操作内存破坏漏洞(CVE-2010-0249)
著名的Aurora攻击,涉嫌入侵包括Google在内的许多大互联网公司的行动,就使用了这个CVE-2010-0249这个典型的释放后重用漏洞。
2.3.1.7 二次释放
一般来源于代码中涉及内存使用和释放的操作逻辑,导致同一个堆缓冲区可以被反复地释放,最终导致的后果与操作系统堆管理的实现方式相关,很可能实现执行任意指令。
实例:
- CVS远程非法目录请求导致堆破坏漏洞( CVE-2003-0015)
2.3.2 逻辑错误类
涉及安全检查的实现逻辑上存在的问题,导致设计的安全机制被绕过。 实例:
- Real VNC 4.1.1验证绕过漏洞( CVE-2006-2369 )
漏洞允许客户端指定服务端并不声明支持的验证类型,服务端的验证交互代码存在逻辑问题。
- Android应用内购买验证绕过漏洞
Google Play的应用内购买机制的实现上存在的漏洞,在用户在Android应用内购买某些数字资产时会从Play 市场获取是否已经付费的验证数据,对这块数据的解析验证的代码存在逻辑问题,导致攻击者可以绕过验证不用真的付费就能买到东西。验证相关的代码如下:
代码会先检查回来的数据签名是否为空,不空的话检查签名是否正确,如果不对返回失败。问题在于如果签名是空的话并没有对应的else逻辑分支来处理,会直接执行最下面的return true操作,导致的结果是只要返回的消息中签名为空就会返回验证通过。
2.3.3 输入验证类
漏洞来源都是由于对来自用户输入没有做充分的检查过滤就用于后续操作,绝大部分的CGI漏洞属于此类。所能导致的后果,经常看到且威胁较大的有以下几类:
- SQL注入
- 跨站脚本执行
- 远程或本地文件包含
- 命令注入
- 目录遍历
2.3.3.1 SQL注入
Web应用对来自用户的输入数据未做充分检查过滤,就用于构造访问后台数据库的SQL命令,导致执行非预期的SQL操作,最终导致数据泄露或数据库破坏。 实例:
- 一个网站Web应用的数值参数的SQL注入漏洞。