文章目录
- sqlshark
- LearnOpenGL
- ez_msb
- OnlyLocalSql
 
sqlshark
tshark -r sqlshark.pcap -Y "http" -T fields -e frame.len -e http.file_data > data.txt
不太像常规的盲注,一次性发送两条很类似的payload,比常规的多了一个least在判断password值的最小值
Form item: "password" = "any'/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 14 fOr 1))))in(99))),1,0))#"
Form item: "password" = "any'/**/Or/**/(iF(((leAst((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 14 fOr 1))),99)in(99))),1,0))#"
其实可以直接忽略这一条,用长度判断直接去掉,随手写的乱七八糟脚本如下:
import re
import urllib.parse
with open('data.txt','r',encoding='utf-8')as file:
    lists = file.readlines()
flag=''
tmp = 1
flag_tmp = 0
for i in range(0,len(lists),2):
    match = re.search(r'(\d+)', lists[i+1])
    length = match.group(1)
    # print(length)
    payload = (urllib.parse.unquote((bytes.fromhex(lists[i].split("\t")[1])).decode())).lower()
    # print(len(payload))
    if length == "492" and len(payload)<135:
        print(payload)
        match = re.search(r'in\((\d+)\)\)', payload)
        asc = int(match.group(1))
        match = re.search(r'from\+(\d+)\+',payload)
        # print(match)
        location = int(match.group(1))
        flag+=chr(int(asc))
print(flag)     
得到的密码套个VNCTF{}就是flag了
LearnOpenGL
flag被砖块挡住了,直接用全透明图覆盖掉砖的图片
from PIL import Image
# 创建一个全透明的RGBA模式图片
img = Image.new("RGBA", (128, 128), (0, 0, 0, 0))
# 保存图片
img.save("transparent_image.png")


ez_msb
总体流程如下,在blocks_add_xx_0处将两个数据结合到一起了

照着逆就好了,打印一下振幅再加题目名其实就很明显可以看出flag.txt对应哪部分数据了
jio本:
from scipy.io import wavfile
import numpy as np
# 读取音频文件
samplerate, data = wavfile.read('out.wav')
# 将音频数据转换为浮点数类型
samples = np.array(data, dtype=float)
# 获取音频振幅
amplitudes = np.abs(samples)
amplitudes = np.abs(samples)*1000/2
# 获取整数部分
int_amplitudes = amplitudes.astype(int)
data = ''
for i in int_amplitudes[:200]:
    data += (bin(i)[2:].zfill(2))
print(data)

OnlyLocalSql
坏,被搞得怀疑人生的题目
源码:CTF-Archives/VNCTF2024-OnlyLocalSql: VNCTF2024 - Misc - OnlyLocalSql - Source Code (github.com),请给巨魔一个star!
出题人讲解https://space.bilibili.com/12949995
可以看到有个web服务,同时看源码就可以看出是不久前的西湖论剑的only_sql的源码,当然是后话了

直接访问http服务访问不通,看题目描述提到强制连接本地服务
发现本地curl是通的

因此想到使用流量转发,过ssh隧道去访问服务器的内网
彻底搞懂SSH端口转发命令 - 知乎 (zhihu.com)
Lateral Movement and Pivoting - 横向移动和枢纽 | TryHackMe CN Mirror (tryhackmyoffsecbox.github.io)
将服务器127.0.0.1的80端口转发到本地的8888端口,因此访问本地的8888端口的流量就会被通过服务器21013的ssh端口访问80端口,相当于从服务器本地进行访问
ssh -p 21013 ctf@manqiu.top -L 8888:127.0.0.1:80

成功访问到,不过这里mysql密码被改了,不是query.php里的注释密码,后面不能直接跟西湖论剑里一样去连接并命令执行
不过由于知道flag的位置/flag,并且发现/flag www-data就能读了

两种方法,一个是rogue_mysql_server项目rmb122/rogue_mysql_server: A rouge mysql server supports reading files from most mysql libraries of multiple programming languages. (github.com),伪造mysql服务,任意读文件,需要把本地的端口转发给服务器的33060,写到这里平台关了,题目docker还没启好,先留个坑迟一点填
还有一个非预期是题目权限没弄好 /var/www/html下有写权限,直接写个一句话就搞定了,反正flag不是root权限读





![洛谷 P6546 [COCI2010-2011#2] PUŽ](https://img-blog.csdnimg.cn/direct/12a133ebc48c41a48ce5a5f6574cb402.png)


![记录setData报错TypeError: [object Array] is not a function](https://img-blog.csdnimg.cn/direct/6cd3a21c7d1e474a8b762c07d8755f42.png)











