歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

使用惡意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.gkrbnd.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        福彩原副主任