前言

什么是X-Forwarded-For伪造?

就是服务器获取访问IP时未做严格限制,导致访问IP是可以伪造的。

漏洞成因

在这,我复制一段网上的php代码来说的更清楚一点。以下都是依据此代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function getIP() {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$realip = $_SERVER['HTTP_CLIENT_IP'];
} else {
$realip = $_SERVER['REMOTE_ADDR'];
}
return $realip;
}

echo getIP();
?>

上面这段代码获取访问IP的时候,首先判断$_SERVER["HTTP_X_FORWARDED_FOR"]是否存在,如果存在,则把这个值赋给realip,如果不存在,则再判断$_SERVER["HTTP_X_FORWARDED_FOR"]是否存在,如果存在,把该值赋给

realip,最后如果上述两个都不存在,则把$_SERVER["HTTP_X_FORWARDED_FOR"]赋给realip。最后,返回realip

在这HTTP_X_FORWARDED_FOR是可以通过修改HTTP头来重置的。

下面,我们看下下图,当没有设置$_SERVER["HTTP_X_FORWARDED_FOR"]$_SERVER["HTTP_X_FORWARDED_FOR"]时,可以从输出得知realip127.0.0.1

而当我们修改了X-Forwarded-For:localhost时,可以从输入得知,realip变成了localhost,此时,访问ip也就得到了伪造。

漏洞危害

虽然只是伪造个IP,但危害也并一定就是小,危害大小视具体情况而定,下面就简单列举几个可能产生的危害

1:当某后台不希望别人访问时,可以通过伪造IP访问该后台。

2:当某刷赞刷量的业务时,如果基于访问IP,而这个值又可以修改,那么是不是可以刷赞刷量

3:当我们前台撞库的时候,如果服务器是通过X-Forwarded-For来判断访问IP的时候,我们是不是就可以多次撞库和爆破了呢。还有等等,不多叙述。

如何修复

一切用户的输入都是有害的,所以我们要获取用户访问的真实IP。也就是用REMOTE_ADDR来获取IP。这个IP获取的是真实或者代理IP