标签:资源 通信 ips 版本 func tip 5.0 伪造 gen
在HTTP请求报文中,请求头是我们需要重点了解的部分,下面是请求头中的主要内容:例题:貌似有点难
实验吧 http://ctf5.shiyanbar.com/phpaudit/
打开链接之后,提示“错误!你的IP不在允许列表之内!”,并且给出了网站源码。
<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"]))
$cip = $_SERVER["HTTP_CLIENT_IP"];
else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if(!empty($_SERVER["REMOTE_ADDR"]))
$cip = $_SERVER["REMOTE_ADDR"];
else
$cip = "0.0.0.0";
return $cip;
}
$GetIPs = GetIP();
if ($GetIPs=="1.1.1.1"){
echo "Great! Key is *********";
}
else{
echo "错误!你的IP不在访问列表之内!";
}
?>
我们首先来分析一下这段代码。
$_SERVER是一个全局变量,与$_GET、$_POST一样,可用于获取客户端的信息。在这段代码中,使用了三种不同的获取客户端IP的方法,
$_SERVER[“REMOTE_ADDR”]获取的是客户端与服务器三次握手建立TCP连接时的IP,这个无法伪造。
$_SERVER[‘HTTP_CLIENT_IP‘]和$_SERVER["HTTP_X_FORWARDED_FOR]都是通过HTTP头来获取信息,因而都是可以伪造的。它们分别获取的是HTTP请求头“CLIENT-IP”和"X-FORWARDED-FOR"域的信息,不过“CLIENT-IP”不属于标准的头信息,而"X-FORWARDED-FOR"则是,因而修改该属性更为可取。.
比如我们自己编写下面一个脚本文件:
默认情况下只能获取到$_SERVER["REMOTE_ADDR"],这是因为HTTP请求头中默认并没有那两个值。
我们利用Burpsuite截获报文,然后在其中增加两个头部信息,并发送出去,这时服务器可以通过三种方法来获取到客户端的IP。
搞清楚这些问题之后,这道题目的解法就很简单了,只要将“CLIENT-IP”或是“X-FORWARDED-FOR"修改为1.1.1.1即可。
最后还是需要说明一下,既然$_SERVER[“REMOTE_ADDR”]获取的是客户端的真实IP,而且用户无法伪造,那么服务器为什么不用这种方法来获取客户端IP呢?这是因为在局域网环境下,客户端与服务器之间直接通信,通过三次握手建立连接,此时获取的IP自然没问题。但是互联网的网络环境就复杂得多了,在服务器的前面一般会有防火墙,在客户端也可以设置代理服务器,也就是说与服务器三次握手的往往并非是客户端,而是这些中间设备,这都会导致利用$_SERVER[“REMOTE_ADDR”]获取的IP不准确。而利用$_SERVER[‘HTTP_CLIENT_IP‘]和$_SERVER["HTTP_X_FORWARDED_FOR]获取的IP直接来自客户端发来的消息头,不受中间设备的干扰,因而更为准确,只是这也为***留下了利用的空间。
标签:资源 通信 ips 版本 func tip 5.0 伪造 gen
原文地址:http://blog.51cto.com/yttitan/2321371