MySQL中關於SQL注入的相關須要的基礎知識

零、緒論:mysql

  文章部分整理來源於公司同事,特此鳴謝!!!sql

1、關於注入點在KEY上的注入:數據庫

咱們來看一個查詢,你的第一個字段是過濾器(filter)第二個字段是查詢的關鍵字,例如查詢ip == 1.2.3.4 ,你選擇查詢的類型是IP 內容是1.2.3.4服務器

此時SQL語句有兩種辦法拼接:dom

 1 #1
 2 sql = "select * from asset where type='ip' and value='1.2.3.4';"
 3 '''
 4 表結構應該是這樣  5 id type value  6 1 domain baidu.com  7 2 ip 1.2.3.4  8 '''
 9 #2
10 sql = "select * from asset where ip='1.2.3.4';"
11 '''
12 表結構應該這樣 13 id ip state 14 1 1.2.3.4 up 15 2 1.2.3.1 down 16 '''

相似於第二種,若是ip這個地方是能夠控制的,那麼也有可能存在注入:(備註通常這麼寫SQL的不多,可是也備不住有這麼設計的不是!)函數

相似這種注入的SQL拼接就和之前通常注入點在value上有所不一樣;spa

這種拼接時候要注意拼接時候閉合後面的內容 例如原URL是http://www.ipcheck.com/ipcheckindex?key=ip&value=1.2.3.4操作系統

那麼如今能夠以下http://www.ipcheck.com/ipcheckindex?key=ip%20=‘1.2.3.4’ union select ...#&value=1.2.3.4設計

2、MySQL的函數code

一、系統信息函數:

1. version()——MySQL版本

2. user()——數據庫用戶名

3. database()——數據庫名

4. @@datadir——數據庫路徑

5. @@version_compile_os——操做系統版本

二、字符串鏈接函數

concat(str1,str2,...)——沒有分隔符地鏈接字符串

concat_ws(separator,str1,str2,...)——含有分隔符地鏈接字符串

group_concat(str1,str2,...)——鏈接一個組的全部字符串,並以逗號分隔每一條數據

3、union select 和 union all select用法(引用源自:陳徵)

SQL UNION 語法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
註釋:默認地,UNION 操做符選取不一樣的值。若是容許重複的值,請使用 UNION ALL。
SQL UNION ALL 語法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 結果集中的列名老是等於 UNION 中第一個 SELECT 語句中的列名。

一、union

二、union all

4、MYSQL中的information_schema(引用源自:陳徵)

在 MySQL中,把 information_schema 看做是一個數據庫,確切說是信息數據庫。其中保存着關於MySQL服務器所維護的全部其餘數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。在INFORMATION_SCHEMA中,有數個只讀表。它們其實是視圖,而不是基本表,所以,你將沒法看到與之相關的任何文件。
information_schema數據庫表說明:

SCHEMATA表:提供了當前mysql實例中全部數據庫的信息。是show databases的結果取之此表。

TABLES表:提供了關於數據庫中的表的信息(包括視圖)。詳細表述了某個表屬於哪一個schema,表類型,表引擎,建立時間等信息。是show tables from schemaname的結果取之此表。

COLUMNS表:提供了表中的列信息。詳細表述了某張表的全部列以及每一個列的信息。是show columns from schemaname.tablename的結果取之此表。

STATISTICS表:提供了關於表索引的信息。是show index from schemaname.tablename的結果取之此表。

USER_PRIVILEGES(用戶權限)表:給出了關於全程權限的信息。該信息源自mysql.user受權表。是非標準表。

SCHEMA_PRIVILEGES(方案權限)表:給出了關於方案(數據庫)權限的信息。該信息來自mysql.db受權表。是非標準表。

TABLE_PRIVILEGES(表權限)表:給出了關於表權限的信息。該信息源自mysql.tables_priv受權表。是非標準表。

COLUMN_PRIVILEGES(列權限)表:給出了關於列權限的信息。該信息源自mysql.columns_priv受權表。是非標準表。

CHARACTER_SETS(字符集)表:提供了mysql實例可用字符集的信息。是SHOW CHARACTER SET結果集取之此表。

COLLATIONS表:提供了關於各字符集的對照信息。

COLLATION_CHARACTER_SET_APPLICABILITY表:指明瞭可用於校對的字符集。這些列等效於SHOW COLLATION的前兩個顯示字段。

TABLE_CONSTRAINTS表:描述了存在約束的表。以及表的約束類型。

KEY_COLUMN_USAGE表:描述了具備約束的鍵列。

ROUTINES表:提供了關於存儲子程序(存儲程序和函數)的信息。此時,ROUTINES表不包含自定義函數(UDF)。名爲「mysql.proc name」的列指明瞭對應於INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

VIEWS表:給出了關於數據庫中的視圖的信息。須要有show views權限,不然沒法查看視圖信息。

TRIGGERS表:提供了關於觸發程序的信息。必須有super權限才能查看該表

補充關注點(引用源自:陳徵):

由MySQL的information_schema數據庫的通常注入流程:
猜解字段數
Order by , # id=0' order by 4%23
Union 聯合查詢的方式 #0' union select 1,2,3%23
猜數據庫
select schema_name from information_schema.schemata
Select schema_name from information_schema.schemata limit 0,1
Select group_concat(schema_name) from information_schema.schemata
猜某庫的數據表
select table_name from information_schema.tables where table_schema=’xxxxx’
猜某表的全部列
Select column_name from information_schema.columns where table_name=’xxxxx’
獲取某列的內容
Select *** from ****

 5、關於文件讀寫:

一、寫文件:

select 內容 into outfile '/path/filename';

二、讀文件:

select load_file(路徑)

相關文章
相關標籤/搜索