buuctf_练[MRCTF2020]Ezaudit

MRCTF2020Ezaudit

掌握知识

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

解题思路
  1. 打开题目链接,又发现是一个不错的网站界面,很多功能但都一样,源码也没有泄露的,根据题目为简单的审计,猜测有源码泄露,这样的网站多半就是网站压缩包泄露,访问www.zip还真就下载了,里面只有一个index.php文件
  1. 打开文件,简单的查看了一下,发现泄露了一个登录界面login.html,需要输入密码账户和私钥,验证通过会通过SQL语句将flag回显出来。最后给出来了公私钥生成的代码,看见了老朋友mt_rand函数 ([GWCTF 2019]枯燥的抽奖),该函数存在伪随机数漏洞,只需要得到特征值,就能使用相应工具得到随机数种子,私钥也就很容易得到了
php 复制代码
<?php 
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 "<tr><td>".$row["username"]."</td><td>".$row["flag"]."</td><td>";
        }
    }
    }

} 
// 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. 私钥的思路已经很清晰了,去寻找一下账户和密码是什么了,根据SQL语句的提示,账户为crispr,该SQL语句不存在任何过滤,是最基础的字符型SQL查询语句,密码直接使用万能密码就可以1' or 1=1 #。账密已经分析得到,就下来就去拿下私钥了
  1. 通过查看公私钥生成代码,两个代码都没有设置随机数种子,那公钥使用mt_rand函数之后,随机数种子也就会固定下来,所以公私钥的随机数种子是一样的,代码还给出了公钥,所以只需要将公钥字符串转化成特征序列,使用php_mt_seed工具进行爆破即可得到具体的随机数种子
  1. 后面的步骤和之前写的枯燥的抽奖 步骤就很相似了,同一个代码同一个工具。使用下面的python代码即可得到特征序列。str2就是生成的随机字符串 ,str1是随机字符串生成的模板,将源代码的模板复制即可
python 复制代码
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. 直接使用php_mt_seed工具对特征序列进行爆破,得到随机数种子,该随机数种子需要在php版本5.2.1 -- 7.0.x直接使用才行
  1. 找一个php在线运行的网站,可以修改php版本在上面范围的,使用源代码的公私钥生成代码,只需要在最开始添加随机数字符串即可得到私钥。因为随机字符串相邻的输出结果不一样,所以还需要按照代码中的先生成公钥才能正确得到私钥
  1. 使用分析得到的账密和生成的私钥直接登录,登录成功之后页面回显flag,直接拿下
关键paylaod
php 复制代码
随机数种子 = mt_srand(1775196155);
nuserame = crispr
password = 1' or 1=1#
私钥 = XuNhoueCDCGc
相关推荐
BingoGo1 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack1 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982072 天前
PHP 扩展——从入门到理解
php
鹏仔先生3 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
网络研究院3 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
云水一下3 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
treesforest3 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
闪闪发亮的小星星3 天前
高斯光以及高斯光公式解释
笔记