版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
SQLite數(shù)據(jù)泄露12.1基礎(chǔ)知識(shí)12.2不安全的全文搜索特性12.3利用SQLiteload_extension進(jìn)行攻擊小結(jié)
12.1基礎(chǔ)知識(shí)
12.1.1SQLite的基礎(chǔ)知識(shí)
SQLite是一個(gè)用小型C庫(kù)實(shí)現(xiàn)的關(guān)系型嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng),是目前嵌入式系統(tǒng)上最廣泛部署的SQL數(shù)據(jù)庫(kù)引擎。由于SQLite是一個(gè)嵌入式數(shù)據(jù)庫(kù)引擎,沒有分離的服務(wù)處理過程,因此可以直接讀寫磁盤文件。
SQLite是一個(gè)壓縮庫(kù)。該庫(kù)有250
KB左右,實(shí)際大小要考慮到編譯器編譯時(shí)的一些選項(xiàng)設(shè)置。如果將可選項(xiàng)全部忽略,則庫(kù)的大小可被減小為180
KB。SQLite在內(nèi)存非常受限的設(shè)備(如無(wú)線設(shè)備、PDA、MP3)中是一個(gè)非常流行的數(shù)據(jù)庫(kù)引擎,可以運(yùn)行在小的棧空間上(4
KB),也可以運(yùn)行在小的堆空間上(100
KB)。SQLite在內(nèi)存空間占用上和運(yùn)行速度上比較折中,運(yùn)行速度高于內(nèi)存使用量大的數(shù)據(jù)庫(kù),在較低內(nèi)存的環(huán)境中的性能比較好。
SQLite的開發(fā)者繼續(xù)擴(kuò)展功能,同時(shí)在保持與前期版本的語(yǔ)法、文件格式完全兼容的情況下提高可靠性和性能,并且源碼對(duì)每一個(gè)人絕對(duì)公開。
SQLite的體系結(jié)構(gòu)主要包括接口、編譯器、虛擬機(jī)、B-tree、頁(yè)面高速緩存、OS
Interface等,這些內(nèi)容在前面章節(jié)已述,在此不做描述。
SQLite實(shí)現(xiàn)了完備的、零配置的SQL數(shù)據(jù)庫(kù)引擎。主要特點(diǎn)有:
(1)事務(wù)處理。事務(wù)處理具有原子性、一致性、隔離性和持久性,即ACID。
(2)零配置。使用數(shù)據(jù)庫(kù)SQLite時(shí)無(wú)需安裝,直接運(yùn)行可執(zhí)行文件即可。
(3)零服務(wù)進(jìn)程。使用數(shù)據(jù)庫(kù)時(shí),無(wú)需通過TCP/IP等通信協(xié)議來把SQL語(yǔ)句提交到服務(wù)器端。
(4)單個(gè)數(shù)據(jù)文件。數(shù)據(jù)庫(kù)SQLite將用戶的數(shù)據(jù)存放在單個(gè)文件里面。也就是說,一個(gè)單獨(dú)的磁盤文件存儲(chǔ)一個(gè)完整的數(shù)據(jù)庫(kù)。只要用戶對(duì)此數(shù)據(jù)文件有讀/寫權(quán)限,即可進(jìn)行讀/寫操作。
12.1.2SQLite的安全機(jī)制
為滿足嵌入式系統(tǒng)對(duì)數(shù)據(jù)庫(kù)本身輕便性和對(duì)數(shù)據(jù)存儲(chǔ)效率、訪問速度、內(nèi)存占用率等性能要求,SQLite采取了不同于大型數(shù)據(jù)庫(kù)的實(shí)現(xiàn)機(jī)制,但也有潛在的安全隱患。SQLite不提供網(wǎng)絡(luò)訪問服務(wù),而使用單一文件存儲(chǔ)數(shù)據(jù)庫(kù)的結(jié)構(gòu)和內(nèi)容,使得數(shù)據(jù)庫(kù)非常輕便,便于移植。數(shù)據(jù)庫(kù)沒有用戶管理、訪問控制和授權(quán)機(jī)制,可利用操作系統(tǒng)對(duì)文件的訪問控制能力實(shí)施文件級(jí)別的訪問控制,即凡是操作系統(tǒng)的合法用戶都對(duì)數(shù)據(jù)庫(kù)文件具有讀/寫權(quán)限,可直接訪問數(shù)據(jù)庫(kù)文件。開源SQLite數(shù)據(jù)庫(kù)不提供加密機(jī)制和數(shù)據(jù)級(jí)的保密性。
12.1.3數(shù)據(jù)庫(kù)泄露的基礎(chǔ)知識(shí)
下面主要介紹SQL注入攻擊。
SQL注入的原理是將SQL代碼注入或添加到應(yīng)用(用戶)的輸入?yún)?shù)中進(jìn)行入侵,并將被注入的參數(shù)傳送到后臺(tái)的SQL數(shù)據(jù)庫(kù)進(jìn)行解析與執(zhí)行。一般情況下,需要構(gòu)造SQL語(yǔ)句的程序均有可能被入侵者攻擊,因?yàn)镾QL語(yǔ)句的構(gòu)造方法和其多樣性均為使用者提供了多種不同的編碼手段。
SQL注入的攻擊方式通常分為兩種。一種是直接將經(jīng)過精心構(gòu)造的代碼注入?yún)?shù)中,該參數(shù)通常被當(dāng)作SQL命令并加以執(zhí)行。另一種是非直接的攻擊方式,首先在特定字符串中插入惡意代碼,然后將帶有惡意代碼的字符串存儲(chǔ)到后臺(tái)數(shù)據(jù)庫(kù)的數(shù)據(jù)表中或者將其當(dāng)作原數(shù)據(jù),當(dāng)把保存的字符串置入動(dòng)態(tài)的SQL命令中時(shí),惡意代碼會(huì)得到執(zhí)行并對(duì)應(yīng)用產(chǎn)生影響。
動(dòng)態(tài)操縱后臺(tái)數(shù)據(jù)庫(kù)的過程,表明數(shù)據(jù)庫(kù)執(zhí)行了本不該或者不允許被執(zhí)行的操作。但是,上述示例并沒有完全展現(xiàn)SQL注入漏洞的有效性,僅利用它查看后臺(tái)數(shù)據(jù)庫(kù)中所有學(xué)生成績(jī)的信息,這完全可以通過合法的途徑來實(shí)現(xiàn)該功能。由于每個(gè)人查詢自己的成績(jī)時(shí)應(yīng)該先登錄到校園網(wǎng),如果該SQL注入發(fā)生在學(xué)生登錄界面,又會(huì)出現(xiàn)什么情況呢?下面再介紹學(xué)生登錄校園網(wǎng)頁(yè)面的例子,如圖12-1所示。
圖12-1學(xué)生登錄窗口
上述示例涉及應(yīng)用邏輯的概念,應(yīng)用邏輯是指通過輸入正確的驗(yàn)證證書查詢后臺(tái)數(shù)據(jù)庫(kù)并得到返回記錄,轉(zhuǎn)而訪問被保護(hù)的邏輯層腳本。如果存在SQL注入漏洞,則應(yīng)用邏輯有可能被破壞。在上述示例中,向URL中注入的字符串(OR'1'='1')被稱為SQL注入滲透測(cè)試用例,即payload。通過輸入payload可以檢測(cè)是否存在SQL注入漏洞并加以利用得到目標(biāo)數(shù)據(jù)。
12.1.4SQL漏洞產(chǎn)生的原因
下面詳細(xì)分析造成SQL注入攻擊的原因。
1.構(gòu)造動(dòng)態(tài)字符串
構(gòu)造動(dòng)態(tài)字符串是開發(fā)人員應(yīng)用的一種編程技術(shù),允許程序在運(yùn)行過程中動(dòng)態(tài)地構(gòu)造SQL查詢語(yǔ)句。開發(fā)人員通過構(gòu)造動(dòng)態(tài)的SQL代碼來創(chuàng)建靈活通用的應(yīng)用。程序在運(yùn)行過程中不僅會(huì)根據(jù)不同的查詢需求決定需要提取哪個(gè)字段(如update語(yǔ)句),而且會(huì)根據(jù)不同的條件來選擇不同的查詢對(duì)象。
2.不安全的數(shù)據(jù)庫(kù)配置
通過前面的介紹,了解了保證應(yīng)用程序的代碼安全是首要任務(wù),但同時(shí)數(shù)據(jù)庫(kù)本身的安全問題也值得重視。常用的數(shù)據(jù)庫(kù)在安裝的時(shí)候會(huì)自動(dòng)添加默認(rèn)內(nèi)容。比如MySQL使用默認(rèn)的用戶賬戶“root”和“anonymous”,Oracle在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)會(huì)自動(dòng)生成“SYSTEM”、“SYS”、“OUTLN”和“DBSNMP”賬戶,SQLServer默認(rèn)的系統(tǒng)管理員賬戶為“sa”。其他賬戶也是按照默認(rèn)的方法進(jìn)行預(yù)設(shè)置的,口令則眾所周知。
3.回調(diào)函數(shù)
回調(diào)函數(shù)是通過函數(shù)指針調(diào)用的函數(shù)。如果把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)該指針被用來調(diào)用其所指向的函數(shù)時(shí),就稱之為回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用,用于對(duì)該事件或條件進(jìn)行響應(yīng)。
使用回調(diào)函數(shù)的過程如下:
(1)定義一個(gè)回調(diào)函數(shù);
(2)提供函數(shù)實(shí)現(xiàn)的一方在初始化時(shí),將回調(diào)函數(shù)的函數(shù)指針注冊(cè)給調(diào)用者;
(3)當(dāng)特定的事件或條件發(fā)生時(shí),調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對(duì)事件進(jìn)行處理。
回調(diào)函數(shù)的意義如下:因?yàn)榭梢园颜{(diào)用者與被調(diào)用者分開,所以調(diào)用者無(wú)需關(guān)心誰(shuí)是被調(diào)用者。調(diào)用者只需知道存在一個(gè)具有特定原型和限制條件的被調(diào)用函數(shù)。簡(jiǎn)而言之,回調(diào)函數(shù)就是允許用戶將需要調(diào)用的方法的指針作為參數(shù)傳遞給一個(gè)函數(shù),以便該函數(shù)在處理相似事件的時(shí)候可以靈活使用不同方法。
回調(diào)函數(shù)在實(shí)際中究竟有什么作用呢?可假設(shè)有這樣一種情況:我們需要編寫一個(gè)庫(kù),該庫(kù)提供某些排序算法的實(shí)現(xiàn)方法(如冒泡排序、快速排序、shell排序、shake排序等)。為了能讓庫(kù)更加通用且無(wú)需在函數(shù)中嵌入排序邏輯,而讓使用者來實(shí)現(xiàn)相應(yīng)的邏輯,或者讓庫(kù)可用于多種數(shù)據(jù)類型(int、float、string),此時(shí)該怎么辦呢?可以使用函數(shù)指針,并進(jìn)行回調(diào)。
回調(diào)可用于通知機(jī)制。例如,在A程序中設(shè)置一個(gè)計(jì)時(shí)器,每到一定時(shí)間,A程序會(huì)得到相應(yīng)的通知,但通知機(jī)制的實(shí)現(xiàn)者對(duì)A程序一無(wú)所知,則需要一個(gè)具有特定原型的函數(shù)指針進(jìn)行回調(diào),通知A程序事件已經(jīng)發(fā)生。實(shí)際上,API使用一個(gè)回調(diào)函數(shù)SetTimer()來通知計(jì)時(shí)器。如果沒有提供回調(diào)函數(shù),則API會(huì)將一個(gè)消息發(fā)往程序的消息隊(duì)列。
另一個(gè)使用回調(diào)機(jī)制的API函數(shù)是EnumWindow(),該函數(shù)枚舉屏幕上所有頂層窗口,每個(gè)窗口可以通過它調(diào)用另一個(gè)程序提供的函數(shù)并傳遞給窗口的處理程序。EnumWindow()并不關(guān)心被調(diào)用者在何處,也不關(guān)心被調(diào)用者用它傳遞的處理程序做了什么,只關(guān)心返回值,因?yàn)樵摵瘮?shù)基于返回值選擇繼續(xù)執(zhí)行或退出。
回調(diào)函數(shù)繼承自C語(yǔ)言。在C++?中,應(yīng)只在與C代碼建立接口或與已有的回調(diào)接口打交道時(shí),才使用回調(diào)函數(shù)。除了上述情況,在C++?中使用虛擬方法或仿函數(shù)都不是回調(diào)函數(shù)。
12.1.5ASLR的基礎(chǔ)知識(shí)
1.ASLR的概念
ASLR的英文全名為AddressSpaceLayoutRandomization,即地址空間布局隨機(jī)化。一些攻擊,比如ReturnOrientedProgramming(ROP)之類的代碼復(fù)用攻擊,會(huì)試圖得到被攻擊者的內(nèi)存布局信息,以便利用獲取的代碼或者數(shù)據(jù)位置來定位并進(jìn)行攻擊。比如可以找到ROP里面的gadget。而ASLR將內(nèi)存區(qū)域隨機(jī)分布,以此來提升攻擊者的成功難度。
2.ASLR存在的問題及解決方案
在出現(xiàn)某些漏洞的情況下,比如內(nèi)存信息泄露,攻擊者會(huì)得到部分內(nèi)存信息,如某些代碼指針。傳統(tǒng)的ASLR只能隨機(jī)化整個(gè)segment,比如棧、堆或者代碼區(qū)。此時(shí)攻擊者可通過泄露的地址信息推導(dǎo)別的信息,如另外一個(gè)函數(shù)的地址等。整個(gè)segment的地址都可以推導(dǎo)出來,進(jìn)而得到更多信息,增加了攻擊利用的成功率。在32位系統(tǒng)中,由于隨機(jī)的熵值不高,攻擊者容易通過窮舉法猜出地址。
主要的改進(jìn)方法有兩種:一是防止內(nèi)存信息泄露,二是增強(qiáng)ASLR本身。
隨機(jī)化的基本單位定義為隨機(jī)化粒度。
隨機(jī)化的方式可以改進(jìn)。
隨機(jī)化的時(shí)間(timing)可以改進(jìn)。
另外,可用編譯器來幫助定位要migrate的內(nèi)存位置(指針),并且在每次有輸出時(shí)進(jìn)行動(dòng)態(tài)隨機(jī)化。該方法對(duì)于網(wǎng)絡(luò)應(yīng)用(例如服務(wù)器),如I/O-intensive的應(yīng)用,可能會(huì)導(dǎo)致隨機(jī)化間隔極短而性能開銷巨大。
12.2不安全的全文搜索特性
12.2.1SQLite全文搜索特性為支持全文檢索,SQLite提供了FTS(FullTextSearch)擴(kuò)展的功能。通過在數(shù)據(jù)庫(kù)中創(chuàng)建虛擬表存儲(chǔ)全文索引,用戶可以使用MATCH'keyword'查詢而非LIKE'%keyword%'子串匹配的方式執(zhí)行搜索,充分利用索引可使速度得到極大提升。如果讀者對(duì)搜索引擎原理有初步的了解,則知道在實(shí)現(xiàn)全文檢索中對(duì)原始內(nèi)容的分詞是必須的。
自定義分詞器需要實(shí)現(xiàn)幾個(gè)回調(diào)函數(shù)(關(guān)于回調(diào)函數(shù)的知識(shí)請(qǐng)參看上一小節(jié)有關(guān)內(nèi)容),其對(duì)應(yīng)的生命周期如下:①xClose銷毀分詞游標(biāo);②xNext獲取下一個(gè)分詞結(jié)果;③xCreate初始化分詞器;④xDestroy銷毀分詞器;⑤xOpen初始化分詞游標(biāo)。
分詞器的具體實(shí)現(xiàn)可以參考simple_tokenizer(非官方SQLite倉(cāng)庫(kù))的例子。完成分詞器的配置初始化之后,即可通過創(chuàng)建虛擬表的方式為數(shù)據(jù)庫(kù)建立全文索引,并使用MATCH語(yǔ)句執(zhí)行更高效的檢索。由于搜索功能的具體細(xì)節(jié)與本文要討論的內(nèi)容沒有太大關(guān)系,在此不做贅述。
12.2.2
危險(xiǎn)的fts3_tokenizer
SQLite3中注冊(cè)自定義分詞器用到的函數(shù)是fts3_tokenizer,實(shí)現(xiàn)代碼是ext/fts3/fts3_
tokenizer.c的scalarFunc函數(shù)。支持以下兩種調(diào)用方式:
selectfts3_tokenizer(<tokenizer_name>);
selectfts3_tokenizer(<tokenizer_name>,<sqlite3_tokenizer_moduleptr>);
攻擊者僅需要構(gòu)造一個(gè)合適的結(jié)構(gòu)體并獲取其內(nèi)存地址,使用SQL注入(關(guān)于SQL注入請(qǐng)參看上一小節(jié)有關(guān)內(nèi)容)等手段讓目標(biāo)注冊(cè)構(gòu)造好“分詞器”,再通過SQL觸發(fā)特殊回調(diào)就可以實(shí)現(xiàn)對(duì)IP寄存器進(jìn)行劫持,以此執(zhí)行任意代碼。接下來進(jìn)一步分析這個(gè)攻擊面是否可以被利用。
1.基地址泄露
如果name是已經(jīng)注冊(cè)過的分詞器,只提供參數(shù)執(zhí)行selectfts3_tokenizer(name),將會(huì)返回該分詞器對(duì)應(yīng)的內(nèi)存地址。在fts3.c中可以看到SQLite3默認(rèn)注冊(cè)了內(nèi)置分詞器simple和porter:
if(sqlite3Fts2HashInsert(pHash,"simple",7,(void*)pSimple)
||sqlite3Fts2HashInsert(pHash,"porter",7,(void*)pPorter)
獲得指針后,即可通過簡(jiǎn)單計(jì)算獲得libsqlite3.so的基地址,從而繞過ASLR(關(guān)于ASLR的基本知識(shí)請(qǐng)參看上一小節(jié)),如圖12-2所示。
圖12-2獲得libsqlite3.so的基地址
2.任意代碼運(yùn)行
通過觸發(fā)xCreate回調(diào)可執(zhí)行任意代碼。運(yùn)行64位的SQLite3控制臺(tái),輸入如下查詢語(yǔ)句即可導(dǎo)致段錯(cuò)誤:
新的問題是程序并非直接跳轉(zhuǎn)到傳入的地址,而是在該地址上獲取一個(gè)結(jié)構(gòu)體的成員。要實(shí)現(xiàn)可控的跳轉(zhuǎn),需要可以寫入指針的地址。既然已有l(wèi)ibsqlite的基地址泄露,那么可以通過PRAGMA語(yǔ)句實(shí)現(xiàn)純SQL向其?.bss段寫入。使用此語(yǔ)句可以在數(shù)據(jù)庫(kù)打開的過程中修改全局的狀態(tài),以及訪問數(shù)據(jù)庫(kù)元數(shù)據(jù)等。
3.
PoC
通過以上分析,該攻擊面可以通過如下方式觸發(fā):
(1)通過SQL注入泄漏libsqlite3的地址,注意結(jié)果是大端序。
(2)通過selectsqlite_version()函數(shù)泄漏版本,針對(duì)具體版本調(diào)整偏移量。
(3)執(zhí)行PRAGMAsoft_heap_limit語(yǔ)句布置需要call的目標(biāo)指令地址。
(4)將libsqlite3的.bss段中的結(jié)構(gòu)體地址轉(zhuǎn)成大端序的blob,然后注冊(cè)分詞器。
(5)創(chuàng)建虛擬表,觸發(fā)xCreate回調(diào),執(zhí)行代碼。
12.2.3多種場(chǎng)景下攻擊分析
利用以上知識(shí)可以在下列場(chǎng)景下進(jìn)行相應(yīng)攻擊。
1.
SQL注入Web應(yīng)用遠(yuǎn)程執(zhí)行代碼
使用union或盲注可泄露libsqlite3的基地址。在使用mod_PHP方式執(zhí)行PHP的服務(wù)器上,得到的地址可在多次請(qǐng)求中保持不變。通過計(jì)算可用的地址,可觸發(fā)代碼執(zhí)行。因?yàn)镻HP的SQLite3擴(kuò)展中的exec方法支持使用分號(hào)分隔多個(gè)語(yǔ)句,因此可以使用注入的方式觸發(fā)任意代碼執(zhí)行。
2.繞過PHP安全配置執(zhí)行任意命令
就PHP而言,可利用任意代碼執(zhí)行來繞過php.ini的open_basedir和disable_functions配置,以進(jìn)一步提權(quán)。
劫持IP寄存器的POC已經(jīng)給出,可獲得一次call任意地址的機(jī)會(huì)。但是只能執(zhí)行一次任意代碼,也沒有合適的棧遷移指令來實(shí)現(xiàn)rop,實(shí)現(xiàn)系統(tǒng)shell還需要解決一些問題。在調(diào)用xCreate的上下文中存在多個(gè)可控參數(shù),但單純靠libsqlite3找不到合適的gadget進(jìn)行組合利用。在exploit中采用了迂回做法,使用另一處xOpen回調(diào)和PHP中一處調(diào)用了popen的gadget來實(shí)現(xiàn)任意命令執(zhí)行。
為了讓xCreate正常返回,可將其設(shè)置為simple分詞器自帶的simpleCreate函數(shù)指針。但PRAGMA語(yǔ)句只能修改一個(gè)指針,而現(xiàn)在需要至少三個(gè)連續(xù)的QWORD可控。這可以通過堆噴射的方式實(shí)現(xiàn),也可以再次尋找可以修改的.bss段。
在源代碼中搜索宏STD_PHP_INI_ENTRY,找到訪問標(biāo)記PHP_INI_SYSTEM或者PHP_INI_ALL,用OnUpdateLong可獲取數(shù)值的配置。在32位系統(tǒng)上可以使用OnUpdateBool的選項(xiàng),或直接調(diào)用assert_options函數(shù)直接修改assert模塊中連續(xù)的一塊內(nèi)容。滿足要求的選項(xiàng)不少,如可以使用mysqlnd的net_cmd_buffer_size和log_mask。
3.
AndroidContentProvider
經(jīng)過測(cè)試發(fā)現(xiàn),無(wú)論是SQLiteDatabase的executeSQL方法還是query方法,都不支持使用分號(hào)分隔一次執(zhí)行多個(gè)語(yǔ)句。然而觸發(fā)的關(guān)鍵語(yǔ)句(如“創(chuàng)建虛擬表”等)都不能通過子查詢進(jìn)行構(gòu)造,因此從ContentProvider的注入點(diǎn)上只能實(shí)現(xiàn)注冊(cè),而不能觸發(fā)回調(diào)也不能使用PRAGMA。由于每個(gè)App都由Zygotefork而來,只需要讀取自身進(jìn)程的maps就可以得到其他進(jìn)程的內(nèi)存布局。
4.
Webkit上的WebSQL
Webkit提供WebSQL數(shù)據(jù)庫(kù),可在瀏覽器內(nèi)創(chuàng)建供客戶端使用的關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)。雖然沒有被HTML
5標(biāo)準(zhǔn)采納,但該功能被保留了下來。在支持WebSQL的瀏覽器中,先使用window.openDatabase方法打開一個(gè)數(shù)據(jù)庫(kù)實(shí)例,再使用數(shù)據(jù)庫(kù)實(shí)例的transaction方法創(chuàng)建一個(gè)事務(wù),便可以通過事務(wù)對(duì)象執(zhí)行SQL查詢。
5.緩解和修補(bǔ)
濫用某些特性可能導(dǎo)致應(yīng)用程序產(chǎn)生攻擊面,禁用某些特性可以起到緩解的效果。以上提到的AOSP、WebKit等開源項(xiàng)目對(duì)此設(shè)計(jì)了下列不同的緩解方案,具有很重要的參考價(jià)值。
(1)如果用不到全文檢索,可通過關(guān)閉SQLITE_ENABLE_FTS3/SQLITE_EN-ABLE_
FTS4/SQLITE_ENABLE_FTS5選項(xiàng)禁用之,或者使用Amalgamation版本編譯。
(2)如果需要使用MATCH檢索,但無(wú)需支持多國(guó)語(yǔ)言(即內(nèi)置分詞器可以滿足要求),則在ext/fts3/fts3.c中注釋如下代碼關(guān)閉此函數(shù),具體代碼如下:
&&SQLITE_OK==(rc=sqlite3Fts3InitHashTable(db,pHash,"fts3_tokenizer"))
(3)使用SQLite3的AuthorizationCallbacks設(shè)置訪問控制。
12.3利用SQLiteload_extension進(jìn)行攻擊
SQLite從3.3.6版本開始提供支持?jǐn)U展功能,通過SQLiteload_extensionAPI(或者load_extensionSQL語(yǔ)句),開發(fā)者可以在不改動(dòng)SQLite源碼的情況下,通過動(dòng)態(tài)加載的庫(kù)(so/dll/dylib)來擴(kuò)展SQLite的功能,如圖12-3所示。圖12-3
SQLiteLoadAnExtension接口
便利的功能總是最先被黑客利用來實(shí)施攻擊。借助SQLite動(dòng)態(tài)加載的特性,僅需要在可以預(yù)測(cè)的存儲(chǔ)路徑中預(yù)先放置一個(gè)覆蓋SQLite擴(kuò)展規(guī)范的動(dòng)態(tài)庫(kù)(Android平臺(tái)的so庫(kù)),通過SQL注入漏洞調(diào)用load_extension,即可很輕松地激活庫(kù)中的代碼,直接形成遠(yuǎn)程代碼執(zhí)行漏洞。國(guó)外黑客早就提出使用load_extension和SQL注入漏洞來進(jìn)行遠(yuǎn)程代碼執(zhí)行攻擊的方法,如圖12-4所示。
圖12-4
load_extension結(jié)合SQL實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行攻擊
SQLite官方(/cgi/src/info/4692319ccf28b0eb)在代碼中將load_extension的功能設(shè)置為“默認(rèn)關(guān)閉”,需要在代碼中通過sqlite3_enable_load_extensionAPI顯式打開后方可使用,因此API無(wú)法在SQL語(yǔ)句中調(diào)用,斷絕了利用SQL注入打開的可能性,如圖12-5所示。
圖12-5
SQLite官方發(fā)布的load_extension有關(guān)聲明
1.?Android平臺(tái)下的SQLiteload_extension支持
出于功能和優(yōu)化的目的,Google從Android4.1.2開始通過預(yù)編譯宏SQLITE_OMIT_LOAD_EXTENSION,從代碼上直接移除了SQLite動(dòng)態(tài)加載擴(kuò)展的功能,如圖12-6所示。
圖12-6預(yù)編譯宏SQLITE_OMIT_LOAD_EXTENSION
可通過adbshell來判斷Android系統(tǒng)是否默認(rèn)支持load_extension,Android?4.0.3以下版本中sqlite3的.help命令如圖12-7所示。
2.?Android平臺(tái)下的SQLiteextension模塊編譯
SQLiteextension必須包含sqlite3ext.h頭文件,實(shí)現(xiàn)一個(gè)sqlite3_extension_init入口。圖12-8所示為一個(gè)SQLiteextension的基本框架。
圖12-8
SQLiteextension的基本框架
圖12-9所示為Android.mk文件。
圖12-9
Android.mk文件
可以利用SQLiteextension的基本框架實(shí)現(xiàn)加載時(shí)打印log輸出的SQLiteextension,如圖12-10所示。
圖12-10在
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024甲乙雙方關(guān)于2024年度小麥?zhǔn)召?gòu)的居間合同
- 多媒體技術(shù)及應(yīng)用知到智慧樹章節(jié)測(cè)試課后答案2024年秋海南師范大學(xué)
- 河道水毀清理維護(hù)施工合同
- 咖啡店臨時(shí)服務(wù)員合同模板
- 2025年度二零二五木坑果場(chǎng)承包經(jīng)營(yíng)與農(nóng)業(yè)信息化建設(shè)合同3篇
- 海邊度假別墅海濱住宿協(xié)議
- 設(shè)立分公司信息共享協(xié)議
- 美容院健身教練合同模板
- 2024鐵路物流倉(cāng)儲(chǔ)配送合同范本3篇
- 2024正規(guī)餐飲企業(yè)員工勞動(dòng)合同范本與食品安全管理協(xié)議3篇
- 人教版數(shù)學(xué)四年級(jí)下冊(cè)核心素養(yǎng)目標(biāo)全冊(cè)教學(xué)設(shè)計(jì)
- 2024年成都市錦江投資發(fā)展集團(tuán)有限責(zé)任公司招聘筆試參考題庫(kù)含答案解析
- GB/T 43701-2024滑雪場(chǎng)地滑雪道安全防護(hù)規(guī)范
- 全市農(nóng)業(yè)行政執(zhí)法人員上崗培訓(xùn)班
- 小學(xué)音樂一年級(jí)下冊(cè)放牛歌音樂教案
- 山東省濟(jì)南市2023-2024學(xué)年高一上學(xué)期1月期末考試數(shù)學(xué)試題(解析版)
- 手術(shù)室搶救工作制度
- 施工圖設(shè)計(jì)師的年終報(bào)告
- 鋼閘門監(jiān)理評(píng)估報(bào)告
- 高檔養(yǎng)老社區(qū)項(xiàng)目計(jì)劃書
- 京東物流信息系統(tǒng)
評(píng)論
0/150
提交評(píng)論