Beispiel #1
0
        protected override void BuildRequestHeaders(StringStringKeyValuePairContainer kvpsContainer, Request req, MobileApplication app, bool ssl, bool redirect)
        {
            kvpsContainer.Put(HeaderKeys.Host, app.Domain);
            kvpsContainer.Put(HeaderKeys.Connection, HeaderValues.ConnectionKeepAlive);
            kvpsContainer.Put(HeaderKeys.Accept, req.ResponseEncType.AcceptValue);
            kvpsContainer.Put(HeaderKeys.UserAgent, BrowserCfg.UserAgent);

            if (app.HasReferer)
            {
                kvpsContainer.Put(HeaderKeys.Referer, app.Referer);
            }
            kvpsContainer.Put(HeaderKeys.AcceptEncoding, HeaderValues.AcceptEncoding);
            kvpsContainer.Put(HeaderKeys.AcceptLanguage, BrowserCfg.Language);

            if (req.RequestType == RequestType.Options)                                                                     //Sets the request method for options request
            {
                kvpsContainer.Put(HeaderKeys.AccessControlRequestMethod, ((OptionsRequest)req).RequestTypeOption.Notation); //Sets the option request header
            }
            if (req.RequestType == RequestType.Options || req is ContentRequest)
            {
                kvpsContainer.Put(HeaderKeys.Origin, HttpUtil.GetBaseUrl(req.Url));
            }
            if (req.RequestType == RequestType.Options || req is ContentRequest)
            {
                kvpsContainer.Put(HeaderKeys.Origin, HttpUtil.GetBaseUrl(req.Url));
            }
            if (req.HasBody())
            {
                ((ContentRequest)req).ContentBody.Prepare(kvpsContainer);
            }
        }
Beispiel #2
0
        private static void PerformTunnelHandshake(HttpSocket httpSocket, Proxy proxy, string hostAddress, int port, BrowserConfig browserCfg)
        {
            StringStringKeyValuePairContainer headersContainer = new StringStringKeyValuePairContainer();

            headersContainer.Put(HeaderKeys.Host, hostAddress + ":" + port);
            headersContainer.Put(HeaderKeys.UserAgent, browserCfg.UserAgent);
            headersContainer.Put(HeaderKeys.Connection, HeaderValues.ConnectionKeepAlive);

            if (proxy != null && proxy.HasAuthentication)
            {
                headersContainer.Put(HeaderKeys.ProxyConnection, HeaderValues.ConnectionKeepAlive);
                headersContainer.Put(HeaderKeys.ProxyAuthorization, "Basic " + proxy.ProxyCreds.GetBase64Auth());
            }
            httpSocket.WriteLine(RequestType.Connect.Notation + " " + hostAddress + ":" + port + " " + browserCfg.HttpVersion.Notation);

            foreach (StringStringKeyValuePair kvp in headersContainer.Kvps)
            {
                httpSocket.WriteLine(kvp.Key + ": " + kvp.Value);
            }
            httpSocket.WriteLine();
            httpSocket.FlushUnderlying();

            HttpHeaderDecoder hd = new HttpHeaderDecoder();

            hd.Decode(httpSocket.Stream);

            if (hd.ResponseStatus.HttpCode != HttpCode.Ok)
            {
                throw new IOException("Unable to tunnel through proxy => " + hd.ResponseStatus);
            }
            logger.Debug("Successfully tunneled through proxy");
        }
Beispiel #3
0
        public FormBody Add(string key, object value, bool noReplace = false)
        {
            if (!noReplace)
            {
                StringStringKeyValuePair exists = kvpContainer.Get(key);

                if (exists != null)
                {
                    kvpContainer.Remove(exists);
                }
            }
            string stringVal = value is string?Encoding.UTF8.GetString(Encoding.Default.GetBytes((string)value)) : value.ToString();

            kvpContainer.Put(new StringStringKeyValuePair(key, stringVal));
            return(this);
        }
Beispiel #4
0
        private void BuildSecFetchHeaders(StringStringKeyValuePairContainer reqHeaders, Request request, WebApplication app)
        {
            string lastNavigatedUrlDomain = app.LastNavigatedUrl is null ? null : HttpUtil.GetDomain(app.LastNavigatedUrl);

            reqHeaders.Put(HeaderKeys.SecFetchMode, request.HasProperty(RequestProperty.XMLHttpRequest)
                                        ? HeaderValues.SecFetchCors : HeaderValues.SecFetchNavigate);
            //request.getSecFetchMode()
            //TODO  nested-navigate  redirect to internal page by clicking button etc, no link? Form <<<
            //TODO same-origin/same-site/cross-site when called inside the page, like js scripts being called
            //boolean firstHostContact = !accessedHosts.contains(host) || (request.getRequestType() == RequestType.GET && ((GetRequest)request).isNoRef());
            bool sameOrigin = IsSameOrigin(app.Domain, lastNavigatedUrlDomain);
            bool sameSite   = !sameOrigin && IsSameSiteDifferentHost(app.Domain, lastNavigatedUrlDomain);
            bool crossSite  = !sameOrigin && !sameSite;

            if (AccessedHosts.Count > 0 && !crossSite && RedirectionChain.Count > 1)
            {
                for (int i = 0; i < RedirectionChain.Count; i++)
                {
                    Request prevReq  = RedirectionChain[i];
                    string  prevHost = HttpUtil.GetDomain(prevReq.Url);

                    if (IsSameOrigin(app.Domain, prevHost))
                    {
                        continue;
                    }
                    if (IsSameSiteDifferentHost(app.Domain, prevHost))
                    {
                        sameSite = true;
                        continue;
                    }
                    crossSite = true;
                    break;
                }
            }
            if (AccessedHosts.Count == 0)
            {
                reqHeaders.Put(HeaderKeys.SecFetchSite, HeaderValues.SecFetchNone);
            }
            else if (crossSite)
            {
                reqHeaders.Put(HeaderKeys.SecFetchSite, HeaderValues.SecFetchCrossSite);
            }
            else if (sameSite)
            {
                reqHeaders.Put(HeaderKeys.SecFetchSite, HeaderValues.SecFetchSameSite);
            }
            else
            {
                reqHeaders.Put(HeaderKeys.SecFetchSite, HeaderValues.SecFetchSameOrigin);
            }
            if (!request.HasProperty(RequestProperty.XMLHttpRequest))
            {
                reqHeaders.Put(HeaderKeys.SecFetchUser, HeaderValues.SecFetchUser);
            }
        }
Beispiel #5
0
 protected override void SetContentHeaders(StringStringKeyValuePairContainer headers)
 {
     headers.Put(HeaderKeys.ContentType, raw ? EncType.ContentValue : MimeType.GetByFile(fileLink).Notation);
     headers.Put(HeaderKeys.ContentLength, ContentLength.ToString());
 }
Beispiel #6
0
        protected override void SetContentHeaders(StringStringKeyValuePairContainer headers)
        {
            base.SetContentHeaders(headers);

            headers.Put(HeaderKeys.ContentType, EncType.ContentValue + "; boundary=" + Boundary);
        }
Beispiel #7
0
        protected override void BuildRequestHeaders(StringStringKeyValuePairContainer kvpsContainer, Request req, WebApplication app, bool ssl, bool redirect)
        {
            bool xmlHttpRequest = req.HasProperty(RequestProperty.XMLHttpRequest);

            kvpsContainer.Put(HeaderKeys.Host, app.Domain);
            kvpsContainer.Put(HeaderKeys.Connection, HeaderValues.ConnectionKeepAlive);

            if (ssl)
            {
                kvpsContainer.Put(HeaderKeys.Dpr, "1");
            }
            kvpsContainer.Put(HeaderKeys.UserAgent, BrowserCfg.UserAgent);
            kvpsContainer.Put(HeaderKeys.Accept, req.ResponseEncType.AcceptValue);

            if ((req.RequestType == RequestType.Post && !xmlHttpRequest) || redirect || !string.IsNullOrEmpty(req.CachePolicy))
            {
                kvpsContainer.Put(HeaderKeys.CacheControl, !string.IsNullOrEmpty(req.CachePolicy) ? req.CachePolicy : HeaderValues.MaxZeroCache);
            }
            if (!xmlHttpRequest)
            {
                kvpsContainer.Put(HeaderKeys.UpgradeInsecureRequests, "1");
            }
            if (xmlHttpRequest)
            {
                kvpsContainer.Put(HeaderKeys.XRequestedWith, HeaderValues.XmlHttpRequest);
            }
            if (BrowserCfg.DoNotTrack)
            {
                kvpsContainer.Put(HeaderKeys.Dnt, "1");
            }
            if (app.HasNavigated)
            {
                kvpsContainer.Put(HeaderKeys.Referer, app.LastNavigatedUrl);
            }
            kvpsContainer.Put(HeaderKeys.AcceptEncoding, HeaderValues.AcceptEncoding);
            kvpsContainer.Put(HeaderKeys.AcceptLanguage, BrowserCfg.Language);

            if (ssl)
            {
                BuildSecFetchHeaders(kvpsContainer, req, app);
            }
            if (req.RequestType == RequestType.Options)                                                                     //Sets the request method for options request
            {
                kvpsContainer.Put(HeaderKeys.AccessControlRequestMethod, ((OptionsRequest)req).RequestTypeOption.Notation); //Sets the option request header
            }
            if (req.RequestType == RequestType.Options || xmlHttpRequest || req is ContentRequest)
            {
                kvpsContainer.Put(HeaderKeys.Origin, HttpUtil.GetBaseUrl(req.Url));
            }
            if (req.RequestType != RequestType.Options && app.CookieJar != null &&
                app.CookieJar.Cookies.Count > 0 && SessionPolicy != HttpSessionPolicy.NoData)
            {
                StringBuilder cookieSb = new StringBuilder();

                for (int i = 0; i < app.CookieJar.Cookies.Count; i++)
                {
                    cookieSb.Append(app.CookieJar.Cookies[i].Name + "=" + app.CookieJar.Cookies[i].Value);

                    if (i < (app.CookieJar.Cookies.Count - 1))
                    {
                        cookieSb.Append("; ");
                    }
                }
                kvpsContainer.Put(HeaderKeys.Cookie, cookieSb.ToString());
            }
            if (req.HasBody())
            {
                ((ContentRequest)req).ContentBody.Prepare(kvpsContainer);
            }
        }
Beispiel #8
0
 protected virtual void SetContentHeaders(StringStringKeyValuePairContainer headers)
 {
     headers.Put(HeaderKeys.ContentType, EncType.ContentValue);
     headers.Put(HeaderKeys.ContentLength, ContentLength.ToString());
 }