一、漏洞环境
二、漏洞入口
一个不需要认证的系统更新界面,至少是可以文件上传:
看一下官方的更新补丁包长啥样:
好嘛,直接是可以执行脚本了。
三、漏洞分析
可以看出upgradeServlet类控制了更新的执行。
执行start脚本的时候加上-d参数可以打开jvm的debug模式。
向/upgradeDone.do发送post包,调试时在这个地方抛出空指针,调试发现是由于这个“request.user”变量为空。
追溯request.user的来源,发现可以通过Header里的“Authorization”字段获得,格式为“Authorization: Basic [username:password].base64”,我们完全可以自己构造一个Authorization来让程序获取到username。
调试跟进发现程序在对补丁包进行验证,然后执行补丁包内容。
先跟进验证部分,先是按行读取补丁包,检查补丁包是否存在脚本结束标记“### END OF SCRIPT”。
然后对文件进行hash校验,比较补丁包的hash值与补丁包结束标记“### END OF SCRIPT”后的值进行比对。
通过调试,可以看到hash校验使用了“HmacSHA256”和“HmacSHA1”两种算法分别对补丁包的脚本部分和整个补丁包进行hash计算,并用计算结果与补丁包中结束标记后的值进行比较,只要有一个值与之相同则校验通过。
四、漏洞复现
复写hsash算法,写好补丁包脚本,然后在脚本后添加hash校验值。
向/upgradeDone.do发送post请求
最终成功REC!