gitex2026/AttackSurface/src/gotestwaf/internal/payload/placeholder/useragent.go
2026-04-24 12:36:21 +00:00

76 lines
1.9 KiB
Go

package placeholder
import (
"net/http"
"net/url"
"github.com/chromedp/cdproto/network"
"github.com/chromedp/chromedp"
"github.com/wallarm/gotestwaf/internal/scanner/clients/chrome/helpers"
"github.com/wallarm/gotestwaf/internal/scanner/types"
)
const UAHeader = "User-Agent"
var _ Placeholder = (*UserAgent)(nil)
var DefaultUserAgent = &UserAgent{name: "UserAgent"}
type UserAgent struct {
name string
}
func (p *UserAgent) NewPlaceholderConfig(map[any]any) (PlaceholderConfig, error) {
return nil, nil
}
func (p *UserAgent) GetName() string {
return p.name
}
func (p *UserAgent) CreateRequest(requestURL, payload string, config PlaceholderConfig, httpClientType types.HTTPClientType) (types.Request, error) {
reqURL, err := url.Parse(requestURL)
if err != nil {
return nil, err
}
switch httpClientType {
case types.GoHTTPClient:
return p.prepareGoHTTPClientRequest(reqURL.String(), payload, config)
case types.ChromeHTTPClient:
return p.prepareChromeHTTPClientRequest(reqURL.String(), payload, config)
default:
return nil, types.NewUnknownHTTPClientError(httpClientType)
}
}
func (p *UserAgent) prepareGoHTTPClientRequest(requestURL, payload string, config PlaceholderConfig) (*types.GoHTTPRequest, error) {
req, err := http.NewRequest(http.MethodGet, requestURL, nil)
if err != nil {
return nil, err
}
req.Header.Set(UAHeader, payload)
return &types.GoHTTPRequest{Req: req}, nil
}
func (p *UserAgent) prepareChromeHTTPClientRequest(requestURL, payload string, config PlaceholderConfig) (*types.ChromeDPTasks, error) {
reqOptions := &helpers.RequestOptions{
Method: http.MethodGet,
}
task, responseMeta, err := helpers.GetFetchRequest(requestURL, reqOptions)
if err != nil {
return nil, err
}
tasks := &types.ChromeDPTasks{
Tasks: chromedp.Tasks{task},
UserAgentHeader: network.Headers{UAHeader: payload, "Test": "test"},
ResponseMeta: responseMeta,
}
return tasks, nil
}