會話劫持利用了TCP/IP工作原理來設計攻擊。TCP使用端到端的連接,即TCP用(源IP,源TCP端口號,目的IP,目的TCP端號)來唯一標識每一條已經建立連接的TCP鏈路。另外,TCP在進行數據傳輸時,TCP報文首部的兩個字段序號(seq)和確認序號(ackseq)非常重要。序號(seq)和確認序號(ackseq)是與所攜帶TCP數據凈荷(payload)的多少有數值上的關系:序號字段(seq)指出了本報文中傳送的數據在發送主機所要傳送的整個數據流中的順序號,而確認序號字段(ackseq)指出了發送本報文的主機希望接收的對方主機中下一個八位組的順序號。因此,對于一臺主機來說,其收發的兩個相臨TCP報文之間的序號和確認序號的關系為:它所要發出的報文中的seq值應等于它所剛收到的報文中的ackseq的值,而它所要發送報文中ackseq的值應為它所收到報文中seq的值加上該報文中所發送的TCP凈荷的長度。
TCP會話劫持的攻擊方式可以對基于TCP的任何應用發起攻擊,如HTTP、FTP、Telnet等。對于攻擊者來說,所必須要做的就是窺探到正在進行TCP通信的兩臺主機之間傳送的報文,這樣攻擊者就可以得知該報文的源IP、源TCP端口號、目的IP、目的TCP端號,從而可以得知其中一臺主機對將要收到的下一個TCP報文段中seq和ackseq值的要求。這樣,在該合法主機收到另一臺合法主機發送的TCP報文前,攻擊者根據所截獲的信息向該主機發出一個帶有凈荷的TCP報文,如果該主機先收到攻擊報文,就可以把合法的TCP會話建立在攻擊主機與被攻擊主機之間。帶有凈荷的攻擊報文能夠使被攻擊主機對下一個要收到的TCP報文中的確認序號(ackseq)的值的要求發生變化,從而使另一臺合法的主機向被攻擊主機發出的報文被被攻擊主機拒絕。TCP會話劫持攻擊方式的好處在于使攻擊者避開了被攻擊主機對訪問者的身份驗證和安全認證,從而使攻擊者直接進入對被攻擊主機的的訪問狀態,因此對系統安全構成的威脅比較嚴重。
前些日子對自定義http協議的各個數據進行了研究,對于ip偽造的問題,我當時給的建議是使用代理服務器,不過后來發現,其實可以在http協議加入一個選項,來實現一個非偽造ip的偽造ip。如何理解呢?理由如下:~
一、方法概述
在http協議數據頭里面加入選項“x-forward-for”,例如:“x-forward-for:202.204.76.254”,這樣發送出去的包,就是一個特殊的包,在收包方看來,這個包的意思是,一個代理服務器發過來的數據包,而這個包的真是ip是“202.204.76.254”,其實還是實現的是三次握手,但是只不過是在發包的同時,對收包方提到了一個第三者。
二、試用范圍
因為現在的網站類的程序如果有IP限制的話,基本上都是會檢測是不是代理服務器發送的數據的,如果是代理服務器發送的數據,那么他就把IP記為這個(透明)代理服務器發送的x-forward-for的IP。
以一段較為流行的php檢測ip的代碼為例:
function get_ip(){
if(getenv('HTTP_CLIENT_IP')) {
$gb_ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
$gb_ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')) {
$gb_ip = getenv('REMOTE_ADDR');
} else {
$gb_ip = $_SERVER['REMOTE_ADDR'];
}
return $gb_ip;
}
那么大家可以看到這個IP是如何偽造的了。
三、應對方法
當然對于網站方面,這種偽造ip的情況雖然不是很多,但是如果在投票類的程序中,當然很需要這方面的檢測了,呵呵。多多檢測HTTP_CLIENT_IP吧。貌似這個還沒有辦法偽造?.............................
四、總體看法
這個辦法之所以稱之為非偽造ip的偽造ip,主要就是利用了現在大多數網站程序檢測ip的一個漏洞。所以如果網站程序能夠重新審視一下自己的ip檢測辦法,這個方法就會慢慢失效的。呵呵。