DokuWiki fetch.php SSRF漏洞与tok安全验证绕过分析

### 关于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()函数中,如图: ![](http://0day5.com/usr/uploads/2017/03/3531009266.png) 由上图中可见,tok安全校验就是把$media、$width(不传递值为空)和$height(不传递值为空)三个变量在media_get_token()函数中计算一下,然后把结算结果和tok参数比对,只有比对一致才能通过校验,继续看media_get_token()函数,如图: ![](http://0day5.com/usr/uploads/2017/03/3991967328.png) 由上图中可见,media_get_token()函数把$media、$width和$height三个变量值拼接起来,再加上auth_cookiesalt()函数值,在PassHash::hmac()函数中取了md5,把md5的前6位($token变量)返回。继续看auth_cookiesalt()函数,如图: ![](http://0day5.com/usr/uploads/2017/03/2226197889.png) 由上图中可见,auth_cookiesalt()的函数值是由DokuWiki _htcookiesalt2文件存储的盐值,再拼接session_id()函数构成的。 auth_cookiesalt()函数使用session_id()函数生成salt是不安全的,在最新php版本中session_id()函数存在一个bug(低版本php不存在),构造如下代码: ```php server->str('REMOTE_USER'),$INPUT->server->str('REMOTE_USER')变量在不传递参数的时候值为空,那么我们可以通过传递session_id()为fetch.php的media参数,这时getSecurityToken()函数就生成了我们进行SSRF攻击时需要校验的tok。getSecurityToken()函数广泛用表单token中,测试: ![](http://0day5.com/usr/uploads/2017/03/3134190170.png) 上图中,传递Cookie参数DokuWiki值http://192.168.141.128:80/test.php?test.jpg ,生成sectok值0f35dfabdb3fb00c4de06facec6c2d43 ,他的前6位0f35df就是我们进行SSRF攻击时需要校验的tok值,验证: ![](http://0day5.com/usr/uploads/2017/03/3035174731.png) ![](http://0day5.com/usr/uploads/2017/03/275505784.png) ### 漏洞修复 php的bug( https://bugs.php.net/bug.php?id=73860 )已经反馈给php官方开发团队,开发人员认为这个bug导致的漏洞是因为webapp使用了sessiond_id 生成salt,依赖session_id生成salt是不合理的,目前该bug仍未被确认

发表评论