共計 1657 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關 Mysql 注入中 outfile、dumpfile、load_file 函數的示例分析,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在利用 sql 注入漏洞后期,最常用的就是通過 mysql 的 file 系列函數來進行讀取敏感文件或者寫入 webshell,其中比較常用的函數有以下三個
into dumpfile()
into outfile()
load_file()
我們本次的測試數據如下
讀寫文件函數調用的限制
因為涉及到在服務器上寫入文件,所以上述函數能否成功執行受到參數 secure_file_priv 的影響。官方文檔中的描述如下
翻譯一下就是
其中當參數 secure_file_priv 為空時,對導入導出無限制
當值為一個指定的目錄時,只能向指定的目錄導入導出
當值被設置為 NULL 時,禁止導入導出功能
這個值可以通過命令 select @@secure_file_priv 查詢。由于這個參數不能動態更改,只能在 mysql 的配置文件中進行修改,然后重啟生效。
dumpfile 與 outfile 的區別
導出數據庫場景下的差異
select …… into outfile
我們先來看一下 mysql 官方文檔里對于這兩個函數的解釋
其中有兩個值得注意的坑點
outfile 函數可以導出多行,而 dumpfile 只能導出一行數據
outfile 函數在將數據寫到文件里時有特殊的格式轉換,而 dumpfile 則保持原數據格式
我們接下來通過導出測試看看這里面的細節
首先通過命令 select * from test into outfile /tmp/test.txt 來使用 outfile 導出
可以看到文件 /tmp/test.txt 文件中保存了所有的數據并且在一行數據的末尾自動換行
通過查看官方文檔,可以看出使用如下參數可以進行格式調整
其中 FIELDS ESCAPED BY 可以用來對指定的字符進行轉義,FIELDS [OPTIONALLY] ENCLOSED BY 用來對字段值進行包裹, FIELDS TERMINATED BY 用來對字段值之間進行分割
例如使用如下命令 select * from test into outfile /tmp/test.txt FIELDS TERMINATED BY , OPTIONALLY ENCLOSED BY LINES TERMINATED BY \n
得到的導出文件如下
select …… into dumpfile
而接著使用命令 select * from test into dumpfile /tmp/test.txt 使用 dumpfile 進行導出
可以看到此命令在執行的時候提示輸出超過一行
查看文件內容
可以看見通過 dumpfile 導出的數據行數據之間并未進行換行且只導出了部分數據
寫入 webshell 或者 udf 下的差異
select …… into outfile
我們使用命令 select a\naa\raaaa into outfile /tmp/test.txt 來看一下在常用的寫文件場景下的結果
可以看到 outfile 對導出內容中的 \n 等特殊字符進行了轉義,并且在文件內容的末尾增加了一個新行
我們接著使用命令 select a\naa\raaaa into dumpfile /tmp/test.txt 來看一下
可以看到 dumpfile 對文件內容是原意寫入,未做任何轉移和增加。這也就是為什么 我們在平常的 UDF 提權中使用 dumpfile 進行 dll 文件 寫入的原因
還有一個需要關注的點就是:outfile 后面不能接 0x 開頭或者 char 轉換以后的路徑,只能是單引號路徑。這個問題在 php 注入中更加麻煩,因為會自動將單引號轉義成 \ , 那么基本就 GG 了,但是 load_file,后面的路徑可以是單引號、0x、char 轉換的字符,但是路徑中的斜杠是 / 而不是 \
關于“Mysql 注入中 outfile、dumpfile、load_file 函數的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。