$_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>"; ?>
浏览器 和抓包 显示
$ip2 = $_SERVER["HTTP_CLIENT_IP"];
$ip3 = $_SERVER["HTTP_X_FORWARDED_FOR"];
没有消息,证明默认请求头里是没有这两个字段的。
我们可以自己添加字段。
http://ctf5.shiyanbar.com/phpaudit/
代码审计
<?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 ! Great! Key is SimCTF{daima_shengji}
key ! Great! Key is SimCTF{daima_shengji}