运用歹意SQLite数据库猎取代码实行 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

运用歹意SQLite数据库猎取代码实行

申博_新闻事件 申博 45次浏览 已收录 0个评论

媒介

SQLite是世界上布置最多的软件之一。然则,从平安角度来看,它只是经由历程WebSQL和浏览器开辟的视角举行了平安搜检。

在研讨人员的历久研讨中,曾尝试在SQLite中应用内存破坏破绽,而不依赖于SQL言语之外的任何环境。运用研讨人员的查询挟制和面向查询编程的立异手艺,就可以够地应用SQLite引擎中的内存破坏破绽。

鉴于SQLite险些内置于每一个重要的操纵体系、桌面或挪动装备,研讨人员愿望经由历程宣布研讨人员的平安研讨和要领,来防止大规模进击事宜的发作。别的,本文引见的很多原语并非SQLite独占的,可以拷贝到其他SQL引擎。

SQLite的进击面

下面的代码片断是暗码盗取器后端的一个相称罕见的示例:

运用歹意SQLite数据库猎取代码实行

由于研讨人员掌握了数据库及其内容,因而可以将可用的进击面分为两部份:数据库的加载和初始剖析,以及对其实行的SELECT查询。

sqlite3_open完成的初始加载现实上异常有限,它基础上是翻开数据库的大批设置和设置代码。

跟着研讨人员最先查询数据库,事变变得越发风趣。

用SQLite开辟者的话来讲,就是“SELECT语句是SQL言语中最庞杂的敕令” 。

虽然研讨人员没法掌握查询自身(由于它在研讨人员的目的中是硬编码的),但细致研讨SELECT历程将对研讨人员的探究异常有益。

由于SQLite3是一个假造机,因而必需起首运用sqlite3_prepare *例程之一将每一个SQL语句编译为字节码顺序。

在其他操纵中,prepare函数会遍历并扩大一切SELECT子查询。这个历程的一部份是考证一切相干对象(如表或视图)是不是确切存在,并将它们定位在主情势中。

sqlite_master和DDL

每一个SQLite数据库都有一个sqlite_master表,它定义了一切数据库及其一切对象(比方表、视图、索引等)的情势。

sqlite_master表定义为:

运用歹意SQLite数据库猎取代码实行

研讨人员迥殊感兴趣的部份是sql列,该字段是用于形貌对象的DDL(数据定义言语)。

从某种意义上说,DDL敕令类似于C标头文件。 DDL敕令用于定义数据库中数据容器的组织、称号和范例,就像标头文件一般定义范例定义、组织、类和其他数据组织一样。

假如研讨人员搜检数据库文件,这些DDL语句现实上会以纯文本情势涌现:

运用歹意SQLite数据库猎取代码实行

在查询预备历程当中,sqlite3LocateTable()试图找到形貌研讨人员感兴趣的查询的内存组织。

sqlite3LocateTable()读取sqlite_master中可用的情势,假如这是第一次如许做,它还会对每一个效果举行回调,以考证DDL语句是不是有效,并构建必要的内部数据组织来形貌所议论的对象。

DDL补丁

相识了这个预备历程后,研讨人员是不是可以简朴地替代文件中以纯文本情势涌现的DDL ?假如研讨人员能将本身的SQL注入到文件中,或许就可以影响它的行动。

运用歹意SQLite数据库猎取代码实行

基于上面的代码片断,DDL语句好像必需以“create”开首。

斟酌到这类限定,研讨人员须要评价研讨人员发明的进击面。

在搜检SQLite的文档后发明,以下这些多是研讨人员可以建立的对象:

CREATE VIEW敕令给研讨人员供应一个风趣的主意,简朴来讲,VIEW只是预先打包的SELECT语句。假如研讨人员用兼容的VIEW替代目的软件所希冀的表,那末进击时机就会涌现。

挟制查询

想象一下以下场景:假定原始数据库有一个名为dummy的TABLE,定义以下:

目的软件运用以下内容查询它:

运用歹意SQLite数据库猎取代码实行

假如研讨人员将dummy设想为VIEW,研讨人员现实上可以挟制此查询:

以下这个VIEW使研讨人员可以挟制查询,这意味着可以天生一个研讨人员完整掌握的全新查询。

运用歹意SQLite数据库猎取代码实行

既然研讨人员可以与SQLite诠释器举行交互,接下来的问题是SQLite内置了哪些开辟原语?它是不是许可任何体系敕令从文件体系读取或写入文件体系?

SQL注入

作为研讨人员,研讨人员很难在没有“i”的情况下拼写SQL,所以它好像是一个合理的出发点。毕竟,研讨人员愿望熟习SQLite供应的内部原语。好像最直接的技能是附加一个新的数据库文件,并运用以下内容写入:

可以看出,研讨人员附加了一个新数据库,建立一个表并插进去一行文本。然后,新数据库建立一个包括web shell的新文件(由于数据库是SQLite中的文件)。

PHP诠释器异常宽大的性子剖析研讨人员的数据库,直到它抵达PHP开放标记“<?”。

在这个暗码盗取者场景中,经由历程编写一个webshell,研讨人员完成了进击目的,然则请注重, DDL不能以“ATTACH”开首。

另一个相干选项是load_extension函数,虽然此函数可以许可研讨人员加载恣意同享对象,但默许情况下它是禁用的。

SQLite中的内存破坏破绽

与运用C言语编写的任何其他软件一样,在评价SQLite的平安性时,内存平安破绽相对值得斟酌。然则,从进击者的角度来看,假如没有适宜的框架来应用这些破绽,这些破绽将成为摆设,没法被应用。

当代减缓步伐是应用内存破坏破绽的重要停滞,进击者须要找到更天真的运转环境和运用方法才可以。

Web SQL

Web SQL数据库是一种网页API,用于在数据库中存储数据,可以运用SQL的变体经由历程JavaScript查询.如今W3C Web应用顺序事情组在2010年11月住手了该范例的事情,理由是缺乏SQLite之外的自力完成环境。

如今,谷歌Chrome,Opera和Safari依然支撑API。一切这些都运用SQLite作为此API的后端。

在一些最盛行的浏览器中,任何网站都可以接见SQLite中不受信托的输入,这引起了进击者的注重,因而,破绽的数目最先上升。

在WebSQL研讨中,研讨人员发明,一个名为“FTS”的假造表模块多是研讨人员研讨的一个风趣的目的。

FTS

全文搜刮(FTS)是一个假造表模块,许可对一组文档举行文本搜刮。从SQL语句的角度来看,假造表对象看起来与任何其他表或视图一样。但在后端,假造表上的查询会挪用影子表上的回调要领,而不是一般对数据库文件举行读写。

一些假造表完成,比方FTS,运用实在的(非假造的)数据库表来存储内容。比方,当将字符串插进去FTS3假造表时,必需天生一些元数据以许可有效的文本搜刮。比方,当将字符串插进去FTS3假造表时,必需天生一些元数据,以便举行有效的文本搜刮。这个元数据终究存储在名为“%_segdir”和“%_segment”的现实表中,而内容自身存储在“% _content”中,个中“%”是原始假造表的称号。

这些包括假造表数据的辅佐现实表被称为“影子表”:

由于其可靠性,在影子表之间通报数据的接口就为供应了肥饶的泥土。研讨人员在RTREE假造表模块中发明的一个新的OOB读破绽(CVE-2019-8457)很好地说清楚明了这一点。

用于地舆索引的RTREE假造表估计以整数列开首,因而,其他RTREE接口希冀RTREE中的第一列是整数。然则,假如研讨人员建立一个表,个中第一列是一个字符串,以下图所示,并将其通报rtreenode()接口,就会发作OOB读取。

如今研讨人员可以运用查询挟制来猎取对查询的掌握,并晓得在那里可以找到破绽,接下来就可以够继承应用开辟了。

SQLite内部组织

地道用SQL编写的当代破绽应用具有以下功用:

1. 内存走漏;

2. 将整数封装并解压缩为64位指;

3. 指针算法;

4. 在内存中建立庞杂的假装对象;

5.  Heap Spray(堆放射)。

什么是数字取证(Digital forensics)? 怎样在这个热点范畴站稳脚跟?

数字取证定义 数字取证(Digital forensics),有时也称作“计算机取证”,是将科学调查技术应用于数字犯罪和攻击领域的一门学问。它是法律和商业在互联网时代的一个重要体现方面,可以是一个有益且有利可图的职业道路。 DFIRLABS的首席取证科学家Jason Jordaan将数字取证定义为“数字证据的识别、保存、检查和分析,使用经过科学认可和验证的过程,并在法庭上最终呈现该证据以回答某些法律问题。” 这是一个非常好的定义,但需要注意的一点是,该术语有时用于描述任何类型的

研讨人员将一一运用SQL来完成它们,别的,为了在PHP7上完成RCE,研讨人员将运用CVE-2015-7036破绽。

理论上,该破绽只要在许可来自不可信源(Web SQL)的恣意SQL的运转环境中才发挥进击威力,然则,SQLite现实上依然可以在很多情况下被触发。

破绽应用设计

CVE-2015-7036是一个异常轻易的破绽,简朴地说,易受进击的fts3_tokenizer()函数在运用单个参数(如“simple”,“porter”或任何其他已注册的tokenizer)挪用时返回tokenizer地点。

当运用2个参数挪用时,fts3_tokenizer将运用第二个参数中blob供应的地点掩盖第一个参数中的tokenizer地点。

在掩盖某个tokenizer以后,运用此tokenizer的fts表的任何新实例都许可研讨人员挟制顺序的历程。

破绽应用设计统共分5步:

1. 走漏tokenizer地点;

2. 盘算基础地点;

3. 捏造将实行研讨人员的歹意代码的tokenizer;

4. 用研讨人员的歹意tokenizer掩盖个中一个tokenizer;

5. 实例化fts3表以触发研讨人员的歹意代码。

内存走漏:二进制

像ASLR如许的减缓步伐无疑提高了内存进击破绽的应用难度,为此,罕见要领是相识内存规划。

在本文的示例中,走漏就是应用了SQLite返回BLOB。

这些BLOB有一个很好的走漏目的,由于它们有时会包括内存指针。

运用歹意SQLite数据库猎取代码实行

运用单个参数挪用易受进击的fts3_tokenizer(),并返回请求的tokenizer的内存地点,hex()可以人类可以读取。研讨人员明显得到了一些内存地点,但由于LITTLE-ENDIAN(小字节序、低字节序)而被反转。固然,研讨人员可以运用一些SQLite内置字符串操纵来再次反转。

QOP链

固然,在SQL中存储数据须要INSERT语句。由于sqlite_master经过了严厉的考证,研讨人员不能运用INSERT,由于一切语句都必需以“CREATE”开首。研讨人员应对这一应战的要领是将查询存储在一个有意义的视图中,并将它们链接在一起。

这看起来能够没什么大的区分,然则跟着我们的链变得愈来愈庞杂,可以运用假装的变量一定会让研讨人员的进击更轻松。

解压缩64位指针

这个原语应当可以很轻易地将研讨人员的十六进制值(比方研讨人员方才完成的走漏)转换为整数,这许可研讨人员在接下来的步骤中对这些指针实行种种盘算。

指针算法

指针算法是一个相称轻易的使命,比方,从研讨人员泄漏的tokenizer指针中提取映像库就像以下如许简朴:

封装64位指针

事实证实它运转得相称好,但仅限于有限局限的整数。

运用歹意SQLite数据库猎取代码实行

较大的整数被转换为它们的2字节代码点,在与SQLite文档发作冲突以后,研讨人员倏忽发明,破绽现实上是一个数据库。

如今研讨人员的指针封装查询以下:

在内存中制造庞杂的捏造对象

编写一个指针一定很有效,但依然不够,很多内存平安问题应用场景请求进击者在内存中捏造一些对象或组织,以至编写一个ROP链。

堆放射

不幸的是,SQLite没有像MySQL那样完成REPEAT()函数。

然则,这个线程给了研讨人员一个解决方案。

zeroblob(N)函数返回一个由N个字节构成的BLOB,而研讨人员运用replace()将这些零替代为研讨人员的捏造对象。

内存走漏:堆

此时,研讨人员已晓得二进制映像的位置,且可以推断出必要函数的位置,并运用研讨人员的歹意tokenizer来举行堆放射。

如今是时刻用研讨人员的一个放射对象掩盖tokenizer了,然则,由于堆地点也是随机的,研讨人员不晓得放射的位置。

此时,研讨人员将以假造表接口为目的。

由于假造表运用底层影子表,因而在差别的SQL接口之间通报原始指针是很罕见的。

要走漏堆地点,研讨人员须要事前天生一个fts3表并滥用它的MATCH接口。

如今研讨人员晓得了研讨人员的堆位置,而且可以准确放射!

应用暗码盗取器C2

如上所述,研讨人员须要设置一个“圈套”识图来启动破绽。因而须要搜检目的并预备准确的识图。

正如上面的代码片断所示,须要的数据库有一个名为Notes的表,个中包括一个名为BodyRich的列。为了挟制这个查询,研讨人员建立了以下视图:

查询Notes后,实行3个QOP链。

heap_spray

第一个QOP链应当运用大批的tokenizer来添补堆。

p64_simple_create,p64_simple_destroy和p64_system基础上都是经由历程研讨人员的走漏和打包功用完成的一切链。比方,p64_simple_create组织以下:

由于这些链变得异常庞杂,异常快,而且异常反复,因而研讨人员建立了QOP.py。

QOP.py经由历程以pwntools款式天生这些查询,使事变变得更简朴。

如许,建立之前的语句就变得云云简朴:

进击的持久性

在iOS上很难完成进击的持久性,由于一切可实行文件都必需作为Apple平安启动的一部份举行署名。荣幸的是,SQLite数据库没有署名。应用开辟的新功用,研讨人员将运用歹意版本替代个中一个经常使用数据库。如许在从新启动并查询到歹意数据库后,进击继承。

为了演示这个观点,研讨人员替代了Contacts DB“AddressBook.sqlitedb”。正如在研讨人员的PHP7破绽中所做的那样,他们建立了两个分外的DDL语句。一个DDL语句掩盖默许的tokenizer“simple”,另一个DDL语句试图实例化被掩盖的tokenizer,从而触发崩溃。如今,所要做的就是将原始数据库的每一个表重写为一个视图,该视图会挟制所实行的任何查询并将其重定向到歹意的DDL。

将contacts db替代为研讨人员的歹意contacts db并从新指导,会致使以下iOS crashdump:

与预期一样,contacts历程在0x4141414141414149崩溃,它愿望在这里找到研讨人员捏造的tokenizer的xCreate组织函数。

别的,contacts db现实上在很多历程之间同享。 Contacts,Facetime,Springboard,WhatsApp,Telegram和XPCProxy只是查询它的一些历程。个中一些历程比其他历程享有更多特权。一旦证实可以在查询历程的高低文中实行代码,这类手艺还许可研讨人员扩大和提拔特权。如今相干的破绽有:

本文翻译自:https://research.checkpoint.com/select-code_execution-from-using-sqlite/


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明运用歹意SQLite数据库猎取代码实行
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址