SQL漏洞注入(附實戰練習)

環境部署

phpstudy、DVWA、SQLI-LABS(學習sql注入平臺)、upload-labs、課程源碼環境web

SQL注入原理

SQL 注入就是指 web 應用程序對用戶輸入的數據合法性沒有過濾或者是判斷,前端傳入的 參數是攻擊者可以控制,並且參數帶入數據庫的查詢,攻擊者可以通過構造惡意的 sql 語句來 實現對數據庫的任意操作。

舉例說明:

id=id=_GET[‘id’]

sql=SELECTFROMusersWHEREid=sql=SELECT * FROM users WHERE id=id LIMIT 0,1

Mysql與SQL注入相關的知識

1.information_schema

a) 在 MySQL5.0 版本後,MySQL 默認在數據庫中存放一個“information_schema”的 數據庫,在該庫中,我們需要記住三個表名,分別是 schemata,tables,columns。

b) Schemata 表存儲的是該用戶創建的所有數據庫的庫名,需要記住該表中記錄數據 庫名的字段名爲 schema_name。

c) Tables 表存儲該用戶創建的所有數據庫的庫名和表名,要記住該表中記錄數據庫 庫名和表名的字段分別是 table_schema 和 table_name.

d) Columns 表存儲該用戶創建的所有數據庫的庫名、表名、字段名,要記住該表中 記錄數據庫庫名、表名、字段名爲 table_schema、table_name、columns_name。

2.數據庫的結構

a) 數據庫(database):按照數據結構來組織、存儲和管理數據的倉庫多個數據表 的集 l

b) 數據表(table):以矩陣方式存儲數據,在操作界面中以表格形式展現; l

c) 列(column): 具有相同數據類型的數據的集合; l

d) 行(row): 每一行用來描述某條記錄的具體信息; l

e) 值(value): 行的具體信息, 每個值必須與該列的數據類型相同; l

f) 表頭(header): 每一列的名稱; l

g) 鍵(key): 鍵的值在當前列中具有唯一性。

在這裏插入圖片描述

3.數據庫查詢語句

a) 數據庫查詢語句如下:

想要查詢的值 A= select 所屬字段名 A from 所屬表名 where 對應字段名 B=值 B

4.Limit 的用法

Limit 的使用格式是 limit m,n,其中 m 指的是記錄開始的位置,從 m=0 開始,表示第一條記錄;

n 是指取幾條記錄。

5.需要記住的幾個函數

a) Version();當前 mysql 的版本

b) Database();當前網站使用的數據庫

c) User();當前 MySQL 的用戶

6.註釋符號

三種註釋符號:

i. 1.#

ii. 2.–空格 空格可以使用+代替 (url 編碼%23 表示註釋)

iii. 3. //

SQL注入的探測方法

1.SQL 注入漏洞攻擊流程

在這裏插入圖片描述

2.SQL 注入漏洞探測方法

一般來說,SQL 注入一般存在於形如:http://xxx.xxx.xxx/abc.asp?id=XX 等帶有參數的 ASP 動態網頁中,有時一個動態網頁中可能只有一個參數,有時可能有 N 個參數,有時是整型 參數,有時是字符串型參數,不能一概而論。總之只要是帶有參數的動態網頁並且該網頁訪問 了數據庫,那麼就有可能存在 SQL 注入。如果 ASP 程序員沒有安全意識,沒有進行必要的字符 過濾,存在 SQL 注入的可能性就非常大。

在探測過程中,需要分析服務器返回的詳細錯誤信息。在默認情況下,瀏覽器僅顯示“HTTP 500 服務器錯誤”,並不顯示詳細的錯誤信息。因此,需要調整瀏覽器的配置。在 IE 瀏覽器中 選擇“工具”→“Internet 選項”命令,彈出“Internet 選項”對話框,選擇“高級”選項卡,把“顯示友好 HTTP 錯誤信息”前面的勾去掉。

3.注入類型判斷

爲了把問題說明清楚,以下以 http://xxx.xxx.xxx/abc.asp?ip=YY 爲例進行分析,YY 可 能是整型,也有可能是字符串。

A.整型參數的判斷

當輸入的參數 YY 爲整型時,通常 abc.asp 中 SQL 語句大致如下:

select * from 表名 where 字段=YY

所以可以用以下步驟測試 SQL 注入是否存在。

(1)在 URL 鏈接中附加一個單引號,即 http://xxx.xxx.xxx/abc.asp?p=YY’,此時 abc.ASP 中的 SQL 語句變成了

select * from 表名 where 字段=YY’。

測試結果爲 abc.asp 運行異常;

(2)在 URL 鏈接中附加字符串“and 1=1”即 http://xxx.xxx.xxx/abc.asp?p=YY and 1=1。

測試結果爲 abc.asp 運行正常,而且與 http://xxx.xxx.xxx/abc.asp?p=YY 運行結果相同;

(3)在 URL 鏈接中附加字符串“and 1=2”即 http://xxx.xxx.xxx/abc.asp?p=YY and 1=2。

測試結果爲 abc.asp 運行異常。

如果以上三種情況全部滿足,abc.asp 中一定存在 SQL 注入漏洞。

B.字符串型參數的判斷

當輸入的參數 YY 爲字符串時,通常 abc.asp 中 SQL 語句大致如下: select * from 表名 where 字段=‘YY’,所以可以用以下步驟測試 SQL 注入是否存在。

(1)在 URL 鏈接中附加一個單引號,即 http://xxx.xxx.xxx/abc.asp?p=YY’, 此時 abc.ASP 中的 SQL 語句變成了 select * from 表名 where 字段=YY’。

測試結果爲 abc.asp 運行異常;

(2)在 URL 鏈接中附加字符串“’and ‘1’=‘1”即

http://xxx.xxx.xxx/abc.asp?p=YY ’and ‘1’=‘1。

測試結果爲 abc.asp 運行正常,而且與 http://xxx.xxx.xxx/abc.asp?p=YY 運行結果相同;

(3)在 URL 鏈接中附加字符串“’and ‘1’=‘2”即

http://xxx.xxx.xxx/abc.asp?p=YY ’ and ‘1’=‘2。

測試結果爲 abc.asp 運行異常。

如果以上三種情況全部滿足,abc.asp 中一定存在 SQL 注入漏洞。

Union 注入攻擊及代碼分析

1.Union 聯合查詢

Union 聯合、合併:將多條查詢語句的結果合併成一個結果,union 注入攻擊爲一種手工測試。

2.Union 聯合注入思路

A:判斷是否存在注入點

http://127.0.0.1/web/sql/union.php?id=1

1’ 異常

1 and 1=1 返回結果和 id=1 一樣

1 and 1=2 異常

從而則一定存在 SQL 注入漏洞

B:order by 1-99 語句來查詢該數據表的字段數量

Id=1 order by 1-99

來判斷字段數

C:利用獲得的列數使用聯合查詢,union select 與前面的字段數一樣 找到了數據呈現的位置

http://127.0.0.1/web/sql/union.php?id=1 union select 1,2,3,4,5,6

D:根據顯示內容確定查詢語句的位置,利用 information_schema 依次進行查詢 schemata,tables,columns

E:已知庫名、表名和字段名,接下來就爆數據

下面是實戰:http://127.0.0.1/grade/query.php 進行手工注入獲取老師賬戶和密碼

第一步:判斷是否存在sql注入漏洞
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

此處正常說明爲字符型

第二步判斷數據表字段數

在這裏插入圖片描述
在這裏插入圖片描述

字段數爲1

第三步:判斷查詢輸出的位置

在這裏插入圖片描述

第四步:脫庫,爆數據庫表名 grade
在這裏插入圖片描述

第五步:爆表名admins,classes,english,networks,students,teachers

在這裏插入圖片描述
第六步:爆字段名id,name,pass

在這裏插入圖片描述
第七步:爆數據值
在這裏插入圖片描述

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