php获取客户端ip以及伪造ip伪造

获取ip使用场景比较多,如投票、获取发言者的发言所在省份、对用户ip做登记等.本文主要介绍三个php超全局变量获取客户端ip的方法以及存在的问题.


声明:因为使用了cdn之后无法正常的获取客户端ip,则做此次记录,仅供学习交流,请不要用于非法用途,由此教程产生的法律问题均与本人无关!

0x01

直接上代码

<?php
//获取客户端ip,但是如果使用了代理,则获取到的是代理之后的ip
echo '1-'.getenv("REMOTE_ADDR").'</br>';
//获取的是客户端访问时header头部带的ip,可任意伪造
echo '2-'.getenv("HTTP_CLIENT_IP").'</br>';
//客户端真实 IP ,但是如果没有使用代理就不返回真实ip
echo '3-'.getenv("HTTP_X_FORWARDED_FOR").'</br>';

0x02

1、如果客户端使用了透明代理,则getenv("REMOTE_ADDR")返回的是最后一个代理服务器 IP.getenv("HTTP_X_FORWARDED_FOR")返回的是客户端代理之前的ip地址,即客户端真实ip,又浏览器head头部发送.

2、若用户使用普通匿名代理服务器
则getenv("REMOTE_ADDR") = 最后一个代理服务器 IP
getenv("HTTP_X_FORWARDED_FOR")= 代理服务器 IP

3、用户使用欺骗性代理服务器,
getenv("REMOTE_ADDR") = 代理服务器 IP
getenv("HTTP_X_FORWARDED_FOR") = 随机IP

4、用户使用高匿名代理
getenv("REMOTE_ADDR") = 代理服务器 IP
getenv("HTTP_X_FORWARDED_FOR") 返回空或unkown

由于getenv("HTTP_X_FORWARDED_FOR")和getenv("HTTP_CLIENT_IP")获取的IP是由浏览器传过来的,所以可以不使用代理直接进行伪造.代码如下

<?php
//使用curl伪造head信息发送欺骗服务器。随机生成
$ip = mt_rand(1,254).mt_rand(0,254).mt_rand(0,254).mt_rand(0,254);
$header = array(
'CLIENT-IP:'.$ip,
'X-FORWARDED-FOR:'.$ip,
);
//伪造浏览器信息
$info =array('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.2; AskTbPTV/5.17.0.25589; Alexa Toolbar)','Mozilla/5.0 (Windows NT 5.1; rv:22.0) Gecko/20100101 Firefox/22.0','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET4.0C; Alexa Toolbar)','Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1; SV1)');


 $ch = curl_init();//创建一个curl句柄
 curl_setopt ($ch, CURLOPT_URL, 'http://www.baidu.com/');//列如欺骗百度
 curl_setopt ($ch, CURLOPT_HTTPHEADER, $header);//发送header信息
 curl_setopt ($ch, CURLOPT_REFERER, "http://www.baidu.com/");//可任意伪造来源
 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt ($ch, CURLOPT_USERAGENT, "$info");//伪造浏览器信息
 curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 3); 
 $contents = curl_exec($ch); //执行句柄
 curl_close($ch);//结束
 var_dump($contents);//打印变量结构

只针对getenv("HTTP_X_FORWARDED_FOR")getenv("HTTP_CLIENT_IP")函数有效.getenv("REMOTE_ADDR")获取的是客户端ip,若使用代理则为代理ip。

0x03

若网站使用了cdn,则getenv("REMOTE_ADDR")返回的是提供cdn商的ip地址。则使用cdn商提供的方法进行获取。
使用了cdn之后获取到的ip
cdn

0x04

作用:例如 1、 以前的很多投票是通过ip来判断人数的,所以可以达到刷票,如果通过getenv("REMOTE_ADDR")获取ip地址,则可以http代理欺骗,关于http代理,百度一下就有很多提供的。
2、有的网站是通过getenv("HTTP_X_FORWARDED_FOR")获取ip进行记录用户ip地址并且在后台输出,则可通过将ip地址改为自己构建的js代码,通过xss攻击,可以获取到管理员的cookie,实现无密码登录后台,然后getshell 拿到服务器。当然不是说说这么简单,中间还有很多防火墙.
3、...还有很多场景我就不一一列出,就提供一个大概的思路和方法

Last modification:June 8, 2022
If you think my article is useful to you, please feel free to appreciate