1. 程式人生 > >linux之mysql資料庫搭建及sql注入和防禦

linux之mysql資料庫搭建及sql注入和防禦

mysql中文手冊下載地址:/data/2244392

sql注入各種姿勢:/10319657/1828167

sqlmap注入神器詳解:/10319657/1841241

資料庫分為三種基本形式 : (其實這些都是眾所周知的,只是為了知識的完整性,簡單的帶過)

關係型資料庫

層次型資料庫

網狀型資料庫

執行在Linux系統上的關係型資料庫管理系統主要產品:

企業級伺服器:OracleSybaseDB2

中小型伺服器:MySQLPostgreSQL

一、MySQL簡介和安裝

總體來說,MySQL資料庫管理系統具有以下主要特點:

①可以執行在不同平臺上,支援多使用者、多執行緒和多CPU,沒有記憶體溢位漏洞

;

②提供多種資料型別,支援ODBCSSL、支援多種語言利用MySQLAPI進行開發;

③是目前市場上現有產品中執行速度最快的資料庫系統;

④同時訪問資料庫的使用者數量不受限制;

⑤可以儲存超過50,000,000條記錄;

⑥使用者許可權設定簡單、有效。

檢視系統中是否已安裝mysql軟體,若無任何顯示錶明未安裝。

rpm -qa  *mysql*

DVD安裝光碟放入光碟機,並將光碟機掛載到/mnt目錄中。

mount  /dev/cdrom  /mnt

由於此主機既作為伺服器端又作為客戶端,這裡先安裝MySQL的客戶端安裝包,該安裝包的依賴軟體包是perl-DBIMySQL的服務端安裝包還要依賴

perl-DBD-MySQL軟體包

MySQL服務的啟動、停止、重啟和查詢啟動狀態
service  mysqld start|stop|restart|status

2.設定開機自動啟動的功能
chkconfig  --level  35  mysqld  on


3.設定MySQL資料庫root賬號的密碼
mysqladmin  -u 使用者名稱  [-h 伺服器主機名或IP地址] [-p]  password  '新口令'
 
root使用者預設的空口令,先將root使用者的密碼設定為123,再將使用者root的密碼改為456。
登入及退出MySQL環境
mysql -h 主機名或IP地址  -u 使用者名稱  -p 使用者密碼

接下來就是資料庫的知識了

二、資料庫管理

MySQL命令

功能

show  databases;

檢視伺服器中當前有哪些資料庫

use  資料庫名;

選擇所使用的資料庫

create database 資料庫名;

建立資料庫

drop database 資料庫名;

刪除指定的資料庫

mysql安裝後預設會建立三個資料庫information_schemamysqltest, 其中名為“mysql”的資料庫很重要,它裡面儲存有MYSQL的系統資訊,使用者修改密碼和新增使用者,實際上就是針對該資料庫中的有關資料表進行操作。

看到information_schema,玩過mysql的手工注入的童鞋是不是很親切了

三、資料表結構管理

MySQL命令

功能

create table 表名 (欄位設定列表);

在當前資料庫中建立資料表

show  tables;

顯示當前資料庫中有哪些資料表

describe  [資料庫名.]表名;

顯示當前或指定資料庫中指定資料表的結構(欄位)資訊

drop table [資料庫名.]表名;

drop table [資料庫名.]表名;

建立表的時候必須至少有一個列

四、記錄的檢視、插入、修改與刪除

MySQL命令

功能

insert into 表名(欄位1,欄位2,……) values(欄位1的值, 欄位2的值,……);

向資料表中插入新的記錄

update 表名 set 欄位名1=欄位值1[,欄位名2=欄位值2]  where 條件表示式;

修改、更新資料表中的記錄

select 欄位名1,欄位名2……from 表名 where 條件表示式;

從資料表中查詢符合條件的記錄

select * from 表名;

顯示當前資料庫的表中的記錄

delete from 表名 where 條件表示式;

在資料表中刪除指定的記錄

delete from 表名;

將當前資料庫表中記錄清空

向wt庫wt表中插入id列,欄位為17。

將wt庫wt表中的id列的欄位更新為117.

五、使用者與許可權管理

建立與授權使用者 grant  許可權列表 on 資料庫名.表名 to 使用者名稱@來源地址 [identified by ‘密碼’]

主要使用者許可權

select

讀取表的資料

insert

向表中插入資料

update

更新表中的資料

delete

刪除表中的資料

index

建立或刪除表的索引

create

建立新的資料庫和表

alter

修改表的結構

grant

將自己擁有的某些許可權授予其他使用者

drop

刪除現存的資料庫和表

file

在資料庫伺服器上讀取和寫入檔案

reload

重新裝載授權表

process

檢視當前執行的查詢

shutdown

停止或關閉mysql服務

all

具有全部許可權

1.增加一個名為testMySQL使用者,允許其從本地主機(MySQL資料庫所在的主機)上登入,且只能對資料庫student進行查詢,使用者密碼設定為123456

驗證該使用者能進行登入、查詢,無法做其他操作,和預想的是一樣的。

2.檢視使用者的許可權

show  grants  for  使用者名稱@域名或IP地址;

3.撤銷使用者的許可權

revoke  許可權列表  on 資料庫名.表名  from  使用者名稱@域名或IP地址;

六、資料庫的備份與恢復

(1).直接備份資料庫所在的目錄

使用cptar等命令直接備份資料庫所存放的目錄

2.使用mysqldump命令備份和恢復

mysqldump -u 使用者名稱 -p [密碼] [選項] [資料庫名] [表名] > /備份路徑/備份檔名

附:mysqldump的幾種常用方法:

1)匯出整個資料庫(包括資料庫中的資料)

mysqldump -u username -p dbname >    

2)匯出資料庫結構(不含資料)

mysqldump -u username -p -d dbname >    

3)匯出資料庫中的某張資料表(包含資料)

 mysqldump -u username -p dbname tablename >    

4)匯出資料庫中的某張資料表的表結構(不含資料)

mysqldump -u username -p -d dbname tablename >  

常用引數說明:

--all-databases——備份伺服器中的所有資料庫內容;

--opt——對備份過程進行優化,此項為預設選項

(2.)恢復(匯入)資料

mysql -u root -p [資料庫名] < /備份路徑/備份檔名

七、sql注入

SQL注入產生的原因,和棧溢位、XSS等很多其他的攻擊方法類似,就是未經檢查或者未經充分檢查的使用者輸入資料,意外變成了程式碼被執行。針對於SQL注入,則是使用者提交的資料,被資料庫系統編譯而產生了開發者預期之外的動作。也就是,SQL注入是使用者輸入的資料,在拼接SQL語句的過程中,超越了資料本身,成為了SQL語句查詢邏輯的一部分,然後這樣被拼接出來的SQL語句被資料庫執行,產生了開發者預期之外的動作。

所以從根本上防止上述型別攻擊的手段,還是避免資料變成程式碼被執行,時刻分清程式碼和資料的界限。而具體到SQL注入來說,被執行的惡意程式碼是通過資料庫的SQL解釋引擎編譯得到的,所以只要避免使用者輸入的資料被資料庫系統編譯就可以了。

現在的資料庫系統都提供SQL語句的預編譯(prepare)和查詢引數繫結功能,在SQL語句中放置佔位符'?',然後將帶有佔位符的SQL語句傳給資料庫編譯,執行的時候才將使用者輸入的資料作為執行的引數傳給使用者。這樣的操作不僅使得SQL語句在書寫的時候不再需要拼接,看起來也更直接,而且使用者輸入的資料也沒有機會被送到資料庫的SQL直譯器被編譯執行,也不會越權變成程式碼。

如何確定SQL注入漏洞

通過以上的例項,我們仍然還會有疑問:黑客並不知道我們程式程式碼的邏輯和SQL語句的寫法,他是如何確定一個網站是否存在SQL注入漏洞呢?一般說來有以下2種途徑:

1、錯誤提示

如果目標Web網站開啟了錯誤顯示,攻擊者就可以通過反覆調整發送的引數、檢視頁面列印的錯誤資訊,推測出Web網站使用的資料庫和開發語言等重要資訊。

2、盲注

除非運維人員疏忽,否則大部分的Web運營網站應該都關閉了錯誤提示資訊,此時攻擊者一般會採用盲注的技巧來進行反覆的嘗試判斷。

之前對sql手工注入和sql注入神器sqlmap做過很詳細的介紹,這裡就針對sql注入的理論做補充。詳細的sql注入姿勢請檢視前面的文章。

防禦SQL注入

對於伺服器配置層面的防範,應該保證生產環境的Webserver是關閉錯誤資訊的,比如PHP在生產環境的配置檔案中的display_errors應該設定為Off,這樣就關閉了錯誤提示,下面我們更多的從編碼的角度來看看如何防範SQL注入。

但凡有SQL注入漏洞的程式,都是因為程式要接受來自客戶端使用者輸入的變數或URL傳遞的引數,並且這個變數或引數是組成SQL語句的一部分,對於使用者輸入的內容或傳遞的引數,我們應該要時刻保持警惕,這是安全領域裡的「外部資料不可信任」的原則,縱觀Web安全領域的各種攻擊方式,大多數都是因為開發者違反了這個原則而導致的,所以自然能想到的,就是從變數的檢測、過濾、驗證下手,確保變數是開發者所預想的。

1、檢查變數資料型別和格式

如果你的SQL語句是類似where id={$id}這種形式,資料庫裡所有的id都是數字,那麼就應該在SQL被執行前,檢查確保變數idint型別;如果是接受郵箱,那就應該檢查並嚴格確保變數一定是郵箱的格式,其他的型別比如日期、時間等也是一個道理。總結起來:只要是有固定格式的變數,在SQL語句執行前,應該嚴格按照固定格式去檢查,確保變數是我們預想的格式,這樣很大程度上可以避免SQL注入攻擊。

2、過濾特殊符號

對於無法確定固定格式的變數,一定要進行特殊符號過濾或轉義處理。以PHP為例,通常是採用addslashes函式,它會在指定的預定義字元前新增反斜槓轉義,這些預定義的字元是:單引號 (') 雙引號 (") 反斜槓 (\) NULL

3、繫結變數,使用預編譯語句

MySQLmysqli驅動提供了預編譯語句的支援,不同的程式語言,都分別有使用預編譯語句的方法

4.資料庫資訊加密安全

Web開發中,傳統的加解密大致可以分為三種:

1、對稱加密:即加密方和解密方都使用相同的加密演算法和金鑰,這種方案的金鑰的儲存非常關鍵,因為演算法是公開的,而金鑰是保密的,一旦密匙洩露,黑客仍然可以輕易解密。常見的對稱加密演算法有:AESDES等。

2、非對稱加密:即使用不同的金鑰來進行加解密,金鑰被分為公鑰和私鑰,用私鑰加密的資料必須使用公鑰來解密,同樣用公鑰加密的資料必須用對應的私鑰來解密,常見的非對稱加密演算法有:RSA等。

3、不可逆加密:利用雜湊演算法使資料加密之後無法解密回原資料,這樣的雜湊演算法常用的有:md5SHA-1等。

sql防禦總結

1、不要隨意開啟生產環境中Webserver的錯誤顯示。

2、永遠不要信任來自使用者端的變數輸入,有固定格式的變數一定要嚴格檢查對應的格式,沒有固定格式的變數需要對引號等特殊字元進行必要的過濾轉義。

3、使用預編譯繫結變數的SQL語句。

4、做好資料庫帳號許可權管理。

5、嚴格加密處理使用者的機密資訊。