代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞

前言

今天给大家带来一篇关于emlog的代码审计文章,该漏洞属于后台sql注入,利用条件比较苛刻,用来学习代码审计思路还是挺好的

环境搭建

emlog是emlog个人开发者的一套基于PHP和Mysql的CMS建站系统。

emlog 2.1.9版本存在SQL注入漏洞,该漏洞源于文件/admin/user.php缺少对外部输入SQL语句的验证。

攻击者可利用该漏洞执行非法SQL命令窃取数据库敏感数据。

图片[1]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

emlog官网下载存在漏洞版本的源码: http://github.com/emlog/emlog/releases

图片[2]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

使用PhpStudy进行搭建,配置数据库信息,搭建完成界面如下。

图片[3]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享
图片[4]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

代码审计

根据cnvd提示,emlog 2.1.9版本存在SQL注入漏洞,该漏洞源于文件/admin/user.php缺少对外部输入SQL语句的验证。

漏洞存在于user.php,咱们先看看user用户页面,就是刚刚注册的用户

图片[5]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

使用PhpStorm打开源代码,查看user.php

大体查看一番,并没有特别明显的SQL语句,应该就是封装函数,然后通过函数直接调用的,得看看这些函数定义

这里存在变量$action,没有直接传参的地方,看见上面还有一行 require_once 'globals.php'

图片[6]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

查看globals.php文件,可以发现是用GET方式传入的action,下面的是检测登录以及权限状态的,全局调用该文件,因此未授权访问的概率很小了

图片[7]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

这里使用MySQL Monitor Client工具辅助测试,该工具可以方便我们快捷定位到刚刚访问到的数据库语句,然后定位代码

图片[8]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

这里可以看见首先调用数据库语句查询emlog_user表,并且使用uid进行降序排序,使用正则进行匹配查看代码位置

图片[9]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

可以发现这里的sql语句中存在变量,只要存在咱们可以控制的变量,大概率就会存在SQL注入,只要过滤不是很严格,咱们都可以尝试一番 

$res = $this->db->query("SELECT * FROM " . DB_PREFIX . "user where 1=1 $condition order by uid desc $limit");

查看变量$condition,可惜并没有发现咱们可以直接控制的变量,可以发现是直接从数据库中调用信息查询的,并且通过添加用户发现,用户名是随机生成的 

$condition = $limit = '';
         if ($email) {
             $condition = " and email like '$email%'";
        }
         if ($nickname) {
             $condition = " and nickname like '%$nickname%'";
        }
         if ($page) {
             $perpage_num = Option::get('admin_perpage_num');
             $startId = ($page - 1) * $perpage_num;
             $limit = "LIMIT $startId, " . $perpage_num;
        }

查看该函数的调用位置,刚好就是user.php文件,回到了提示信息处

图片[10]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

函数调用位置

图片[11]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

基本上到这个位置为止,并没有什么可以利用的地方,但是接着翻看,这里存在数据库备份的功能,会不会是这个导入备份的地址的漏洞呢,点击备份数据库,生成备份文件

图片[12]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

此时的路径为http://127.0.0.1:82/admin/data.php,即查看文件/admin/data.php

大体查看一番,导入的过程中只是检查了备份文件,并没有对SQL语句进行检查,会不会存在二次SQL注入漏洞呢,试试就知道啦 

if ($action === 'import') {
     LoginAuth::checkToken();
     $sqlfile = isset($_FILES['sqlfile']) ? $_FILES['sqlfile'] : '';
     if (!$sqlfile) {
         emMsg('非法提交的信息');
    }
     if ($sqlfile['error'] == 1) {
         emMsg('文件大小超过系统' . ini_get('upload_max_filesize') . '限制');
    } elseif ($sqlfile['error'] > 1) {
         emMsg('上传文件失败,错误码:' . $sqlfile['error']);
    }
     if (getFileSuffix($sqlfile['name']) == 'zip') {
         $ret = emUnZip($sqlfile['tmp_name'], dirname($sqlfile['tmp_name']), 'backup');
         switch ($ret) {
             case -3:
                 emDirect('./data.php?error_e=1');
                 break;
             case 1:
             case 2:
                 emDirect('./data.php?error_d=1');
                 break;
             case 3:
                 emDirect('./data.php?error_c=1');
                 break;
        }
         $sqlfile['tmp_name'] = dirname($sqlfile['tmp_name']) . '/' . str_replace('.zip', '.sql', $sqlfile['name']);
         if (!file_exists($sqlfile['tmp_name'])) {
             emMsg('只能导入emlog备份的压缩包,且不能修改压缩包文件名!');
        }
    } elseif (getFileSuffix($sqlfile['name']) != 'sql') {
         emMsg('只能导入emlog备份的SQL文件');
    }
     checkSqlFileInfo($sqlfile['tmp_name']);
     bakindata($sqlfile['tmp_name']);
     $CACHE->updateCache();
     emDirect('./data.php?active_import=1');
 }

根据存在的SQL语句,添加一个新用户,并且将用户名字段设置为SQL语句

图片[13]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

添加用户的SQL语句 

INSERT INTO emlog_user VALUES('110','anquanclub','$P$BnTaZnToynOoAVP6T/MiTsZc9ZAQNg.',(select version()),'writer','n','','123@qq.com ' , '','','0','1687261845','1687261845');

修改备份文件如下

图片[14]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

点击导入备份发现备份导入成功

图片[15]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

此时咱们查看用户类别,可以发现成功添加了咱们的新用户,并且用户名是刚刚的SQL语句,即存在二次注入漏洞

图片[16]-代码审计 | CNVD Emlog_Pro的二次SQL注入漏洞-渗透云记 - 专注于网络安全与技术分享

总结

本次代码审计并不是很难,就是备份文件的检测不完善导致的SQL二次注入,该文就是简单记录一番

感谢大家看到这里,祝大家技术蒸蒸日上,事事如意,万事顺心。

欢迎大家关注公众号:渗透云记

跟多精彩技术文章分享

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容