[投稿][原创]PHP中的HTTP的头注入漏洞浅谈
说明
在百度或者是谷歌搜索php 获取客户端ip,搜索到的代码大致是如下:
function getIp() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return ($ip);
}
需要注意的是,上述的代码是存在问题的。因为对于客户端来说凡是以HTTP开头的变量都是可控的,不论是通过getenv还是通过$_SERVER方式获取。这些请求头都是可以通过请求头进行设置。方法很简单,取消其中的HTTP_,将其中的_替换为-即可,然后每个字母首字母大写即可。
如下:
$_SERVER['HTTP_CLIENT_IP'] 对应于请求头中的Client-Ip $_SERVER['HTTP_X_FORWARDED_FOR'] 对应于请求头中的X-Forwarded-For
而不可控的是$_SERVER['REMOTE_ADDR'],因为不是从请求头中取值。
但是如果Client-Ip和X-Forwarded-For存在值就能够保证触发漏洞了,这种漏洞主要是出现在cms中的sql注入中。
HTTP头注入
需要说明的是目前HTTP的头注入一般都是见于这种小型的cms中,像大型的cms一般不会出现这样的问题。这种头注入的问题如果意识到了就十分容易防范。对于我们的白帽子来说,由于是直接从$_SERVER中进行取值,而一般的过滤都是针对于GPC,所以HTTP头中的数据一般都能够进行注入。所以这也告诫我们的程序员,很多时候直接从网上搜索的代码是不安全的,程序员们在参考网上代码时最好是对代码进行分析,代码不仅仅只是为了实现功能,还要注重安全。
实例说明
下面以bluecms为例进行说明。
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
