66 "net/http"
77 "net/http/httputil"
88 "path"
9+ "path/filepath"
910
1011 "github.com/projectdiscovery/gologger"
1112)
@@ -24,13 +25,54 @@ func (t *HTTPServer) loglayer(handler http.Handler) http.Handler {
2425
2526 // Handles file write if enabled
2627 if EnableUpload && r .Method == http .MethodPut {
27- data , err := ioutil .ReadAll (r .Body )
28+ // sandbox - calcolate absolute path
29+ if t .options .Sandbox {
30+ absPath , err := filepath .Abs (filepath .Join (t .options .Folder , r .URL .Path ))
31+ if err != nil {
32+ gologger .Print ().Msgf ("%s\n " , err )
33+ w .WriteHeader (http .StatusBadRequest )
34+ return
35+ }
36+ // check if the path is within the configured folder
37+ pattern := t .options .Folder + string (filepath .Separator ) + "*"
38+ matched , err := filepath .Match (pattern , absPath )
39+ if err != nil {
40+ gologger .Print ().Msgf ("%s\n " , err )
41+ w .WriteHeader (http .StatusBadRequest )
42+ return
43+ } else if ! matched {
44+ gologger .Print ().Msg ("pointing to unauthorized directory" )
45+ w .WriteHeader (http .StatusBadRequest )
46+ return
47+ }
48+ }
49+
50+ var (
51+ data []byte
52+ err error
53+ )
54+ if t .options .Sandbox {
55+ maxFileSize := toMb (t .options .MaxFileSize )
56+ // check header content length
57+ if r .ContentLength > maxFileSize {
58+ gologger .Print ().Msg ("request too large" )
59+ return
60+ }
61+ // body max length
62+ r .Body = http .MaxBytesReader (w , r .Body , maxFileSize )
63+ }
64+
65+ data , err = ioutil .ReadAll (r .Body )
2866 if err != nil {
2967 gologger .Print ().Msgf ("%s\n " , err )
68+ w .WriteHeader (http .StatusInternalServerError )
69+ return
3070 }
3171 err = handleUpload (path .Base (r .URL .Path ), data )
3272 if err != nil {
3373 gologger .Print ().Msgf ("%s\n " , err )
74+ w .WriteHeader (http .StatusInternalServerError )
75+ return
3476 }
3577 }
3678
0 commit comments