代码审计 | call_user_func 命令执行

文章讨论了在Nginx和PHP环境中,由于对X-Forwarded-For头验证不足导致的IP欺骗漏洞,以及call_user_func函数滥用可能引发的命令执行漏洞。作者提供了漏洞复现方法,并推荐了通过身份验证和参数验证来修复这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例代码

搭建环境:

nginx(1.24.0)+php(5.6.40)

session_start();

function client_ip(){    return !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];}

$ip = client_ip();if(!filter_var($ip, FILTER_VALIDATE_IP) || !in_array($ip, array('localhost', '127.0.0.1'))){    die(htmlspecialchars("Not allowed!\n"));}

if(!isset($_SESSION['auth'])){    header("Location: error.php");}

echo call_user_func($_GET['cmd'], $_GET['arg']);?>

请查看上述代码,找出其中的漏洞。

漏洞位置

if(!filter_var($ip, FILTER_VALIDATE_IP) || !in_array($ip, array('localhost', '127.0.0.1'))){    die(htmlspecialchars("Not allowed!\n"));}echo call_user_func($_GET['cmd'], $_GET['arg']);

漏洞原理

代码验证X-Forwarded-For标头不够严格,攻击者可以伪造X-Forwarded-For:127.0.0.1进行绕过检测。攻击者在$_session['auth']中没有有效的会话,这会自动导致重定向到另一个页面。重定向之后代码会继续向下运行,因而重定向没有任何效果,代码运行到call_user_func(),它允许执行任意的PHP代码或命令。

漏洞复现

Burpsuite抓包,更改请求包中的

X-Forwarded-For:127.0.0.1

提交参数:?cmd=exec&arg=pwd

图片

修复方案

对于

`$_SERVER['HTTP_X_FORWARDED_FOR']`伪造的问题,应该检查`$_SERVER['REMOTE_ADDR']`和`$_SERVER['HTTP_CLIENT_IP']`。然而,这仍然不能保证IP地址的完全准确,因为代理服务器可能会提供这些头部。最安全的做法可能是通过应用程序的登录过程来验证用户的身份,而不是依赖IP地址。

对于call_user_func函数造成的命令执行漏洞,需要对`$_GET['cmd']`和`$_GET['arg']`进行严格的过滤和验证。只允许执行白名单中的命令,并且只允许这些命令接受预定义的参数。对输出可以使用`htmlspecialchars()`函数来转义。

相关知识

call_user_func

call_user_func 是 PHP 中的一个函数,它用于调用由用户定义的回调函数。这个函数可以调用任何可调用的 PHP 对象,包括函数、方法、闭包等。

call_user_func 的语法如下:

call_user_func(callable $callback, ...$args)参数说明:

  • $callback:要调用的回调函数。这是一个必需参数,可以是一个函数名、方法名、闭包等。

  • ...$args:要传递给回调函数的参数列表。这是一个可选参数,你可以根据需要传递任意数量的参数。

call_user_func 函数会调用 $callback 指定的回调函数,并将传递的参数列表作为回调函数的参数。它会返回回调函数执行的结果。

作者:Spider-Man

2023年12月8日 

洞源实验室 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值