Updating redirect URL to support template values. Fixes #1235

pull/1264/head
Jordan Wright 2018-10-15 16:42:05 -05:00
parent ebc099b6c2
commit 326649b177
4 changed files with 56 additions and 1 deletions

View File

@ -190,7 +190,13 @@ func renderPhishResponse(w http.ResponseWriter, r *http.Request, ptx models.Phis
// should send the user to that URL // should send the user to that URL
if r.Method == "POST" { if r.Method == "POST" {
if p.RedirectURL != "" { if p.RedirectURL != "" {
http.Redirect(w, r, p.RedirectURL, 302) redirectURL, err := models.ExecuteTemplate(p.RedirectURL, ptx)
if err != nil {
log.Error(err)
http.NotFound(w, r)
return
}
http.Redirect(w, r, redirectURL, http.StatusFound)
return return
} }
} }

View File

@ -7,6 +7,7 @@ import (
"io/ioutil" "io/ioutil"
"log" "log"
"net/http" "net/http"
"net/url"
"github.com/gophish/gophish/config" "github.com/gophish/gophish/config"
"github.com/gophish/gophish/models" "github.com/gophish/gophish/models"
@ -229,3 +230,41 @@ func (s *ControllersSuite) TestTransparencyRequest() {
s.transparencyRequest(result, rid, "/track") s.transparencyRequest(result, rid, "/track")
s.transparencyRequest(result, rid, "/report") s.transparencyRequest(result, rid, "/report")
} }
func (s *ControllersSuite) TestRedirectTemplating() {
p := models.Page{
Name: "Redirect Page",
HTML: "<html>Test</html>",
UserId: 1,
RedirectURL: "http://example.com/{{.RId}}",
}
err := models.PostPage(&p)
s.Nil(err)
smtp, _ := models.GetSMTP(1, 1)
template, _ := models.GetTemplate(1, 1)
group, _ := models.GetGroup(1, 1)
campaign := models.Campaign{Name: "Redirect campaign"}
campaign.UserId = 1
campaign.Template = template
campaign.Page = p
campaign.SMTP = smtp
campaign.Groups = []models.Group{group}
err = models.PostCampaign(&campaign, campaign.UserId)
s.Nil(err)
client := http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
result := campaign.Results[0]
resp, err := client.PostForm(fmt.Sprintf("%s/?%s=%s", ps.URL, models.RecipientParameter, result.RId), url.Values{"username": {"test"}, "password": {"test"}})
s.Nil(err)
defer resp.Body.Close()
s.Equal(http.StatusFound, resp.StatusCode)
expectedURL := fmt.Sprintf("http://example.com/%s", result.RId)
got, err := resp.Location()
s.Nil(err)
s.Equal(expectedURL, got.String())
}

View File

@ -73,6 +73,9 @@ func (p *Page) Validate() error {
if err := ValidateTemplate(p.HTML); err != nil { if err := ValidateTemplate(p.HTML); err != nil {
return err return err
} }
if err := ValidateTemplate(p.RedirectURL); err != nil {
return err
}
return p.parseHTML() return p.parseHTML()
} }

View File

@ -116,4 +116,11 @@ func (s *ModelsSuite) TestPageValidation(c *check.C) {
</html>` </html>`
err = p.Validate() err = p.Validate()
c.Assert(err, check.NotNil) c.Assert(err, check.NotNil)
// Validate that if the RedirectURL contains an invalid template tag, that
// we catch it
p.HTML = "valid data"
p.RedirectURL = "http://example.com/{{.INVALIDTAG}}"
err = p.Validate()
c.Assert(err, check.NotNil)
} }