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)); }
/// <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()); } }
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)); }
/// <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); }
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()); }
/// <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); }
/// <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()); } }