首页 > 安全 > 网络安全 >

360安全路由某版本固件源码中发现多处安全隐患(PHP代码逻辑)

2015-02-12

360安全路由某版本固件源码中发现多处安全隐患详细说明: *由于手头上没有360路由,暂且一切都是从代码层面上来看的。理论上漏洞是存在的。* 先用binwalk导出了360路由的固件发现其用的是php写的web模块,其中指

360安全路由某版本固件源码中发现多处安全隐患

/*

由于手头上没有360路由,暂且一切都是从代码层面上来看的。

理论上漏洞是存在的。

*/

先用binwalk导出了360路由的固件

发现其用的是php写的web模块,

其中指令的交互是与本机的5000端口进行通信实现的,

包括重启等动作。

并且验证代码存在多处漏洞

1 unserialize

在userclient的模块中,

验证用户的时候,首先通过读取cookie中的qty的值进行unserialize

所以这里存在一个潜在的威胁

```PHP
  public function GetData()
{
global $_COOKIE;

$ArrRet= Array();
$sQRT= array_key_exists( self::COOKIE_NAME, $_COOKIE ) ? $_COOKIE[ self::COOKIE_NAME ] : '';
$sQRT= trim( $sQRT );
if ( ! empty( $sQRT ) )
{
$sQRT= @ stripslashes( $sQRT );
$ArrTmp= @ unserialize( $sQRT );//存在的点
if ( is_array( $ArrTmp ) && count( $ArrTmp ) )
{
$ArrRet = $ArrTmp;
}
}

return $ArrRet;
}
  ```



2 dev_mod

360的开发者模式存在俩种判断模式

1 手动开启了开发者模式

2 HTTP_HOST=127.0.0.1

在第二种模式中 我们完全可以通过

GET http://192.168.1.1/ HTTP/1.0

Host: 127.0.0.1

这样的请求达到请求的HOST是127.0.0.1

从而绕过他对HOST的判断

```PHP
  function _is_dev_env() {
    if (defined ( '_is_dev_env_cache' )) {
        return true;
    }
    
    if (0 == strcasecmp ( '127.0.0.1', $_SERVER ['HTTP_HOST'] )) { //漏洞点
        define ( '_is_dev_env_cache', 1 );
        return true;
    }
    
    return false;
}
  ```



绕过开发者模式到底能看什么呢,就不用细说了,看下面的文件列表大概就知道了

root@kali:~/Desktop/_360_Original_0605.bin.extracted/squashfs-root# grep -n -r "IsDebug" *
grep: home: 没有那个文件或目录
www/mag/incfsmag/CMagWifi.php:28:      if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:64:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:79:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:118:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:135:  if ($this->IsDebug()) {
www/mag/incfsmag/CMagWifi.php:165:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagNetwork.php:49:if ( parent::IsDebug() ) {
www/mag/incfsmag/CMagNetwork.php:102:if ( parent::IsDebug() ) {
www/mag/incfsmag/CMagNetwork.php:149:if ( parent::IsDebug() )
www/mag/incfsmag/CMagLoginChange.php:20:  if ($this->IsDebug()) {
www/mag/incfsmag/CMagLoginChange.php:59:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagBase.php:16:  public function IsDebug() {
www/mag/incfsmag/CMagWatt.php:19:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagWatt.php:44:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagDevice.php:25:if (parent::IsDebug ()) {
www/mag/incfsmag/CMagDevice.php:91:if (parent::IsDebug ()) {
www/mag/incfsmag/CMagOptimize.php:36:        if ( parent::IsDebug() )
www/mag/incfsmag/CMagReboot.php:29:if ( parent::IsDebug() )
www/mag/incfsmag/CMagMacClone.php:20:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagMacClone.php:47:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagInfo.php:35:if ( parent::IsDebug() )
www/mag/incfsmag/CMagDeviceList.php:34:if ( parent::IsDebug() )
www/mag/incfsmag/CMagDeviceList.php:211:if ( parent::IsDebug() )
www/mag/incfsmag/CMagDeviceList.php:270:if ( parent::IsDebug() )
www/mag/incfsmag/CMagDhcp.php:23:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagDhcp.php:41:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagDhcp.php:67:    if ($this->IsDebug()) {
www/mag/incfsmag/CMagDeviceBlackList.php:14:if ($this->IsDebug ()) {
www/mag/incfsmag/CMagProtect.php:36:if ( parent::IsDebug() )
www/mag/incfsmag/CMagProtect.php:44:if ( parent::IsDebug() )
www/mag/incfsmag/CMagProtect.php:234:if ($this->IsDebug()) {
www/mag/incfsmag/CMagProtect.php:264:if ($this->IsDebug()) {
www/mag/incfsmag/CMagProtect.php:294:if ($this->IsDebug()) {
www/mag/incfsmag/CMagProtect.php:314:if ($this->IsDebug()) {
www/mag/incfsmag/CMagProtect.php:328:if ($this->IsDebug()) {
www/mag/incfsmag/CMagUpgrade.php:25:if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:35:if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:54:if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:94:if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:112:if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:133:if ($this->IsDebug ()) {
www/mag/incfsmag/CMagUpgrade.php:163:if ($this->IsDebug ()) {
www/mag/incfsmag/CDiagnose.php:13:if ( parent::IsDebug() )
www/mag/incfsmag/CMagFirstLaunch.php:22:if ($this->IsDebug()) {
www/mag/incfsmag/CMagFirstLaunch.php:40:if ($this->IsDebug()) {
www/mag/incfsmag/CMagFirstLaunch.php:52:if ($this->IsDebug()) {
www/mag/incfsmag/CMagFirstLaunch.php:125:if ($this->IsDebug()) {



3 后门or正常服务?

class CMagReboot extends CMagBase
{
const SERVER_ADDR= '127.0.0.1';
const SERVER_PORT= 5000;



基本通讯功能都是与这个端口进行通信,

暂且不知道这个端口只是单独绑定在127还是绑定在所有的网卡上的

4 修改任意配置?

我猜这个要么是手机客户端使用的,要么是web的时候ajax请求,

不管怎么说这是一个验证的错误

ajax_execute.php

$cmd = isset($_REQUEST['cmd']) ? $_REQUEST['cmd'] : "";

$skipReferCheck = (0 == strcasecmp ('isinited_start', $cmd));

if (!$skipReferCheck) {
_check_refer();//检测来路,来路是不是Luyou360.com 这个绕过不用说罢
}
//login_verify_start 
//isinited_start
// 开绿灯
$skipInitedCheck = 
(0 == strcasecmp ('login_verify_start', $cmd) 
||0 == strcasecmp ('isinited_start', $cmd) );

if (!$skipInitedCheck) {
$ajaxBase = new AjaxBase();
$ajaxIsInited = new AjaxIsInited();
$isDebug = $ajaxBase->isDebug(); 
if (!$isDebug && $ajaxIsInited->isInitedSucc()) {
echo "yyyy";
exit();
}
}
$result = null;

$ajaxMap = new AjaxMap();
try {
    $worker = $ajaxMap->Parse($cmd);//这边可以调用一些模块
    if (!empty($worker)) {
        $result = $worker['o']->execute($worker['p']);
    }
} catch (Exception $e) {}

if (empty ( $result )) {
    $result = getResultArray( SRConst::SR_ERROR_UNKNOWN );
}

header( 'Content-type: text/html; charset=utf-8' );
echo @ json_encode(is_array($result) ? $result : Array());





这里是大致可以调用的模块,但是模块的参数都是加密

很多模块哦,什么改ssid密码,拨号密码什么的

ajaxmap.php

var $cmdMap = Array(
        'login_verify_start'=> Array('c' => 'AjaxLoginVerify', 'p' => Array('cmd', 'userpwd')),
        
'islogin_start'=> Array( 'c' => 'AjaxIsLogin', 'p' => Array('cmd', 'isblock')),

'isinited_start'=> Array( 'c' => 'AjaxIsInited', 'p' => Array('cmd', 'isblock')),

'initpwd_start'=> Array( 'c' => 'AjaxInitPwd', 'p' => Array('cmd', 'userpwd','isblock')),

'dwt_start'=> Array( 'c' => 'AjaxDetectWLanType', 'p' => Array('cmd')),
'dwt_read'=> Array( 'c' => 'AjaxDetectWLanType', 'p' => Array('cmd')),

'loginpppoe_start'=> Array( 'c' => 'AjaxPPPOE', 'p' => Array('cmd', 'username', 'userpwd', 'dns_type', 'dns1', 'dns2')),//比如这个可以修改dns配置和pppoe配置
'loginpppoe_read'=> Array( 'c' => 'AjaxPPPOE', 'p' => Array('cmd')),

'loginpppoesp_start'=> Array( 'c' => 'AjaxPPPOESpecial', 'p' => Array('cmd', 'username', 'userpwd', 'dns_type', 'dns1', 'dns2', 'area')),
'loginpppoesp_read'=> Array( 'c' => 'AjaxPPPOESpecial', 'p' => Array('cmd')),

'wanstatic_start'=> Array( 'c' => 'AjaxWanStatic', 'p' => Array('cmd', 'ip', 'mask', 'gate', 'dns_type', 'dns1', 'dns2')),
'wanstatic_read'=> Array( 'c' => 'AjaxWanStatic', 'p' => Array('cmd')),

'wandhcp_start'=> Array( 'c' => 'AjaxWanDHCP', 'p' => Array('cmd', 'dns_type', 'dns1', 'dns2')),
'wandhcp_read'=> Array( 'c' => 'AjaxWanDHCP', 'p' => Array('cmd')),

'wconfig_start'=> Array( 'c' => 'AjaxConfigWLan', 'p' => Array('cmd', 'ssid', 'sspwd', 'isblock')),//比如这个可以修改ssid的名字密码

'wconfig2_start'=> Array( 'c' => 'AjaxConfigWLan2', 'p' => Array('cmd', 'ssid', 'sspwd','userpwd'))
);



大概都是这么加密的

// 解密

$primarykey = parent::getAesKeyLen16();//aes看到我就吓尿了,
$username = lib_aes_decrypt($primarykey, $username);
$password = lib_aes_decrypt($primarykey, $password);

//check params
if (empty($username) || empty($password) ||
    $dns_type < 0 || $dns_type > 2) {
return parent::getReturnJsonStruct(SRConst::SR_ERROR_PARAMETER);
}

传说中的key到手了,那我还不横着走?
CMagBase.php
 public function  getAesKeyLen16(){
return &#39;360luyou#install&#39;;
  }

解决方案:

过滤

相关文章
最新文章
热点推荐