示例#1
0
        protected bool ShouldBeTested(string rawRequest)
        {
            bool shouldBeTested = false;

            var attackTargetList = _testFile.GetAttackTargetList();

            foreach (var target in attackTargetList.Values)
            {
                if (target.Status == AttackTargetStatus.Enabled && Utils.IsMatch(rawRequest, target.RequestPattern))
                {
                    shouldBeTested = true;
                    break;
                }
            }

            shouldBeTested = shouldBeTested && !Utils.IsMatch(rawRequest, _patternOfRequestExclusion);

            if (!shouldBeTested)
            {
                HttpServerConsole.Instance.WriteLine(LogMessageType.Warning, "Request will not be tested '{0}'.",
                                                     HttpRequestInfo.GetRequestLine(rawRequest));
            }

            return(shouldBeTested);
        }
        private void HandleSendingRequestLine(string line)
        {
            byte[] bytes;

            bytes = ReadNextBytes(line, _sendingRequestRegex);
            if (bytes != null)
            {
                if (_currentRequestData == null || _currentRequestData.RawResponse != null)
                {
                    _currentRequestData = new RequestResponseBytes();
                    _currentHeader      = null;
                }

                _currentRequestData.AddToRequest(bytes);
                //check if this the start of a new request
                if (_currentHeader == null || String.IsNullOrEmpty(_currentHeader.RequestLine))
                {
                    string reqLine = HttpRequestInfo.GetRequestLine(_currentRequestData.RawRequest);
                    //check if it's recognized as a valid request line
                    if (_lineTypeSelector.GetLineType(reqLine) == LineType.FirstRequestLine)
                    {
                        HandleFirstRequestLine(reqLine, null);
                    }
                }
            }
        }
        public void Test_HttpRequestInfo_GetRequestLine_From_Binary_NL()
        {
            string request = "GET / HTTP/1.1\nAccept:*.*\n\n";

            byte[] requestBytes = Encoding.UTF8.GetBytes(request);

            Assert.AreEqual("GET / HTTP/1.1", HttpRequestInfo.GetRequestLine(requestBytes));
        }
示例#4
0
        /// <summary>
        /// Adds a request to the current Traffic Viewer File
        /// </summary>
        /// <param name="request"></param>
        /// <param name="description"></param>
        private void AddAppScanRequest(XmlNode request, string description)
        {
            TVRequestInfo reqInfo = new TVRequestInfo();

            reqInfo.Description = description;
            reqInfo.IsHttps     = request.Attributes["scheme"] != null && request.Attributes["scheme"].Equals("https");
            reqInfo.ThreadId    = Properties.Resources.Settings;

            XmlNode rawRequestNode = request.SelectSingleNode("raw");

            byte[] rawRequestBytes = new byte[0];
            if (rawRequestNode.Attributes["encoding"] != null && rawRequestNode.Attributes["encoding"].Value.Equals("none"))
            {
                string rawRequest = String.Empty;
                rawRequest      = rawRequestNode.InnerText;
                rawRequestBytes = Constants.DefaultEncoding.GetBytes(rawRequest);
            }
            reqInfo.RequestLine = HttpRequestInfo.GetRequestLine(rawRequestBytes);
            reqInfo.Id          = _tvFile.AddRequestInfo(reqInfo);
            _tvFile.SaveRequest(reqInfo.Id, rawRequestBytes);

            XmlNode response = request.SelectSingleNode("response");

            //put together the response

            if (response != null)
            {
                ByteArrayBuilder builder     = new ByteArrayBuilder();
                XmlNode          headersNode = response.SelectSingleNode("headers");
                if (headersNode != null && headersNode.Attributes["value"] != null)
                {
                    builder.AddChunkReference(Constants.DefaultEncoding.GetBytes(headersNode.Attributes["value"].Value));
                }

                XmlNode bodyNode = response.SelectSingleNode("body");
                if (bodyNode != null)
                {
                    bool isCompressed = bodyNode.Attributes["compressedBinaryValue"] != null && bodyNode.Attributes["compressedBinaryValue"].Value == "true";


                    string body      = bodyNode.Attributes["value"].Value;
                    byte[] bodyBytes = new byte[0];
                    if (isCompressed)
                    {
                        bodyBytes = Utils.DecompressBytesFromBase64String(body);
                    }
                    else
                    {
                        body      = Utils.Base64Decode(body);
                        bodyBytes = Constants.DefaultEncoding.GetBytes(body);
                    }
                    builder.AddChunkReference(bodyBytes);
                }
                _tvFile.SaveResponse(reqInfo.Id, builder.ToArray());
            }
        }
示例#5
0
        private void AddRequest(ITrafficDataAccessor currentFile, Uri uri, string fullQuery, string format)
        {
            string          request     = String.Format(format, uri.AbsolutePath, fullQuery, uri.Host, uri.Port);
            HttpRequestInfo requestInfo = new HttpRequestInfo(request);
            TVRequestInfo   tvReqInfo   = new TVRequestInfo();

            tvReqInfo.Description = Resources.UriParserDescription;
            tvReqInfo.RequestLine = HttpRequestInfo.GetRequestLine(request);
            tvReqInfo.ThreadId    = "N/A";
            tvReqInfo.RequestTime = DateTime.Now;
            tvReqInfo.IsHttps     = String.Compare(uri.Scheme, "https", true) == 0;
            currentFile.AddRequestInfo(tvReqInfo);
            currentFile.SaveRequest(tvReqInfo.Id, requestInfo.ToArray(false));
        }
示例#6
0
        /// <summary>
        /// Adds a request to the data accessor
        /// </summary>
        /// <param name="request"></param>
        private void AddHttpRequest(HttpRequestInfo request)
        {
            var reqInfo = new TVRequestInfo();

            reqInfo.Host    = request.Host;
            reqInfo.IsHttps = request.IsSecure;

            byte [] rawRequest = request.ToArray();

            reqInfo.RequestLine = HttpRequestInfo.GetRequestLine(rawRequest);
            reqInfo.Description = "Script Explore";

            var id = _curDataAccessor.AddRequestInfo(reqInfo);

            _curDataAccessor.SaveRequest(id, rawRequest);
        }
示例#7
0
        private void AddRequest(ITrafficDataAccessor currentFile, Entry entry)
        {
            Uri uri = entry.Request.Url;
            //check exclusions
            Request         harRequest  = entry.Request;
            string          request     = String.Format("{0} {1} {2}\r\n\r\n", harRequest.Method, uri.PathAndQuery, harRequest.HttpVersion);
            HttpRequestInfo requestInfo = new HttpRequestInfo(request);

            //add the headers
            foreach (var header in harRequest.Headers)
            {
                if (!header.Name.ToLower().Equals("accept-encoding") &&
                    !header.Name.ToLower().Equals("if-modified-since") &&
                    !header.Name.ToLower().Equals("if-none-match"))
                {
                    requestInfo.Headers.Add(header.Name, header.Value);
                }
            }
            if (harRequest.PostData != null)
            {
                requestInfo.ContentData = Constants.DefaultEncoding.GetBytes(harRequest.PostData.Text);
            }
            TVRequestInfo tvReqInfo = new TVRequestInfo();

            tvReqInfo.Description = Resources.HarParserDescription;
            tvReqInfo.RequestLine = HttpRequestInfo.GetRequestLine(request);
            tvReqInfo.ThreadId    = "N/A";
            tvReqInfo.RequestTime = DateTime.Now;
            tvReqInfo.IsHttps     = String.Compare(uri.Scheme, "https", true) == 0;
            tvReqInfo.Host        = uri.Host;

            Response         harResponse  = entry.Response;
            string           responseHead = String.Format("{0} {1}\r\n\r\n", harResponse.HttpVersion, harResponse.Status);
            HttpResponseInfo respInfo     = new HttpResponseInfo(responseHead);

            foreach (var header in harResponse.Headers)
            {
                respInfo.Headers.Add(header.Name, header.Value);
            }
            if (harResponse.Content != null && !String.IsNullOrWhiteSpace(harResponse.Content.Text))
            {
                respInfo.ResponseBody.AddChunkReference(Constants.DefaultEncoding.GetBytes(harResponse.Content.Text));
            }

            currentFile.AddRequestInfo(tvReqInfo);
            currentFile.SaveRequestResponse(tvReqInfo.Id, requestInfo.ToArray(false), respInfo.ToArray());
        }
示例#8
0
        /// <summary>
        /// Appends the specified request with the associated raw response to the current traffic file and returns the request id
        /// </summary>
        /// <param name="request"></param>
        /// <param name="response"></param>
        /// <param name="isHttps"></param>
        /// <returns></returns>
        public int AddRequestResponse(byte[] request, byte[] response, bool isHttps)
        {
            TVRequestInfo tvReqInfo = new TVRequestInfo();

            tvReqInfo.RequestLine    = HttpRequestInfo.GetRequestLine(request);
            tvReqInfo.Description    = "N/A";
            tvReqInfo.RequestTime    = DateTime.Now;
            tvReqInfo.ResponseTime   = DateTime.Now;
            tvReqInfo.ThreadId       = Utils.GetCurrentWin32ThreadId().ToString();
            tvReqInfo.IsHttps        = isHttps;
            tvReqInfo.ResponseStatus = HttpResponseInfo.GetResponseStatus(response);

            AddRequestInfo(tvReqInfo);

            SaveRequestResponse(tvReqInfo.Id, request, response);

            return(tvReqInfo.Id);
        }
示例#9
0
        /// <summary>
        /// Saves request bytes to disk and caches it if tail is on
        /// </summary>
        /// <param name="requestId"></param>
        /// <param name="data">Request data bytes</param>
        public void SaveRequest(int requestId, RequestResponseBytes data)
        {
            if (data == null || data.RawRequest == null)
            {
                return;
            }

            bool isRequestChanged = false;

            try
            {
                lock (_lockData)                 //critical section begins
                {
                    if (_requestInfos.ContainsKey(requestId))
                    {
                        //save to memory buffer only if tail is on
                        //this is done to use minimum memory footprint since on
                        //normal load the user is viewing the requests
                        //at the beginning of the file
                        TVRequestInfo reqInfo = _requestInfos[requestId];
                        //save to disk
                        reqInfo.RequestStartPosition = WritePosition;
                        string reqLine = null;
                        if (_tailInProgress || RequestDataCache.Instance.GetEntry(_objectId ^ requestId) != null || reqInfo.IsEncrypted)
                        {
                            byte[] rawRequest = data.RawRequest;
                            reqLine = HttpRequestInfo.GetRequestLine(rawRequest);
                            //this takes memory but at the same time insures that the user can see the data fast during tail
                            if (reqInfo.IsEncrypted)
                            {
                                rawRequest = Encryptor.Encrypt(rawRequest);
                            }
                            reqInfo.RequestLength = rawRequest.Length;
                            BufferSaveRequest(requestId, rawRequest);
                            DataWrite(rawRequest, 0, rawRequest.Length);
                        }
                        else
                        {
                            byte[] chunk;
                            //this saves memory and writes the chunks of data directly to disk
                            data.ResetRequestChunkPosition();
                            while ((chunk = data.ReadRequestChunk()) != null)
                            {
                                if (reqLine == null)
                                {
                                    reqLine = HttpRequestInfo.GetRequestLine(chunk);
                                }
                                DataWrite(chunk, 0, chunk.Length);
                            }
                            reqInfo.RequestLength = data.RequestSize;
                        }
                        reqInfo.RequestLine = reqLine;
                        isRequestChanged    = true;
                    }
                }                //critical section ends

                //Invoke event
                if (isRequestChanged && RequestChanged != null)
                {
                    RequestChanged.Invoke(
                        new TVDataAccessorDataArgs(requestId, _requestInfos[requestId]));
                }
            }
            catch (Exception ex)
            {
                SdkSettings.Instance.Logger.Log(TraceLevel.Error, "Error saving request data for request id: {0} . Stack trace: {1}", requestId, ex.ToString());
            }
        }