ssrf漏洞 php,DokuWiki fetch.php SSRF漏洞与tok安全验证绕过分析
作者:baolongniu of Tencent Security Platform Department
關于DokuWiki
DokuWiki是一個開源wiki引擎程序,運行于PHP環境下。DokuWiki程序小巧而功能強大、靈活,適合中小團隊和個人網站知識庫的管理。
漏洞簡介
DokuWiki最新 2016-06-26a版本存在一個SSRF漏洞,當DokuWiki fetch.php允許下載外部資源時(fetchsize不為零),外部攻擊者可以通過猜解tok繞過安全驗證,請求服務器內網資源。
漏洞分析
DokuWiki fetch.php文件允許下載外部文件,外部文件地址傳遞給參數media,但是在請求時候有tok安全校驗,請求如下:
/dokuwiki/lib/exe/fetch.php?media=http://192.168.141.128:80/test.php?test.jpg&tok=0f35df
安全校驗在checkFileStatus()函數中,如圖:
由上圖中可見,tok安全校驗就是把$media、$width(不傳遞值為空)和$height(不傳遞值為空)三個變量在media_get_token()函數中計算一下,然后把結算結果和tok參數比對,只有比對一致才能通過校驗,繼續看media_get_token()函數,如圖:
由上圖中可見,media_get_token()函數把width和token變量)返回。繼續看auth_cookiesalt()函數,如圖:
由上圖中可見,auth_cookiesalt()的函數值是由DokuWiki _htcookiesalt2文件存儲的鹽值,再拼接session_id()函數構成的。
auth_cookiesalt()函數使用session_id()函數生成salt是不安全的,在最新php版本中session_id()函數存在一個bug(低版本php不存在),構造如下代碼:
session_name("niubl");
session_start();
var_dump(session_id());
直接請求test.php文件返回:
設置Cookie參數niubl值為http://192.168.141.128:80/test.php?test.jpg ,再次請求:
由上圖中可見,php發現Cookie參數niubl值中含有非法字符,但是php并沒有重新生成session_id,導致傳入的非法字符仍然可用,被var_dump()函數打印了出來。
auth_cookiesalt()函數使用session_id()函數生成salt,現在session_id()函數外部可控,且可以接收非法字符串,那么我們找一出使用依賴auth_cookiesalt()函數生成數值的代碼,就可以推測_htcookiesalt2了。
上圖中getSecurityToken()是用來產生CSRF token的函數,CSRF token廣泛出現在表單中,他的實現和media_get_token()函數類似,只是PassHash::hmac()函數第二個參數換成了session_id()加$INPUT->server->str('REMOTE_USER'),$INPUT->server->str('REMOTE_USER')變量在不傳遞參數的時候值為空,那么我們可以通過傳遞session_id()為fetch.php的media參數,這時getSecurityToken()函數就生成了我們進行SSRF攻擊時需要校驗的tok。getSecurityToken()函數廣泛用表單token中,測試:
上圖中,傳遞Cookie參數DokuWiki值http://192.168.141.128:80/test.php?test.jpg ,生成sectok值0f35dfabdb3fb00c4de06facec6c2d43 ,他的前6位0f35df就是我們進行SSRF攻擊時需要校驗的tok值,驗證:
漏洞修復
php的bug( https://bugs.php.net/bug.php?id=73860 )已經反饋給php官方開發團隊,開發人員認為這個bug導致的漏洞是因為webapp使用了sessiond_id 生成salt,依賴session_id生成salt是不合理的,目前該bug仍未被確認。
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:https://paper.seebug.org/230/
總結
以上是生活随笔為你收集整理的ssrf漏洞 php,DokuWiki fetch.php SSRF漏洞与tok安全验证绕过分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 29-计算器
- 下一篇: python中的画布背景设置_教你用py