伪造客户端IP{错误!你的IP不在允许列表之内}
2020-01-21 12:34:41 Author: www.secpulse.com(查看原文) 阅读量:582 收藏

$_SERVER是一个全局变量,与$_GET、$_POST一样,可用于获取客户端的信息。

三种获取客户端IP的方法:

$_SERVER[“REMOTE_ADDR”],获取的是客户端与服务器三次握手建立TCP连接时的IP,这个无法伪造

$_SERVER[“HTTP_CLIENT_IP”],获取的是HTTP请求头“CLIENT-IP”字段的信息。

$_SERVER[“HTTP_X_FORWARDED_FOR],获取HTTP请求头”X-FORWARDED-FOR“字段的信息。

$_SERVER[“HTTP_CLIENT_IP”]和$_SERVER[“HTTP_X_FORWARDED_FOR],所获取的信息,都是可以伪造的

<?php
    $ip1 = $_SERVER["REMOTE_ADDR"];
    $ip2 = $_SERVER["HTTP_CLIENT_IP"];
    $ip3 = $_SERVER["HTTP_X_FORWARDED_FOR"];
     
    echo "<h1>ip1:".$ip1."</h1>";
    echo "<h1>ip2:".$ip2."</h1>";
    echo "<h1>ip3:".$ip3."</h1>";
?>

浏览器 和 抓包 显示

image.png

$ip2 = $_SERVER["HTTP_CLIENT_IP"];

$ip3 = $_SERVER["HTTP_X_FORWARDED_FOR"];

没有消息,证明默认请求头里是没有这两个字段的。

我们可以自己添加字段。

image.png

http://ctf5.shiyanbar.com/phpaudit/

image.png

代码审计

<?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不在访问列表之内!";
}

$GetIPs=="1.1.1.1" 才能得到flag

通过前面的介绍,我们可以伪造客户端IP来进行得到 key ! 

image.png

key !  Great! Key is SimCTF{daima_shengji} 

本文作者:伟大娃娃

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/122261.html


文章来源: https://www.secpulse.com/archives/122261.html
如有侵权请联系:admin#unsafe.sh