在百度或者是谷歌搜索php 获取客户端ip 搜索到的代码大致是如下:
须要把稳的是,上述的代码是存在问题的。由于对付客户端来说凡因此HTTP开头的变量都是可控的,不论是通过getenv还是通过$_SERVER办法获取。这些要求头都是可以通过要求头进行设置。方法很大略,取消个中的HTTP_,将个中的_更换为-即可,然后每个字母首字母大写即可。
如下:

而不可控的是$_SERVER['REMOTE_ADDR'],由于不是从要求头中取值。
但是如果Client-Ip和X-Forwarded-For存在值就能够担保触发漏洞了,这种漏洞紧张是涌如今cms中的sql注入中。
HTTP头注入
须要解释的是目前HTTP的头注入一样平常都是见于这种小型的cms中,像大型的cms一样平常不会涌现这样的问题。这种头注入的问题如果意识到了就十分随意马虎戒备。对付我们的白帽子来说,由于是直接从$_SERVER中进行取值,而一样平常的过滤都是针对付GPC,以是HTTP头中的数据一样平常都能够进行注入。以是这也告诫我们的程序员,很多时候直接从网上搜索的代码是不屈安的,程序员们在参考网上代码时最好是对代码进行剖析,代码不仅仅只是为了实现功能,还要看重安全。
实例解释
下面以bluecms为例进行解释。
在guest_book.php中的act为send的代码如下:
个中的sql语句中的$online_ip是在45行定义,$online_ip = getip();,跟踪进入到getip()中:include/common.fun.php
以是这是一个很明显的XFF的漏洞。
漏洞证明
在留言处,设置XFF为X-Forwarded-For: 1','content'),('', '0', '2', '1513505345', version(), 'content21')#
,如下所示:
访问guest_book.php
成功地显示出数据库的版本号。
这样的cms还有很多,如beecms,appcms。大家有兴趣可以自行地剖析以上的cms,也期待和师傅们的互换。