《移动智能终端安全》课件第12章.pptx

上传人(卖家):momomo 文档编号:7608381 上传时间:2024-04-17 格式:PPTX 页数:60 大小:1.92MB
下载 相关 举报
《移动智能终端安全》课件第12章.pptx_第1页
第1页 / 共60页
《移动智能终端安全》课件第12章.pptx_第2页
第2页 / 共60页
《移动智能终端安全》课件第12章.pptx_第3页
第3页 / 共60页
《移动智能终端安全》课件第12章.pptx_第4页
第4页 / 共60页
《移动智能终端安全》课件第12章.pptx_第5页
第5页 / 共60页
点击查看更多>>
资源描述

1、第12章 SQLite数据泄露12.1 基基 础础 知知 识识12.1.1 SQLite的基础知识的基础知识SQLite是一个用小型C库实现的关系型嵌入式数据库管理系统,是目前嵌入式系统上最广泛部署的SQL数据库引擎。由于SQLite是一个嵌入式数据库引擎,没有分离的服务处理过程,因此可以直接读写磁盘文件。第12章 SQLite数据泄露SQLite是一个压缩库。该库有250KB左右,实际大小要考虑到编译器编译时的一些选项设置。如果将可选项全部忽略,则库的大小可被减小为180KB。SQLite在内存非常受限的设备(如无线设备、PDA、MP3)中是一个非常流行的数据库引擎,可以运行在小的栈空间上(

2、4KB),也可以运行在小的堆空间上(100KB)。SQLite在内存空间占用上和运行速度上比较折中,运行速度高于内存使用量大的数据库,在较低内存的环境中的性能比较好。第12章 SQLite数据泄露SQLite的开发者继续扩展功能,同时在保持与前期版本的语法、文件格式完全兼容的情况下提高可靠性和性能,并且源码对每一个人绝对公开。SQLite的体系结构主要包括接口、编译器、虚拟机、B-tree、页面高速缓存、OS Interface等,这些内容在前面章节已述,在此不做描述。第12章 SQLite数据泄露SQLite实现了完备的、零配置的SQL数据库引擎。主要特点有:(1)事务处理。事务处理具有原子

3、性、一致性、隔离性和持久性,即ACID。(2)零配置。使用数据库SQLite时无需安装,直接运行可执行文件即可。(3)零服务进程。使用数据库时,无需通过TCP/IP等通信协议来把SQL语句提交到服务器端。第12章 SQLite数据泄露(4)单个数据文件。数据库SQLite将用户的数据存放在单个文件里面。也就是说,一个单独的磁盘文件存储一个完整的数据库。只要用户对此数据文件有读/写权限,即可进行读/写操作。第12章 SQLite数据泄露12.1.2 SQLite的安全机制的安全机制为满足嵌入式系统对数据库本身轻便性和对数据存储效率、访问速度、内存占用率等性能要求,SQLite采取了不同于大型数据

4、库的实现机制,但也有潜在的安全隐患。SQLite不提供网络访问服务,而使用单一文件存储数据库的结构和内容,使得数据库非常轻便,便于移植。数据库没有用户管理、访问控制和授权机制,可利用操作系统对文件的访问控制能力实施文件级别的访问控制,即凡是操作系统的合法用户都对数据库文件具有读/写权限,可直接访问数据库文件。开源SQLite 数据库不提供加密机制和数据级的保密性。第12章 SQLite数据泄露12.1.3 数据库泄露的基础知识数据库泄露的基础知识下面主要介绍SQL注入攻击。SQL注入的原理是将SQL代码注入或添加到应用(用户)的输入参数中进行入侵,并将被注入的参数传送到后台的SQL数据库进行解

5、析与执行。一般情况下,需要构造SQL语句的程序均有可能被入侵者攻击,因为SQL语句的构造方法和其多样性均为使用者提供了多种不同的编码手段。第12章 SQLite数据泄露SQL注入的攻击方式通常分为两种。一种是直接将经过精心构造的代码注入参数中,该参数通常被当作SQL命令并加以执行。另一种是非直接的攻击方式,首先在特定字符串中插入恶意代码,然后将带有恶意代码的字符串存储到后台数据库的数据表中或者将其当作原数据,当把保存的字符串置入动态的SQL命令中时,恶意代码会得到执行并对应用产生影响。第12章 SQLite数据泄露动态操纵后台数据库的过程,表明数据库执行了本不该或者不允许被执行的操作。但是,上

6、述示例并没有完全展现SQL注入漏洞的有效性,仅利用它查看后台数据库中所有学生成绩的信息,这完全可以通过合法的途径来实现该功能。由于每个人查询自己的成绩时应该先登录到校园网,如果该SQL注入发生在学生登录界面,又会出现什么情况呢?下面再介绍学生登录校园网页面的例子,如图12-1所示。第12章 SQLite数据泄露图12-1 学生登录窗口第12章 SQLite数据泄露上述示例涉及应用逻辑的概念,应用逻辑是指通过输入正确的验证证书查询后台数据库并得到返回记录,转而访问被保护的逻辑层脚本。如果存在SQL注入漏洞,则应用逻辑有可能被破坏。在上述示例中,向URL中注入的字符串(OR1=1)被称为SQL注入

7、渗透测试用例,即payload。通过输入payload可以检测是否存在SQL注入漏洞并加以利用得到目标数据。第12章 SQLite数据泄露12.1.4 SQL漏洞产生的原因漏洞产生的原因下面详细分析造成SQL注入攻击的原因。1.构造动态字符串构造动态字符串构造动态字符串是开发人员应用的一种编程技术,允许程序在运行过程中动态地构造SQL查询语句。开发人员通过构造动态的SQL代码来创建灵活通用的应用。程序在运行过程中不仅会根据不同的查询需求决定需要提取哪个字段(如update语句),而且会根据不同的条件来选择不同的查询对象。第12章 SQLite数据泄露2.不安全的数据库配置不安全的数据库配置通过

8、前面的介绍,了解了保证应用程序的代码安全是首要任务,但同时数据库本身的安全问题也值得重视。常用的数据库在安装的时候会自动添加默认内容。比如MySQL使用默认的用户账户“root”和“anonymous”,Oracle在创建数据库时会自动生成“SYSTEM”、“SYS”、“OUTLN”和“DBSNMP”账户,SQL Server默认的系统管理员账户为“sa”。其他账户也是按照默认的方法进行预设置的,口令则众所周知。第12章 SQLite数据泄露3.回调函数回调函数回调函数是通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当该指针被用来调用其所指向的函数时,就称之为回调函

9、数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用,用于对该事件或条件进行响应。第12章 SQLite数据泄露使用回调函数的过程如下:(1)定义一个回调函数;(2)提供函数实现的一方在初始化时,将回调函数的函数指针注册给调用者;(3)当特定的事件或条件发生时,调用者使用函数指针调用回调函数对事件进行处理。第12章 SQLite数据泄露回调函数的意义如下:因为可以把调用者与被调用者分开,所以调用者无需关心谁是被调用者。调用者只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户将需要调用的方法的指针作为参数传递给一个函数,以便该函数

10、在处理相似事件的时候可以灵活使用不同方法。第12章 SQLite数据泄露回调函数在实际中究竟有什么作用呢?可假设有这样一种情况:我们需要编写一个库,该库提供某些排序算法的实现方法(如冒泡排序、快速排序、shell排序、shake排序等)。为了能让库更加通用且无需在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑,或者让库可用于多种数据类型(int、float、string),此时该怎么办呢?可以使用函数指针,并进行回调。第12章 SQLite数据泄露回调可用于通知机制。例如,在A程序中设置一个计时器,每到一定时间,A程序会得到相应的通知,但通知机制的实现者对A程序一无所知,则需要一个具有特定原型

11、的函数指针进行回调,通知A程序事件已经发生。实际上,API使用一个回调函数SetTimer()来通知计时器。如果没有提供回调函数,则API会将一个消息发往程序的消息队列。另一个使用回调机制的API函数是EnumWindow(),该函数枚举屏幕上所有顶层窗口,每个窗口可以通过它调用另一个程序提供的函数并传递给窗口的处理程序。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,只关心返回值,因为该函数基于返回值选择继续执行或退出。第12章 SQLite数据泄露回调函数继承自C语言。在C+中,应只在与C代码建立接口或与已有的回调接口打交道时,才使用回调函数。除

12、了上述情况,在C+中使用虚拟方法或仿函数都不是回调函数。第12章 SQLite数据泄露12.1.5 ASLR的基础知识的基础知识1.ASLR的概念的概念ASLR的英文全名为Address Space Layout Randomization,即地址空间布局随机化。一些攻击,比如Return Oriented Programming(ROP)之类的代码复用攻击,会试图得到被攻击者的内存布局信息,以便利用获取的代码或者数据位置来定位并进行攻击。比如可以找到ROP里面的gadget。而ASLR将内存区域随机分布,以此来提升攻击者的成功难度。第12章 SQLite数据泄露2.ASLR存在的问题及解决方

13、案存在的问题及解决方案在出现某些漏洞的情况下,比如内存信息泄露,攻击者会得到部分内存信息,如某些代码指针。传统的ASLR只能随机化整个segment,比如栈、堆或者代码区。此时攻击者可通过泄露的地址信息推导别的信息,如另外一个函数的地址等。整个segment 的地址都可以推导出来,进而得到更多信息,增加了攻击利用的成功率。在32位系统中,由于随机的熵值不高,攻击者容易通过穷举法猜出地址。第12章 SQLite数据泄露主要的改进方法有两种:一是防止内存信息泄露,二是增强ASLR本身。随机化的基本单位定义为随机化粒度。随机化的方式可以改进。随机化的时间(timing)可以改进。另外,可用编译器来帮

14、助定位要migrate的内存位置(指针),并且在每次有输出时进行动态随机化。该方法对于网络应用(例如服务器),如I/O-intensive的应用,可能会导致随机化间隔极短而性能开销巨大。第12章 SQLite数据泄露12.2 不安全的全文搜索特性不安全的全文搜索特性12.2.1 SQLite全文搜索特性全文搜索特性为支持全文检索,SQLite提供了FTS(Full Text Search)扩展的功能。通过在数据库中创建虚拟表存储全文索引,用户可以使用MATCH keyword查询而非LIKE%keyword%子串匹配的方式执行搜索,充分利用索引可使速度得到极大提升。如果读者对搜索引擎原理有初步

15、的了解,则知道在实现全文检索中对原始内容的分词是必须的。第12章 SQLite数据泄露自定义分词器需要实现几个回调函数(关于回调函数的知识请参看上一小节有关内容),其对应的生命周期如下:xClose销毁分词游标;xNext获取下一个分词结果;xCreate初始化分词器;xDestroy销毁分词器;xOpen初始化分词游标。分词器的具体实现可以参考 simple_tokenizer(非官方 SQLite 仓库)的例子。完成分词器的配置初始化之后,即可通过创建虚拟表的方式为数据库建立全文索引,并使用 MATCH 语句执行更高效的检索。由于搜索功能的具体细节与本文要讨论的内容没有太大关系,在此不做赘

16、述。第12章 SQLite数据泄露12.2.2 危险的危险的fts3_tokenizerSQLite3中注册自定义分词器用到的函数是fts3_tokenizer,实现代码是ext/fts3/fts3_tokenizer.c的scalarFunc函数。支持以下两种调用方式:select fts3_tokenizer();select fts3_tokenizer(,);第12章 SQLite数据泄露攻击者仅需要构造一个合适的结构体并获取其内存地址,使用SQL注入(关于SQL注入请参看上一小节有关内容)等手段让目标注册构造好“分词器”,再通过SQL触发特殊回调就可以实现对IP寄存器进行劫持,以此执

17、行任意代码。接下来进一步分析这个攻击面是否可以被利用。第12章 SQLite数据泄露1.基地址泄露基地址泄露如果name是已经注册过的分词器,只提供参数执行select fts3_tokenizer(name),将会返回该分词器对应的内存地址。在fts3.c中可以看到SQLite3默认注册了内置分词器simple和porter:if(sqlite3Fts2HashInsert(pHash,simple,7,(void*)pSimple)|sqlite3Fts2HashInsert(pHash,porter,7,(void*)pPorter)第12章 SQLite数据泄露获得指针后,即可通过简单

18、计算获得libsqlite3.so的基地址,从而绕过ASLR(关于ASLR的基本知识请参看上一小节),如图12-2所示。图12-2 获得libsqlite3.so的基地址第12章 SQLite数据泄露2.任意代码运行任意代码运行通过触发xCreate回调可执行任意代码。运行64位的SQLite3控制台,输入如下查询语句即可导致段错误:新的问题是程序并非直接跳转到传入的地址,而是在该地址上获取一个结构体的成员。要实现可控的跳转,需要可以写入指针的地址。既然已有libsqlite的基地址泄露,那么可以通过PRAGMA语句实现纯SQL向其.bss段写入。使用此语句可以在数据库打开的过程中修改全局的状

19、态,以及访问数据库元数据等。第12章 SQLite数据泄露3.PoC通过以上分析,该攻击面可以通过如下方式触发:(1)通过SQL注入泄漏libsqlite3的地址,注意结果是大端序。(2)通过select sqlite_version()函数泄漏版本,针对具体版本调整偏移量。(3)执行PRAGMA soft_heap_limit语句布置需要call的目标指令地址。(4)将libsqlite3的.bss段中的结构体地址转成大端序的blob,然后注册分词器。(5)创建虚拟表,触发xCreate回调,执行代码。第12章 SQLite数据泄露12.2.3 多种场景下攻击分析多种场景下攻击分析利用以上知

20、识可以在下列场景下进行相应攻击。1.SQL注入注入Web应用远程执行代码应用远程执行代码使用union或盲注可泄露libsqlite3的基地址。在使用mod_PHP方式执行PHP的服务器上,得到的地址可在多次请求中保持不变。通过计算可用的地址,可触发代码执行。因为PHP的SQLite3扩展中的exec方法支持使用分号分隔多个语句,因此可以使用注入的方式触发任意代码执行。第12章 SQLite数据泄露2.绕过绕过PHP安全配置执行任意命令安全配置执行任意命令就PHP而言,可利用任意代码执行来绕过php.ini的open_basedir和disable_functions配置,以进一步提权。劫持I

21、P寄存器的POC已经给出,可获得一次call任意地址的机会。但是只能执行一次任意代码,也没有合适的栈迁移指令来实现rop,实现系统shell还需要解决一些问题。在调用xCreate的上下文中存在多个可控参数,但单纯靠libsqlite3找不到合适的gadget进行组合利用。在exploit中采用了迂回做法,使用另一处xOpen回调和PHP中一处调用了popen的gadget来实现任意命令执行。第12章 SQLite数据泄露为了让xCreate正常返回,可将其设置为simple分词器自带的simpleCreate函数指针。但PRAGMA语句只能修改一个指针,而现在需要至少三个连续的QWORD可控

22、。这可以通过堆喷射的方式实现,也可以再次寻找可以修改的.bss段。在源代码中搜索宏STD_PHP_INI_ENTRY,找到访问标记PHP_INI_SYSTEM或者PHP_INI_ALL,用OnUpdateLong可获取数值的配置。在32位系统上可以使用OnUpdateBool的选项,或直接调用assert_options函数直接修改assert模块中连续的一块内容。满足要求的选项不少,如可以使用mysqlnd的net_cmd_buffer_size和log_mask。第12章 SQLite数据泄露3.Android Content Provider经过测试发现,无论是SQLiteDatabas

23、e的executeSQL方法还是query方法,都不支持使用分号分隔一次执行多个语句。然而触发的关键语句(如“创建虚拟表”等)都不能通过子查询进行构造,因此从Content Provider的注入点上只能实现注册,而不能触发回调也不能使用PRAGMA。由于每个App都由Zygote fork而来,只需要读取自身进程的maps就可以得到其他进程的内存布局。第12章 SQLite数据泄露4.Webkit上的上的WebSQLWebkit提供WebSQL数据库,可在浏览器内创建供客户端使用的关系数据库存储。虽然没有被HTML5标准采纳,但该功能被保留了下来。在支持WebSQL的浏览器中,先使用wind

24、ow.openDatabase方法打开一个数据库实例,再使用数据库实例的transaction方法创建一个事务,便可以通过事务对象执行SQL查询。第12章 SQLite数据泄露5.缓解和修补滥用某些特性可能导致应用程序产生攻击面,禁用某些特性可以起到缓解的效果。以上提到的AOSP、WebKit等开源项目对此设计了下列不同的缓解方案,具有很重要的参考价值。(1)如果用不到全文检索,可通过关闭 SQLITE_ENABLE_FTS3/SQLITE_EN-ABLE_FTS4/SQLITE_ENABLE_FTS5选项禁用之,或者使用Amalgamation版本编译。第12章 SQLite数据泄露(2)如

25、果需要使用MATCH检索,但无需支持多国语言(即内置分词器可以满足要求),则在ext/fts3/fts3.c中注释如下代码关闭此函数,具体代码如下:&SQLITE_OK=(rc=sqlite3Fts3InitHashTable(db,pHash,fts3_tokenizer)(3)使用SQLite3的Authorization Callbacks设置访问控制。第12章 SQLite数据泄露12.3 利用利用SQLite load_extension进行攻击进行攻击SQLite从3.3.6版本开始提供支持扩展功能,通过SQLite load_extension API(或者load_extens

26、ion SQL语句),开发者可以在不改动SQLite源码的情况下,通过动态加载的库(so/dll/dylib)来扩展SQLite的功能,如图12-3所示。第12章 SQLite数据泄露图12-3 SQLite Load An Extension接口第12章 SQLite数据泄露便利的功能总是最先被黑客利用来实施攻击。借助SQLite动态加载的特性,仅需要在可以预测的存储路径中预先放置一个覆盖SQLite扩展规范的动态库(Android平台的so库),通过SQL注入漏洞调用load_extension,即可很轻松地激活库中的代码,直接形成远程代码执行漏洞。国外黑客早就提出使用load_exten

27、sion和SQL注入漏洞来进行远程代码执行攻击的方法,如图12-4所示。第12章 SQLite数据泄露图12-4 load_extension结合SQL实现远程代码执行攻击第12章 SQLite数据泄露SQLite官方(http:/www.sqlite.org/cgi/src/info/4692319ccf28b0eb)在代码中将load_extension的功能设置为“默认关闭”,需要在代码中通过sqlite3_enable_load_extension API显式打开后方可使用,因此API无法在SQL语句中调用,断绝了利用SQL注入打开的可能性,如图12-5所示。第12章 SQLite数据

28、泄露图12-5 SQLite官方发布的load_extension有关声明第12章 SQLite数据泄露1.Android平台下的平台下的SQLite load_extension支持支持出于功能和优化的目的,Google从Android 4.1.2开始通过预编译宏SQLITE_OMIT_LOAD_EXTENSION,从代码上直接移除了SQLite动态加载扩展的功能,如图12-6所示。第12章 SQLite数据泄露图12-6 预编译宏SQLITE_OMIT_ LOAD_EXTENSION第12章 SQLite数据泄露可通过adb shell来判断Android系统是否默认支持load_exte

29、nsion,Android4.0.3以下版本中sqlite3的.help命令如图12-7所示。第12章 SQLite数据泄露第12章 SQLite数据泄露2.Android平台下的平台下的SQLite extension模块编译模块编译SQLite extension必须包含sqlite3ext.h头文件,实现一个sqlite3_extension_init 入口。图12-8所示为一个SQLite extension的基本框架。第12章 SQLite数据泄露图12-8 SQLite extension的基本框架第12章 SQLite数据泄露图12-9所示为Android.mk文件。图12-9

30、Android.mk文件第12章 SQLite数据泄露可以利用SQLite extension的基本框架实现加载时打印log输出的SQLite extension,如图12-10所示。图12-10 在SQLite extension中插入打印语句第12章 SQLite数据泄露3.Android平台下利用平台下利用SQLite load_extension实施攻击实施攻击由于SQLite是未加密的数据库,会带来数据泄露的风险。因此Android App都开始使用第三方透明加密数据库组件,比如sqlcipher。由于sqlcipher编译时未移除load_extension,如图12-11所示,导

31、致使用它的App存在被远程代码执行攻击的风险。第12章 SQLite数据泄露图12-11 sqlcipher编译时未移除load_extension第12章 SQLite数据泄露下面通过一个例子来描述如何攻击,该例子通过SQL注入配合load_extension的漏洞实现。首先,实现一个使用sqlcipher的Android程序。下载sqlcipher包,将库文件导入项目,如图12-12所示。图12-12 为项目导入sqlcipher包第12章 SQLite数据泄露引入sqlcipher,如图12-13所示。图12-13 在class中添加对sqlcipher的引用第12章 SQLite数据泄

32、露加载sqlcihper的库文件,并且在打开数据库时提供密钥,如图12-14所示。图12-14 代码中加载使用sqlcihper第12章 SQLite数据泄露实现一个存在SQL注入的数据库查询语句,外部可控,如图12-15所示。图12-15 动态生成SQL语句第12章 SQLite数据泄露该函数接收一个外部可控的参数,并将数据库查询语句进行拼接,导致可被外部植入恶意代码进行代码执行攻击,如图12-16所示。图12-16 利用SQLite load_extension机制调用so文件第12章 SQLite数据泄露执行之后,可以观察到so加载成功,如图12-17所示。图12-17 调用so文件后的执行效果第12章 SQLite数据泄露小小 结结本章首先介绍渗透攻击SQLite基础知识,如SQLite简介、SQLite 依据自己的特点所应用的场景、有关数据库安全方面的基本概念及针对数据库的常用攻击方法(如SQL注入)等。随后讲述了攻击中涉及的知识点,如ASLR、回调等机制。此外,还在第二小节介绍了基于全文搜索的攻击,在第三小节描述了利用SQLite load_extension功能进行的攻击。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《移动智能终端安全》课件第12章.pptx)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|