對(duì)限制ip的投票網(wǎng)站作弊方案,這個(gè)方法利用了投票網(wǎng)站監(jiān)測遠(yuǎn)程ip的一些漏洞來實(shí)現(xiàn),并沒有真正的偽造ip地址,http是建立的tcp之上的第七層,是不可能偽造真實(shí)ip地址的最近朋友需要一個(gè)投票軟件,我最近也就研究了一下這個(gè)投票網(wǎng)站,這個(gè)投票網(wǎng)站有驗(yàn)證碼,每個(gè)IP限制為一票,看起來是標(biāo)準(zhǔn)的投票網(wǎng)站。我先研究了一下驗(yàn)證碼:
這個(gè)投票網(wǎng)站的驗(yàn)證碼開始很簡單,標(biāo)準(zhǔn)位置的標(biāo)準(zhǔn)四個(gè)數(shù)字,很好識(shí)別。后來變態(tài)到位數(shù)不一定,而且還有字母,而且還位置上下不一定,這下驗(yàn)證碼的識(shí)別,不但是軟件很難識(shí)別,就連人工識(shí)別都困難。山窮水盡疑無路,柳暗花明又一村,請(qǐng)看下段分解!
在我不斷的分析和研究發(fā)現(xiàn)他的驗(yàn)證碼檢查有漏洞,發(fā)現(xiàn)了這個(gè)漏洞,這個(gè)驗(yàn)證碼已經(jīng)形同虛設(shè),無需識(shí)別,無需驗(yàn)證碼,直接就繞過去了,因?yàn)樗辉谕镀边x項(xiàng)頁設(shè)置檢查驗(yàn)證碼是否為空的 js代碼,js代碼是運(yùn)行在客戶端,這種驗(yàn)證的效果為零,一般JS這種驗(yàn)證只是為了方便用戶來使用的,做為投票網(wǎng)站只使用這一種驗(yàn)證方式,在投票處理動(dòng)態(tài)頁面竟然不檢查驗(yàn)證碼是否為空,實(shí)在是不敢恭維,給網(wǎng)站的安全帶來極大的隱患。
對(duì)于驗(yàn)證碼的問題,我已經(jīng)了解了破解方法,只要在投票的時(shí)候不直接訪問驗(yàn)證碼文件,那么驗(yàn)證碼就是為空,既然他的動(dòng)態(tài)頁面不檢查驗(yàn)證碼是否為空,所以只要在post的時(shí)候驗(yàn)證碼參數(shù)為空就可以了。
那么還有一個(gè)問題就是這個(gè)投票網(wǎng)站檢查IP,限制一個(gè)IP只允許投票一次,那么只有使用代理,或者通過不停的斷網(wǎng)和撥號(hào)才能實(shí)現(xiàn)。我實(shí)在想不到其他好辦法,后來這個(gè)朋友找到了一個(gè)可以極速在這個(gè)網(wǎng)站投票的程序,我對(duì)這個(gè)程序的IP解決方案很好奇就問朋友要來想分析一下。
首先我是采取對(duì)這個(gè)投票軟件進(jìn)行抓包的方式來研究,準(zhǔn)備好了之后,打開投票程序“刷!提示軟件沖突!”暈,不會(huì)吧,那我就關(guān)掉一些程序,都關(guān)完了只留一個(gè)抓包程序還提示沖突,呵呵,原來這個(gè)程序竟然還知道有人可能會(huì)分析他的軟件,竟然遍歷進(jìn)程名稱,檢查是否有可疑的程序,如果有程序?qū)λM(jìn)行分析或者抓包,他就拒絕運(yùn)行。呵呵,目前我知道他限制的軟件有易語言編程軟件,還有 WSockExpert_Cn 抓包軟件。呵呵,關(guān)了易語言,把 WSockExpert_Cn 名稱改一下,順利通過軟件的自身安全檢測,運(yùn)行成功。
以下是我在使用過程中他投票是的數(shù)據(jù)包:
XML/HTML Code復(fù)制內(nèi)容到剪貼板
POST /vote/view.php?sid=33act=vote HTTP/1.1
Accept: */*
Referer:
Content-Type: application/x-www-form-urlencoded
X-Forwarded-For: 218.20.218.200
CLIENT_IP: 218.20.218.200
VIA: 218.20.218.200
REMOTE_ADDR: 218.20.218.200
Accept-Language: zh-cn
Accept-Encoding: text
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506)
Host:
Cookie: PHPSESSID=pldjnb6scereodjm5niqb9q990
Content-Length: 49
Connection: Close
-Forwarded-For 發(fā)現(xiàn)了這個(gè)http頭參數(shù) 后面跟著IP,呵呵,這個(gè)參數(shù)肯定有來頭,原來我一直不知道,呵呵,趕緊百度一下。
下面是百度后的一篇說明文章,說得很好,大家看看。
偽造HTTP頭中的X-Forwarded-For字段來偽造IP百度了一下X-Forwarded-For的原理,這東西出來好長時(shí)間了.我還第一次聽說X-Forwarded-For:簡稱XFF頭,它代表客戶端,也就是HTTP的請(qǐng)求端真實(shí)的IP,只有在通過了HTTP 代理或者負(fù)載均衡服務(wù)器時(shí)才會(huì)添加該項(xiàng)。
它不是RFC中定義的標(biāo)準(zhǔn)請(qǐng)求頭信息,在squid緩存代理服務(wù)器開發(fā)文檔中可以找到該項(xiàng)的詳細(xì)介紹。
標(biāo)準(zhǔn)格式如下:
X-Forwarded-For: client1, proxy1, proxy2
從標(biāo)準(zhǔn)格式可以看出,X-Forwarded-For頭信息可以有多個(gè),中間用逗號(hào)分隔,第一項(xiàng)為真實(shí)的客戶端ip,剩下的就是曾經(jīng)經(jīng)過的代理或負(fù)載均衡的ip地址,經(jīng)過幾個(gè)就會(huì)出現(xiàn)幾個(gè)。
wiki 的X-Forwarded-For解釋分析:
既然是要偽造客戶端IP,那我們先看看一般是怎樣獲取客戶端IP地址的(以php為例).這段代碼是在百度搜索到的.大部分網(wǎng)站可能都用這段代碼。
XML/HTML Code復(fù)制內(nèi)容到剪貼板
$user_IP = ($_SERVER["HTTP_VIA"]) ? //是否使用了代理
$_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
//獲取失敗則從REMOTE_ADDR獲取
$user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];
?>
首先判斷HTTP_VIA頭是否存在,HTTP_VIA頭代表是否使用了代理服務(wù)器.如果沒有那就從REMOTE_ADDR字段獲取客戶端的IP地址,如果有那就從X-Forwarded-For獲取客戶端IP我估計(jì)很多程序員都是從百度來的代碼吧.asp也類似.
然后我們來測試一下.
服務(wù)端代碼:
XML/HTML Code復(fù)制內(nèi)容到剪貼板
//輸出HTTP_X_FORWARDED_FOR
echo "HTTP_X_FORWARDED_FOR:".$_SERVER["HTTP_X_FORWARDED_FOR"];
//輸出REMOTE_ADDR echo "REMOTE_ADDR:". $_SERVER["REMOTE_ADDR"];
?>
可以看到獲取到的客戶端ip地址是不一樣的.REMOTE_ADDR為真實(shí)地址.
所以一個(gè)網(wǎng)站如果是從X-Forwarded-For來判斷客戶端IP地址的話,那么我們就可以利用這個(gè)邏輯漏洞刷票。
更多信息請(qǐng)查看IT技術(shù)專欄