眼下非常多站點的涉及存在一些安全漏洞,黑客easy使用ip偽造、session劫持、xss攻擊、session注入等手段危害站點安全。在紀錄片《互聯網之子》(建議搞IT的都要看下)中。亞倫·斯沃茨(真實人物,神一般的存在)涉嫌利用麻省理工的網絡,通過ip偽造從JSTOR中下載了150萬篇論文。本文通過firefox看下一個簡單的ip偽造是怎樣實現的。
1、client的ip是通過http的頭部發送到server端的
比方,在打開網址www.baidu.com的時候。通過firebug能夠看到請求頭部,頭部里包括client的信息,比方cookie等。
一般后台獲取的clientip的代碼為:
php代碼:
private function _get_client_ip() { $ip = $_SERVER['REMOTE_ADDR']; if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP'];
jsp代碼:
public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }
代碼片段即是獲取clientIP,這段程序會嘗試檢查 HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR, 依據之前的原理說明,以 HTTP_開頭的 header, 均屬於client發送的內容。那么,假設client偽造 Client-Ip, X-Forward-For,不就能夠欺騙此程序,達到“偽造 IP”之目的?
偽造這項值?假設你會敲代碼。並了解HTTP協議,直接偽造請求 header 就可以。
或者使用 Firefox的 Moify Headers插件就可以。
2、Modify Headers偽造ip
安裝Modify Headers后,加入一個X-Forwarded-For,並填入一個ip,置為可用后,打開對應網頁,server就會獲取到該偽造ip。
3、站點怎樣防護ip偽造
既然能夠通過ip偽造,站點怎樣過濾這些偽造的ip? 一般做法是在應用server上強制將X-Forwarded-For的值設置為client真實ip,詳細操作請自行研究。
網絡中存在此漏洞的站點非常多,尤其是一些投票類的站點。通過限制ip(一個ip僅僅能投一次票,或者一個ip僅僅能在一定的時間段投一次票)來限制重復投票的站點。
別人可能會利用此漏洞來偽造ip。突破這樣的限制。所以站點開發人員要重視這類安全。
本文部分內容參考了博客構造HTTP請求 Header 實現“偽造來源 IP” ,