Nmap Development mailing list archives
Re: Error in http.lua's chunked encoding
From: David Fifield <david () bamsoftware com>
Date: Tue, 18 Aug 2009 12:35:25 -0600
On Tue, Aug 18, 2009 at 01:03:59AM -0300, Joao Correa wrote:
The problem happens because the server is returning an extra \n. Do you know if this is a usual thing? Maybe under the conditions of making HEAD requests under a pipeline to a server that responds with chunked encoding, this is the default way of answering.
The error is not in the server, but in the splitResults function. It
wrongly adds an extra newline to the last response.
response = stdnse.strsplit("\n", response)
for _, line in ipairs( response or {} ) do
if(string.match(line, "HTTP/%d\.%d %d+")) then
i = i + 1
results[i] = ""
end
results[i] = results[i] .. line .. "\n"
end
Breaking the response stream on anything that looks like a Status-Line
is really wrong. What if a response contains "HTTP/1.1 200" in the body?
What if the body doesn't end in a newline, so that the Status-Line of
the next response doesn't come at the beginning of a line? Responses to
pipelined requests are supposed to either have a Content-Length or use
the chunked Transfer-Encoding, both of which allow you to find the
length of the body and the start of the next response. The get_chunks
iterator returns the offset after the last chunk so you can start
parsing the next response there.
Here is a quick and dirty fix for the extra newline problem. It still
has the other problems I mentioned above.
local function splitResults( response )
local results = {}
local line
local i, offset
i = 1
while true do
offset = string.find(response, "HTTP/%d\.%d %d+", i + 1)
if offset then
results[#results + 1] = string.sub(response, i, offset - 1)
else
results[#results + 1] = string.sub(response, i)
break
end
i = offset
end
return results
end
./nselib/http.lua:164: Didn't find CRLF after chunk-size [ chunk-extension ] at position 2; got "OF\ ". stack traceback: [C]: in function 'error' ./nselib/http.lua:164: in function '(for generator)' ./nselib/http.lua:834: in function 'parseResult' ./nselib/http.lua:682: in function 'pipeline' ./scripts/http-enum.nse:169: in function<./scripts/http-enum.nse:42> (tail call): ?
The above error is the result of a different bug that was fixed by João
in a later patch. Responses to pipelined requests are read with this
loop:
response_raw = ""
while recv_status do
recv_status, response_tmp = socket:receive()
response_raw = response_raw .. response_tmp
end
When the last read hits EOF, the return value of socket:receive() is
(false, "EOF"). The loop should exit at this point, but it wrongly
appends the "EOF" to the body of the final response. That's why you got
the error referring to "EOF\n"; 'E' happens to be a hex digit so it
looks like the start of a chunk, but what follows the hex digit is
supposed to be CRLF.
David Fifield
_______________________________________________
Sent through the nmap-dev mailing list
http://cgi.insecure.org/mailman/listinfo/nmap-dev
Archived at http://SecLists.Org
Current thread:
- Error in http.lua's chunked encoding Ron (Aug 17)
- Re: Error in http.lua's chunked encoding Joao Correa (Aug 17)
- Re: Error in http.lua's chunked encoding Ron (Aug 17)
- Re: Error in http.lua's chunked encoding Joao Correa (Aug 17)
- Message not available
- Re: Error in http.lua's chunked encoding Joao Correa (Aug 17)
- Re: Error in http.lua's chunked encoding Ron (Aug 18)
- Message not available
- Error in http.lua's chunked encoding Joao Correa (Aug 18)
- Re: Error in http.lua's chunked encoding Ron (Aug 17)
- Re: Error in http.lua's chunked encoding David Fifield (Aug 18)
- Re: Error in http.lua's chunked encoding David Fifield (Aug 18)
- Re: Error in http.lua's chunked encoding Joao Correa (Aug 18)
- Re: Error in http.lua's chunked encoding Ron (Aug 19)
- Re: Error in http.lua's chunked encoding David Fifield (Aug 19)
- Re: Error in http.lua's chunked encoding Joao Correa (Aug 19)
- Re: Error in http.lua's chunked encoding Joao Correa (Aug 17)
- Re: Error in http.lua's chunked encoding Ron (Aug 20)
- Message not available
- Error in http.lua's chunked encoding Joao Correa (Aug 20)
- Re: Error in http.lua's chunked encoding Ron (Aug 20)
