欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

使用恶意SQLite数据库获取代码执行

来源:本站整理 作者:佚名 时间:2019-09-15 TAG: 我要投稿


前言
SQLite是世界上部署最多的软件之一。但是,从安全角度来看,它只是通过WebSQL和浏览器开发的视角进行了安全检查。
在研究人员的长期研究中,曾尝试在SQLite中利用内存损坏漏洞,而不依赖于SQL语言之外的任何环境。使用研究人员的查询劫持和面向查询编程的创新技术,就可以地利用SQLite引擎中的内存损坏漏洞。
鉴于SQLite几乎内置于每个主要的操作系统、桌面或移动设备,研究人员希望通过发布研究人员的安全研究和方法,来避免大规模攻击事件的发生。此外,本文介绍的许多原语并不是SQLite独有的,可以拷贝到其他SQL引擎。
SQLite的攻击面
下面的代码片段是密码窃取器后端的一个相当常见的示例:

由于研究人员控制了数据库及其内容,因此可以将可用的攻击面分为两部分:数据库的加载和初始解析,以及对其执行的SELECT查询。
sqlite3_open完成的初始加载实际上非常有限,它基本上是打开数据库的大量设置和配置代码。
随着研究人员开始查询数据库,事情变得更加有趣。
用SQLite开发者的话来说,就是“SELECT语句是SQL语言中最复杂的命令” 。
虽然研究人员无法控制查询本身(因为它在研究人员的目标中是硬编码的),但仔细研究SELECT过程将对研究人员的探索非常有益。
由于SQLite3是一个虚拟机,因此必须首先使用sqlite3_prepare *例程之一将每个SQL语句编译为字节码程序。
在其他操作中,prepare函数会遍历并扩展所有SELECT子查询。这个过程的一部分是验证所有相关对象(如表或视图)是否确实存在,并将它们定位在主模式中。
sqlite_master和DDL
每个SQLite数据库都有一个sqlite_master表,它定义了所有数据库及其所有对象(例如表、视图、索引等)的模式。
sqlite_master表定义为:

研究人员特别感兴趣的部分是sql列,该字段是用于描述对象的DDL(数据定义语言)。
从某种意义上说,DDL命令类似于C标头文件。 DDL命令用于定义数据库中数据容器的结构、名称和类型,就像标头文件通常定义类型定义、结构、类和其他数据结构一样。
如果研究人员检查数据库文件,这些DDL语句实际上会以纯文本形式出现:

在查询准备过程中,sqlite3LocateTable()试图找到描述研究人员感兴趣的查询的内存结构。
sqlite3LocateTable()读取sqlite_master中可用的模式,如果这是第一次这样做,它还会对每个结果进行回调,以验证DDL语句是否有效,并构建必要的内部数据结构来描述所讨论的对象。
DDL补丁
了解了这个准备过程后,研究人员是否可以简单地替换文件中以纯文本形式出现的DDL ?如果研究人员能将自己的SQL注入到文件中,也许就能影响它的行为。

基于上面的代码片段,DDL语句似乎必须以“create”开头。
考虑到这种限制,研究人员需要评估研究人员发现的攻击面。
在检查SQLite的文档后发现,以下这些可能是研究人员可以创建的对象:

CREATE VIEW命令给研究人员提供一个有趣的想法,简单来说,VIEW只是预先打包的SELECT语句。如果研究人员用兼容的VIEW替换目标软件所期望的表,那么攻击机会就会出现。
劫持查询
设想一下以下场景:假设原始数据库有一个名为dummy的TABLE,定义如下:

目标软件使用以下内容查询它:

如果研究人员将dummy设计为VIEW,研究人员实际上可以劫持此查询:

以下这个VIEW使研究人员能够劫持查询,这意味着可以生成一个研究人员完全控制的全新查询。

既然研究人员可以与SQLite解释器进行交互,接下来的问题是SQLite内置了哪些开发原语?它是否允许任何系统命令从文件系统读取或写入文件系统?
SQL注入

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载