#1 哈希长度扩展攻击
##1.1 简介
哈希长度扩张攻击(hash length attack)是一类针对某些哈希函数可以额外添加一些信息的攻击手段,适用于已经确定哈希值和密钥长度的情况。哈希值基本表示如下H(密钥||消息),即知道了哈希值和密钥的长度,可以推出H(密钥||消息||padding||append)的哈希值,padding是要填充的字段,append则是要附加的消息。其实如果不知道密钥长度,可通过暴力猜解得到,已知的有长度扩展攻击缺陷的函数有MD5,SHA-1,SHA-256等等,详细的攻击原理可参考Everything you need to know about hash length extension attacks
##1.2 利用
这里推荐有python扩展的HashPump,HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。而MD2、SHA224和SHA384算法不受此攻击的影响,因其部分避免了对状态变量的输出,并不输出全部的状态变量。
安装:pip install hashpumpy
-s参数对应的就是H(密钥||消息)中的哈希值,-d参数对应着消息,-k参数对应着密钥的长度,-a则是要附加的消息。
最后提供一个哈希扩展攻击在线工具:http://sakurity.com/lengthextension,需要注意的长度是密钥+消息的总长度,详情见图:![此处输入图片的描述][2]
#2 phpwind利用点分析
phpwind会在每次请求的时候校验密钥,具体的对应函数如下:
在这个函数中会提取windidkey,并且和WindidUtility::appKey
生成的结果做对比,不同则退出,如过相同继续判断时间是否超时,超时也退出,appKey的实现如下:
在函数中md5(md5($apiId.'||'.$secretkey).$time.$str)
的值是知道的,即windidkey,这个值在用户上传头像处泄露,md5($apiId.'||'.$secretkey)
的长度是知道的,32bit,$time.$str
参数是用户可控的,那么就满足了哈希扩展长度攻击,下面我们看下用户上传头像处的请求,右键查看源代码找到如下请求:
接着看实际构造的appKey的参数效果,这个可以根据trace的结果直接给出,具体如下:
md5($apiId.'||'.$secretkey)
的值为520a1e355b8cfc82e56ae578176d7f10
,$time
为1465977216
,$str
为adoAvatarcavatarmapitypeflashuid2uidundefined
,从appKey函数的实现来看,$str就是get,post请求进行取舍排序得到的。有了这个基础,根据hashpump公式,在post请求中加入我们的参数,并计算出合适的windidkey值,提交请求,就可达到目的。
#3 利用POC
可利用如下的代码构造post请求,修改某uid用户的密码。如果修改的是管理员的密码,并且这管理员有相应的后台权限,那么我们就可以在后台getshell,利用脚本如下:
运行之后得到
代码中修改uid为3的账户的密码为GongFang7,假设该用户具有后台管理员权限,进入后台getshell,具体的getshell可参考http://www.wooyun.org/bugs/wooyun-2016-0175518