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()函数中,如图:

e2b341bb53fc2d6369c9bcbf5cf5ec7e.png

由上图中可见,tok安全校验就是把$media、$width(不传递值为空)和$height(不传递值为空)三个变量在media_get_token()函数中计算一下,然后把结算结果和tok参数比对,只有比对一致才能通过校验,继续看media_get_token()函数,如图:

0a527efe447aba2871dbb3c26f6ff5dc.png

由上图中可见,media_get_token()函数把width和token变量)返回。继续看auth_cookiesalt()函数,如图:

3be487639920c7de2072f4b60119ba63.png

由上图中可见,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文件返回:

9fb784c7940a5707899f07249e02c962.png

设置Cookie参数niubl值为http://192.168.141.128:80/test.php?test.jpg ,再次请求:

4c7b18afeec221e2e2b2c75e1089d3ae.png

由上图中可见,php发现Cookie参数niubl值中含有非法字符,但是php并没有重新生成session_id,导致传入的非法字符仍然可用,被var_dump()函数打印了出来。

auth_cookiesalt()函数使用session_id()函数生成salt,现在session_id()函数外部可控,且可以接收非法字符串,那么我们找一出使用依赖auth_cookiesalt()函数生成数值的代码,就可以推测_htcookiesalt2了。

3fb6e3aa3123a5cc722318e6f91354cc.png

上图中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中,测试:

da8668ea049ab783cd6545d79e5fe992.png

上图中,传递Cookie参数DokuWiki值http://192.168.141.128:80/test.php?test.jpg ,生成sectok值0f35dfabdb3fb00c4de06facec6c2d43 ,他的前6位0f35df就是我们进行SSRF攻击时需要校验的tok值,验证:

ba6d062fb52f42fe92510dd8e629215c.png

4efa64a3efd70878ccc20860b002a9a1.png

漏洞修复

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值