Typecho是由type和echo兩個詞合成的,來自於開發團隊的頭腦風暴。Typecho基於
PHP5開發,支持多種數據庫,是一款內核強健、擴展方便、體驗友好、運行流暢的輕量級
開源博客程序。這段時間Typecho博客系統在2017年10月份裡連續爆出了兩個高位漏洞並可
以獲取shell權限,先是SSRF漏洞可打內網,再是反序列化直接前台getshell漏洞,我們來分
析下這個Typecho 博客網站的源代碼,對漏洞進行詳解。官方人員已經對這些漏洞進行的及
時的修補並且推出了最新的版本,如果有用到這個博客源碼的公司或者個人站長,請盡快升
級到最新版本。
SSRF漏洞
受影響的版本是Typecho 1.0 (14.10.10),首先是顯示了 “源地址主機錯誤” 的報錯,經過全
局搜索發現報錯是位於 var/Widget/XmlRpc.php 的 2046 行的 pingbackPing 函數,如下圖:
局搜索發現報錯是位於 var/Widget/XmlRpc.php 的 2046 行的 pingbackPing 函數,如下圖:
調用了get的提交方法,如果失敗則返回“源地址主機錯誤”的報錯,我們跟進get方法看一下,
大致意思是調用實例化 var/Typecho/Http/Adapter/ 目錄下的Typecho_Http_Client_Adapter_
Curl和類Typecho_Http_Client_Adapter_Socket 類,分別位於Curl.php和Socket.php文件中。
大致意思是調用實例化 var/Typecho/Http/Adapter/ 目錄下的Typecho_Http_Client_Adapter_
Curl和類Typecho_Http_Client_Adapter_Socket 類,分別位於Curl.php和Socket.php文件中。
如果 Curl存在就使用Curl的 curl_setopt 函數打開資源,否則使用Socket的 fsockopen 函數打
開資源,這兩種方式都是打開資源的一種方式?eSafe白帽資安網公司是一家專注於:主機安全、
網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務提供商。
一般來說 Curl 都是存在的,所以我們繼續回到 var/Widget/XmlRpc.php 的2046行的
pingbackPing 函數,向下看:
開資源,這兩種方式都是打開資源的一種方式?eSafe白帽資安網公司是一家專注於:主機安全、
網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務提供商。
一般來說 Curl 都是存在的,所以我們繼續回到 var/Widget/XmlRpc.php 的2046行的
pingbackPing 函數,向下看:
$http->setTimeout(5)->send($source);
直接在Curl.php和Sockt.php中是找不到send函數的,send函數是在這兩個類繼承的 Typecho_
Http_Client_Adapter類中在 var/Typecho/Http/Client/Adapter.php中的第300行可以看到
send函數:
Http_Client_Adapter類中在 var/Typecho/Http/Client/Adapter.php中的第300行可以看到
send函數:
第338行,$response = $this->httpSend($url); 調用了本類的httpSend函數,轉向var/Typecho/
Http/Client/Adapter/Curl.php中第41行開始,一直到51行,都沒有對傳入的url進行檢測,
到51行後:如下圖
Http/Client/Adapter/Curl.php中第41行開始,一直到51行,都沒有對傳入的url進行檢測,
到51行後:如下圖
SSRF漏洞具體利用
我們先看一下業務的邏輯,位於 var/Widget/XmlRpc.php 的 2046 行的 pingbackPing 函數:
如果實例化類失敗,返回 '源地址主機錯誤',如果探測成功,並且返回碼為 200 則返回
'源地址不支持 PingBack ' ,如果探測成功,但返回碼不是 200 ,則返回 '源地址主機錯誤'
'源地址不支持 PingBack ' ,如果探測成功,但返回碼不是 200 ,則返回 '源地址主機錯誤'
所以我們探測端口主要就是通過返回碼 200 這個地方。eSafe白帽資安網公司是一家專注於:主機
安全、網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務
提供商。
安全、網站安全、網站安全檢測、網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務
提供商。
利用一:端口檢測
根據回顯的不同,檢測端口是否開啟
payload:
curl "https://esafe.tw.com/action/xmlrpc" -d '<methodCall><methodName>pingback.ping
</methodName><params><param><value><string>http://127.0.0.1:3333</string>
</value>
</param><param><value><string>joychou</string></value></param></params>
</methodCall>'
</methodName><params><param><value><string>http://127.0.0.1:3333</string>
</value>
</param><param><value><string>joychou</string></value></param></params>
</methodCall>'
如果端口開啟,則返回“源地址不支持PingBack”,如果端口沒有開啟,則返回 “源地址主機
錯誤”利用二:攻擊Redis,利用 Redis 默認空密碼的特性,直接打內網,一般大型網站才會用
Redis。
錯誤”利用二:攻擊Redis,利用 Redis 默認空密碼的特性,直接打內網,一般大型網站才會用
Redis。