linux之mysql資料庫搭建及sql注入和防禦
mysql中文手冊下載地址:/data/2244392
sql注入各種姿勢:/10319657/1828167
sqlmap注入神器詳解:/10319657/1841241
資料庫分為三種基本形式 : (其實這些都是眾所周知的,只是為了知識的完整性,簡單的帶過)
關係型資料庫
層次型資料庫
網狀型資料庫
執行在Linux系統上的關係型資料庫管理系統主要產品:
企業級伺服器:Oracle、Sybase、DB2
中小型伺服器:MySQL、PostgreSQL
一、MySQL簡介和安裝
總體來說,MySQL資料庫管理系統具有以下主要特點:
①可以執行在不同平臺上,支援多使用者、多執行緒和多CPU,沒有記憶體溢位漏洞
②提供多種資料型別,支援ODBC、SSL、支援多種語言利用MySQL的API進行開發;
③是目前市場上現有產品中執行速度最快的資料庫系統;
④同時訪問資料庫的使用者數量不受限制;
⑤可以儲存超過50,000,000條記錄;
⑥使用者許可權設定簡單、有效。
檢視系統中是否已安裝mysql軟體,若無任何顯示錶明未安裝。
rpm -qa *mysql*
將DVD安裝光碟放入光碟機,並將光碟機掛載到/mnt目錄中。
mount /dev/cdrom /mnt
由於此主機既作為伺服器端又作為客戶端,這裡先安裝MySQL的客戶端安裝包,該安裝包的依賴軟體包是perl-DBI。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_schema、mysql和test, 其中名為“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.增加一個名為test的MySQL使用者,允許其從本地主機(即MySQL資料庫所在的主機)上登入,且只能對資料庫student進行查詢,使用者密碼設定為123456。
驗證該使用者能進行登入、查詢,無法做其他操作,和預想的是一樣的。
2.檢視使用者的許可權
show grants for 使用者名稱@域名或IP地址;
3.撤銷使用者的許可權
revoke 許可權列表 on 資料庫名.表名 from 使用者名稱@域名或IP地址;
六、資料庫的備份與恢復
(1).直接備份資料庫所在的目錄
使用cp、tar等命令直接備份資料庫所存放的目錄
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被執行前,檢查確保變數id是int型別;如果是接受郵箱,那就應該檢查並嚴格確保變數一定是郵箱的格式,其他的型別比如日期、時間等也是一個道理。總結起來:只要是有固定格式的變數,在SQL語句執行前,應該嚴格按照固定格式去檢查,確保變數是我們預想的格式,這樣很大程度上可以避免SQL注入攻擊。
2、過濾特殊符號
對於無法確定固定格式的變數,一定要進行特殊符號過濾或轉義處理。以PHP為例,通常是採用addslashes函式,它會在指定的預定義字元前新增反斜槓轉義,這些預定義的字元是:單引號 (') 雙引號 (") 反斜槓 (\) NULL。
3、繫結變數,使用預編譯語句
MySQL的mysqli驅動提供了預編譯語句的支援,不同的程式語言,都分別有使用預編譯語句的方法
4.資料庫資訊加密安全
在Web開發中,傳統的加解密大致可以分為三種:
1、對稱加密:即加密方和解密方都使用相同的加密演算法和金鑰,這種方案的金鑰的儲存非常關鍵,因為演算法是公開的,而金鑰是保密的,一旦密匙洩露,黑客仍然可以輕易解密。常見的對稱加密演算法有:AES、DES等。
2、非對稱加密:即使用不同的金鑰來進行加解密,金鑰被分為公鑰和私鑰,用私鑰加密的資料必須使用公鑰來解密,同樣用公鑰加密的資料必須用對應的私鑰來解密,常見的非對稱加密演算法有:RSA等。
3、不可逆加密:利用雜湊演算法使資料加密之後無法解密回原資料,這樣的雜湊演算法常用的有:md5、SHA-1等。
sql防禦總結
1、不要隨意開啟生產環境中Webserver的錯誤顯示。
2、永遠不要信任來自使用者端的變數輸入,有固定格式的變數一定要嚴格檢查對應的格式,沒有固定格式的變數需要對引號等特殊字元進行必要的過濾轉義。
3、使用預編譯繫結變數的SQL語句。
4、做好資料庫帳號許可權管理。
5、嚴格加密處理使用者的機密資訊。