環境部署
phpstudy、DVWA、SQLI-LABS(學習sql注入平臺)、upload-labs、課程源碼環境web
SQL注入原理
SQL 注入就是指 web 應用程序對用戶輸入的數據合法性沒有過濾或者是判斷,前端傳入的 參數是攻擊者可以控制,並且參數帶入數據庫的查詢,攻擊者可以通過構造惡意的 sql 語句來 實現對數據庫的任意操作。
舉例說明:
_GET[‘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
第七步:爆數據值